Можно использовать магазин Consul KV для инвентаризации, возможно? - PullRequest
0 голосов
/ 17 июня 2019

Можно ли использовать информацию KV от Consul для заполнения инвентаря во время выполнения?

Я хотел бы получить информацию KV от Consul при запуске ansible-playbooks, чтобы заполнить инвентарь назначением хоста и роли.Так как consul_kv - это поисковый плагин, я предполагаю, что он не работает для инвентаря (по крайней мере, он не работает, когда я его кратко протестировал :)).

Основная идея - использовать --extra-varsи введите имя хоста и оттуда извлеките информацию из Consul.

Просто нужно знать, возможно ли использование встроенных функций (если да, то какие плагины были бы уместны, если необходимо) или есть какой-то обходной путьединственный способ.Например, создайте файлы инвентаризации / роли с помощью сценария перед запуском книги воспроизведения.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Я все еще думаю, что динамический инвентарь - это самый правильный ответ на ваш вопрос, но если я строго отвечу только на тот вопрос, который вы задали, вы захотите использовать 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}}
0 голосов
/ 18 июня 2019

Ответ на ваш вопрос заключается в использовании механизма динамического инвентаризации , и оттуда вы можете использовать любой язык программирования, который вам нравится, включая bash и вызывать CLI консула для выполнения любых запросов, которые вы запрашиваете.хочу.Пока выводом является JSON, который ожидает ansible, этот контракт четко определен.

Однако мне было действительно любопытно, как трудно будет охватить ansible и воспользоваться преимуществами существующего consul_kvпоскольку он уже реализован, уже будет доступен везде, где у вас есть ответ, вы, кажется, хотите его использовать и т. д.

И ответ кажется «не очень сложным» (здесь я используюпоиск 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(["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-inventory -i ./my_lookup.py --list, чтобы убедиться, что вы и ansible находитесь на одной странице, затем вы можете использовать его как источник инвентаризации ansible -i ./my_lookup.py -m setup all и выедем на скачки

...