如何以 JSON、CSV 或其他格式获取 Ansible ad-hoc 命令的输出?
如果您不想修改
.cfg
文件,也可以通过环境变量来完成,例如:
ANSIBLE_LOAD_CALLBACK_PLUGINS=true \
ANSIBLE_STDOUT_CALLBACK=json \
ansible all \
-a "df -h /tmp"
有关 Ansible 环境变量的更多信息: https://docs.ansible.com/ansible/latest/reference_appendices/config.html#environment-variables。
在
ansible.cfg
中添加:
[defaults]
stdout_callback = json
参见文档
而不是这个:
ok: [localhost] => {
"msg": "test"
}
您将拥有:
{
"plays": [
{
"play": {
"id": "720000f8-9450-586c-9a68-000000000005",
"name": "Json Test"
},
"tasks": [
{
"hosts": {
"localhost": {
"_ansible_no_log": false,
"_ansible_verbose_always": true,
"changed": false,
"msg": "test"
}
},
"task": {
"id": "720000f8-9450-586c-9a68-000000000007",
"name": "Debug"
}
}
]
}
],
"stats": {
"localhost": {
"changed": 0,
"failures": 0,
"ok": 1,
"skipped": 0,
"unreachable": 0
}
}
}
对于以下剧本:
---
- name: Json Test
hosts: localhost
gather_facts: False
vars:
test: test
tasks:
- name: Debug
debug:
msg: "{{ test }}"
您至少需要使用 Ansible 2.5
然后在你的 ansible 配置中设置它:
stdout_callback = json
bin_ansible_callbacks = True
关于 ansible 配置的快速说明(抱怨?)...配置文件不是附加的。 如果您有多个配置文件(例如 /etc/ansible/ansible.cfg 和 ~/.ansible.cfg),它只会从 ~/.ansible 中获取值。
这是配置文件顺序:
https://docs.ansible.com/ansible/latest/reference_appendices/config.html#the-configuration-file
这是错误:
https://github.com/ansible/ansible/issues/17914
这里还有完整的回调插件列表:
https://docs.ansible.com/ansible/2.6/plugins/callback.html#plugin-list
以下 Ansible ad-hoc 命令在每个主机上运行 shell 命令,输出 JSON,并使用
jq
处理 JSON,以创建一个 Markdown 报告,其中包含每个主机的一个部分,包括显示主机名的标题和显示预格式化的正文该主机的命令输出。每个部分的标题是 $TITLE on $host
,其中 TITLE
作为参数传递给 jq,host
是主机名。
ANSIBLE_LOAD_CALLBACK_PLUGINS=1 \
ANSIBLE_STDOUT_CALLBACK=json \
ansible \
'all' \
--become --become-method=sudo \
-m shell \
-a "crontab -uroot -l | grep -v '^ *$'" \
| jq -r \
--arg TITLE "Root crontab" \
'.plays[].tasks[].hosts|to_entries|.[]|
"# \($TITLE) on \(.key)", (.value.stdout_lines[]|" \(.)"), ""'