我正在尝试生成动态库存文件。我也写了一个生成json的程序。我希望能够在没有 --list 选项或其他选项的情况下调用我的程序(--list 可以在某处覆盖吗?如果无法做到这一点,是否可以仅使用 JSON 文件生成清单文件(没有带有 --list 选项的可执行文件)?这就是想法
ansible-playbook playbook.yml -i test.json
其中,JSON 文件是行动手册的清单。现在,当我尝试此方法时,我收到以下错误:
ERROR! ERROR! host range must be begin:end or begin:end:step
这是我正在使用的 json
{
"myname":{
"hosts":[
"host1.company.biz",
"host2.company.biz",
"host3.company.biz",
"host4.company.biz"
],
"vars":{
"ansible_ssh_private_key_file":"/home/keys/.ssh/id_dev",
"ansible_ssh_private_key_file":"/home/keys/.ssh/id_staging",
"ansible_ssh_private_key_file":"/home/keys/.ssh/id_staging_uk"
}
}
}
我不确定如何直接加载 json,但我知道使用 python 的解决方法。如果您有此预生成的 json 文件。你可以编写一个简单的python脚本,你可以用ansible-playbook调用它。让我们调用python文件 test.py 和json test.json。
这是我的示例剧本。
---
- name: run command on on host4
hosts: 'host4.company.biz'
vars:
foo: "{{ lookup('file', 'tmp.txt') }}"
tasks:
- debug: var=foo
这是示例 python 动态清单脚本...(确保在python脚本上chmod +x)
#!/usr/bin/env python
from json import dumps, loads
test_file = loads(open('test.json', 'r').read())
print dumps(test_file, indent=4)
ansible-playbook -i test.py -u host4.company.biz -vvvv test.yml --connection=local.
示例输出..
ok: [host4.company.biz]
TASK [debug]
*******************************************************************
task path: /home/linuxdynasty/test.yml:7
File lookup using /home/linuxdynasty/tmp.txt as file
ok: [host4.company.biz] => {
"foo": [
"1",
"2",
"3",
"4"
]
}
我使用 ansible 2.0.1 对此进行了测试