Для того чтобы динамически извлекать хосты, например из амазона, надо создать выполняемый файл, который принимает параметры
—hosts=<hostname> — информация о хостах
—list — информация о группах
Так выводится должна информация о хосте, в формате json
dynamic.py --host=vagrant2 {"ansible_ssh_host": "127.0.0.1", "ansible_ssh_port": 2200, "ansible_ssh_user": "vagrant" }
Так должна выводиться информация о группах
{ "vagrant": [ "vagrant1", "vagrant2" ], ... }
Пример динамических хостов для vagrant
#!/usr/bin/env python import paramiko import json import argparse import subprocess import sys def parse_args(): parser = argparse.ArgumentParser(description="Vagrant inventory script") group = parser.add_mutually_exclusive_group(required=True) group.add_argument('--list', action='store_true') group.add_argument('--hosts') return parser.parse_args() def list_running_hosts(): command = "vagrant status --machine-readable" status = subprocess.check_output(command.split()).rstrip() hosts = [] for line in status.split('\n'): line = line.split(',') if len(line) == 4: (_, host, key, value) = line if key == 'state' and value == 'running': hosts.append(host) return hosts def host_details(host): command = "vagrant ssh-config {}".format(host) p = subprocess.Popen(command.split(), stdout=subprocess.PIPE) config = paramiko.SSHConfig() config.parse(p.stdout) c = config.lookup(host) return { 'ansible_ssh_host': c['hostname'], 'ansible_ssh_port': c['port'], 'ansible_ssh_user': c['user'], 'ansible_ssh_private_key_file': c['identityfile'][0] } def main(): args = parse_args() if args.list: hosts = list_running_hosts() json.dump({'vagrant': hosts}, sys.stdout) else: details = host_details(args.hosts) #print(details) json.dump(details, sys.stdout) if __name__ == '__main__': main()
0 Comment