繁体   English   中英

试图在python中为ansible创建一个动态主机文件

[英]Trying to make a dynamic host file for ansible in python

这是我在这里发表的第一篇文章,所以如果有任何问题或者有些事情是不明白的,请不要犹豫。

我正在尝试使用动态主机文件,因此我可以构建多个vagrant机器而无需先管理主机文件。 这是我在网上找到的:

    #!/usr/bin/env python
# Adapted from Mark Mandel's implementation
# https://github.com/ansible/ansible/blob/devel/plugins/inventory/vagrant.py
import argparse
import json
import paramiko
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('--host')
    return parser.parse_args()


def list_running_hosts():
    cmd = "vagrant status --machine-readable"
    status = subprocess.check_output(cmd.split()).rstrip()
    hosts = []
    for line in status.split('\n'):
        (_, host, key, value) = line.split(',')
        if key == 'state' and value == 'running':
            hosts.append(host)
    return hosts


def get_host_details(host):
    cmd = "vagrant ssh-config {}".format(host)
    p = subprocess.Popen(cmd.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 = get_host_details(args.host)
        json.dump(details, sys.stdout)

if __name__ == '__main__':
    main()

但是,当我运行它时,我收到以下错误:

ERROR! The file inventory/vagrant.py is marked as executable, but failed to execute correctly. If this is not supposed to be an executable script, correct this with `chmod -x inventory/vagrant.py`.
ERROR! Inventory script (inventory/vagrant.py) had an execution error: Traceback (most recent call last):
  File "/home/sebas/Desktop/playbooks/inventory/vagrant.py", line 52, in <module>
    main()
  File "/home/sebas/Desktop/playbooks/inventory/vagrant.py", line 45, in main
    hosts = list_running_hosts()
  File "/home/sebas/Desktop/playbooks/inventory/vagrant.py", line 24, in list_running_hosts
    (_, host, key, value) = line.split(',')
ValueError: too many values to unpack

ERROR! inventory/vagrant.py:4: Expected key=value host variable assignment, got: argparse

有谁知道我做错了什么? 提前谢谢你们!

我想问题是vagrant status命令只能在带有Vagrantfile的目录中工作,或者如果指定了目标机器的ID。

要获取系统上所有活动Vagrant环境vagrant global-status应使用vagrant global-status 但全局状态有一个缺点:它使用缓存而不主动验证机器的状态。

因此,为了可靠地确定状态,首先我们需要获取具有vagrant global-status的所有VM的ID,然后使用vagrant status ID检查这些vagrant status ID

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM