如何获取 JSON、CSV 或其他格式的 Ansible ad-hoc 命令的输出?

问题描述 投票:0回答:4

如何以 JSON、CSV 或其他格式获取 Ansible ad-hoc 命令的输出?

linux ansible ansible-ad-hoc
4个回答
9
投票

如果您不想修改

.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


5
投票

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  }}"

2
投票

您至少需要使用 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


0
投票

以下 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[]|"    \(.)"), ""'
© www.soinside.com 2019 - 2024. All rights reserved.