是否可以在运行时使用Consul的KV信息填充清单?
我想在运行ansible-playbook时从领事那里获取KV信息,以使用主持人和角色分配来填充清单。 由于consul_kv是一个查找插件,因此我假设它不适用于库存(至少在我简短测试它时::))。
基本思想是使用--extra-vars并提供主机名,然后从那里获取Consul的信息。
只需知道是否可以使用内置函数(如果需要,则可以使用哪种插件,如果需要的话)或某种解决方法是唯一的方法。例如。在运行剧本之前,请通过脚本创建清单/角色文件。
答案 0 :(得分:0)
问题的答案是使用dynamic inventory机制,然后您可以使用所需的任何编程语言,包括bash
并调用领事CLI来运行所需的任何查询。只要输出是ansible期望的JSON,该合同就被明确定义。
但是,我实际上很好奇进入ansible并利用现有的consul_kv
会很困难,因为它已经实现了,并且无论您在哪里使用ansible,它似乎都可以使用等等。
答案似乎“不是很困难”(这里我使用dig
查找是因为我没有consul
或python-consul
可以测试,但是{ {1}}会达到我们的目的):
dig
如果将其放在文件#! /usr/bin/env python
# coding=utf-8
import json
import sys
from ansible.parsing.dataloader import DataLoader
from ansible.plugins.loader import lookup_loader
dl = DataLoader()
dig_lu = lookup_loader.get("dig", loader=dl)
ips = dig_lu.run(["stackoverflow.com."], variables={}) # type: List[str]
hv = {
'host{}'.format(idx): {"ansible_host": n}
for idx, n in enumerate(ips)
}
results = {
"_meta": {
"hostvars": hv,
},
"all": {
"hosts": list(hv.keys()),
},
}
json.dump(results, sys.stdout)
中,使其可以用my_lookup.py
执行,并使用chmod 755 my_lookup.py
检查其输出以确保您和ansible位于同一页面上,则可以将其用作广告资源ansible-inventory -i ./my_lookup.py --list
,您就可以参加比赛了
答案 1 :(得分:0)
我仍然认为动态库存是您问题的最正确答案,但是如果我严格回答您所提出的问题,那么您将希望使用add_host:
来完成操作您描述了:
- hosts: localhost
connection: local
gather_facts: no
tasks:
- add_host:
name: '{{ item }}'
groups:
- consul_hosts
with_consul_kv:
- the/awesome/key/here/{{ and_jinja2_vars }}/or-whatever
- hosts: consul_hosts
tasks:
- debug:
msg: hello from {{ansible_host}}