我想编写一个 Python 程序,它使用 Ansible 为我提供的事实ansible HOST -m setup
。
当我调用它时,我得到一个响应,它几乎只是纯 JSON:
$ ansible localhost -m setup
localhost | success >> {
// actual data
}
有什么方法可以直接获取这个 JSON 响应而不解析 shell 输出(可能不太稳定)?我什至可以在 Python 3 程序中直接使用 Ansible 吗?
我想编写一个 Python 程序,它使用 Ansible 为我提供的事实ansible HOST -m setup
。
当我调用它时,我得到一个响应,它几乎只是纯 JSON:
$ ansible localhost -m setup
localhost | success >> {
// actual data
}
有什么方法可以直接获取这个 JSON 响应而不解析 shell 输出(可能不太稳定)?我什至可以在 Python 3 程序中直接使用 Ansible 吗?
2.2、2.3 和 2.4 的最新 ansible 版本都支持ANSIBLE_STDOUT_CALLBACK
变量。要使用它,您需要添加一个ansible.cfg
如下所示的文件:
[defaults]
bin_ansible_callbacks = True
callback_plugins = ~/.ansible/callback_plugins
你可以把它放在你使用 ansible 的任何地方。然后,您需要创建callback_plugins
目录(如果尚未创建)。最后,您需要在目录中添加自定义 json 解析器。我将与 ansible 捆绑在一起的 json 解析器复制到callback_plugins
目录中,然后在其中编辑了一行以使其工作。
我json.py
通过首先执行找到了该文件ansible --version
$ ansible --version
ansible 2.4.0.0
config file = /Users/artburkart/Code/ansible.cfg
configured module search path = [u'/Users/artburkart/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/local/lib/python2.7/site-packages/ansible
executable location = /usr/local/bin/ansible
python version = 2.7.13 (default, Jul 18 2017, 09:17:00) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)]
然后使用“ansible python 模块位置”找到json.py
.
cp /usr/local/lib/python2.7/site-packages/ansible/plugins/callback/json.py ~/.ansible/callback_plugins/
最后,我v2_runner_on_ok
将文件中的函数编辑json.py
为如下所示(由 GitHub 上的 armab 提供):
def v2_runner_on_ok(self, result, **kwargs):
host = result._host
self.results[-1]['tasks'][-1]['hosts'][host.name] = result._result
print(json.dumps({host.name: result._result}, indent=4))
设置完成后,命令非常简单:
ANSIBLE_STDOUT_CALLBACK=json ansible all -i localhost, -c local -m setup | jq
如果您总是想解析 JSON 输出,可以将以下行添加到ansible.cfg
我上面描述的文件末尾。
stdout_callback = json
这样,您不再需要包含环境变量。
查询实例时,我使用以下命令:
ansible all --inventory 127.0.0.1, --connection local --module-name setup | sed '1 s/^.*|.*=>.*$/{/g'
如果jq
按照leucos的建议将输出通过管道传输到 ,它会愉快地解析半有效的 JSON。例如:
ansible all -i hosts -m setup | sed '1 s/^.*|.*=>.*$/{/g' | jq -r '.ansible_facts.ansible_distribution'
CentOS
Ubuntu
如果 Python2 适合你,你可以直接使用 Ansible API。您可以在此处找到详细说明:http: //docs.ansible.com/developing_api.html 这真的很简单。
另一种以 shell 为中心的方式是使用 jq。这里有一个快速介绍:http: //xmodulo.com/how-to-parse-json-string-via-command-line-on-linux.html