Ответ на ваш вопрос заключается в использовании механизма динамического инвентаризации , и оттуда вы можете использовать любой язык программирования, который вам нравится, включая 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
и выедем на скачки