使用Consul KV商店获取库存详细信息吗?

时间:2019-06-17 14:50:22

标签: ansible ansible-inventory

是否可以在运行时使用Consul的KV信息填充清单?

我想在运行ansible-playbook时从领事那里获取KV信息,以使用主持人和角色分配来填充清单。 由于consul_kv是一个查找插件,因此我假设它不适用于库存(至少在我简短测试它时::))。

基本思想是使用--extra-vars并提供主机名,然后从那里获取Consul的信息。

只需知道是否可以使用内置函数(如果需要,则可以使用哪种插件,如果需要的话)或某种解决方法是唯一的方法。例如。在运行剧本之前,请通过脚本创建清单/角色文件。

2 个答案:

答案 0 :(得分:0)

问题的答案是使用dynamic inventory机制,然后您可以使用所需的任何编程语言,包括bash并调用领事CLI来运行所需的任何查询。只要输出是ansible期望的JSON,该合同就被明确定义。

但是,我实际上很好奇进入ansible并利用现有的consul_kv会很困难,因为它已经实现了,并且无论您在哪里使用ansible,它似乎都可以使用等等。

答案似乎“不是很困难”(这里我使用dig查找是因为我没有consulpython-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}}