可以使用 Consul KV store 获取库存详细信息吗?
Using Consul KV store for inventory details, possible?
是否可以在运行时使用来自 Consul 的 KV 信息来填充清单?
我想在 运行ansible-playbooks 时从 Consul 中提取 KV 信息,以使用主机和角色分配填充清单。
由于 consul_kv 是一个查找插件,我假设它不适用于库存(至少当我简单测试它时它不起作用 :))。
基本思路是使用 --extra-vars 并提供主机名,然后从那里提取来自 Consul 的信息。
只需要知道是否可以使用内置函数(如果可以的话,如果需要,哪些插件是合适的)或者某种解决方法是否是唯一的方法。例如。在 运行 剧本之前通过脚本创建 inventory/role 文件。
你的问题的答案是使用 dynamic inventory 机制,从那里你可以使用你喜欢的任何编程语言,包括 bash
并调用 consul CLI 到 运行 任何你想要的查询。只要输出是 ansible 期望的 JSON,该合同就是 well-defined.
然而,我实际上很好奇进入 ansible 并利用现有的 consul_kv
有多难,因为它已经实现,无论你有 ansible 什么地方都可以使用,你似乎想要使用它等等。
答案似乎是 "not very hard"(这里我使用 dig
查找,因为我没有 consul
或 python-consul
可用于测试,但 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(["whosebug.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-inventory -i ./my_lookup.py --list
检查它的输出以确保你和 ansible 在同一页面上,然后您可以将其用作库存来源 ansible -i ./my_lookup.py -m setup all
并且您可以参加比赛
我仍然认为动态清单是最正确回答你的问题,但如果我严格只回答你问的那个,那么你会想要使用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}}
是否可以在运行时使用来自 Consul 的 KV 信息来填充清单?
我想在 运行ansible-playbooks 时从 Consul 中提取 KV 信息,以使用主机和角色分配填充清单。 由于 consul_kv 是一个查找插件,我假设它不适用于库存(至少当我简单测试它时它不起作用 :))。
基本思路是使用 --extra-vars 并提供主机名,然后从那里提取来自 Consul 的信息。
只需要知道是否可以使用内置函数(如果可以的话,如果需要,哪些插件是合适的)或者某种解决方法是否是唯一的方法。例如。在 运行 剧本之前通过脚本创建 inventory/role 文件。
你的问题的答案是使用 dynamic inventory 机制,从那里你可以使用你喜欢的任何编程语言,包括 bash
并调用 consul CLI 到 运行 任何你想要的查询。只要输出是 ansible 期望的 JSON,该合同就是 well-defined.
然而,我实际上很好奇进入 ansible 并利用现有的 consul_kv
有多难,因为它已经实现,无论你有 ansible 什么地方都可以使用,你似乎想要使用它等等。
答案似乎是 "not very hard"(这里我使用 dig
查找,因为我没有 consul
或 python-consul
可用于测试,但 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(["whosebug.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-inventory -i ./my_lookup.py --list
检查它的输出以确保你和 ansible 在同一页面上,然后您可以将其用作库存来源 ansible -i ./my_lookup.py -m setup all
并且您可以参加比赛
我仍然认为动态清单是最正确回答你的问题,但如果我严格只回答你问的那个,那么你会想要使用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}}