可以使用 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 查找,因为我没有 consulpython-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}}