在 Ansible 的调试任务中格式化标准输出

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

假设以下任务:

- shell: "some_script.sh"
  register: "some_script_result"

- debug:
    msg: "Output: {{ some_script_result.stdout_lines }}

我收到以下输出:

"msg": "Output: [u'some_value',u'some_value2,u'some_value3]"

如何获得打印输出?

"msg":
Output:
  - some_value
  - some_value2
  - some_value3

Ansible 版本是 2.4.2。

ansible ansible-2.x
5个回答
64
投票

尝试这个选项。你一定会喜欢的。

Ansible 2.5 引入了一个新的 YAML 回调插件 - 这意味着任何运行 Ansible 2.5.0 或更高版本的机器都可以自动开始使用这种格式,而无需安装自定义插件。

要使用它,请编辑您的 ansible.cfg 文件(全局、在 /etc/ansible/ansible.cfg 中,或在本地 playbook/项目中),并在

[defaults]
部分下添加以下行:

# Use the YAML callback plugin.
stdout_callback = yaml
# Use the stdout_callback when running ad-hoc commands.
bin_ansible_callbacks = True

现在我可以轻松阅读您的输出消息

如果出现以下错误:

错误!指定的 stdout 回调无效:yaml

奔跑

ansible-galaxy collection install community.general

6
投票

到目前为止,我发现在 Ansible 中获得类似 CLI 的输出最有效,而且应该开箱即用(至少对我来说在 Fedora 34、Ansible 2.9 上)是设置

stdout_callback = unixy
bin_ansible_callbacks = True

在你的

ansible.cfg
。给定任务

  tasks:
    - name: uptime
      shell: uptime
    - name: volumes
      shell: "df -h"

终端中的输出将如下所示

- all on hosts: all -
uptime...
  host1 done | stdout:  08:20:09 up 33 min,  1 user,  load average: 0.55, 0.27, 0.26
  host2 done | stdout:  08:20:09 up 1 day,  1:39,  1 user,  load average: 0.18, 0.17, 0.17

volumes...
  host1 done | stdout: Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.2G  1.5G  5.4G  21% /overlay/pivot
devtmpfs        212M     0  212M   0% /dev
none            217M     0  217M   0% /overlay/pivot/overlay
none            217M  137M   80M  64% /overlay/rwdata
overlay         217M  137M   80M  64% /
tmpfs           217M     0  217M   0% /dev/shm
tmpfs           217M   25M  192M  12% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           217M     0  217M   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   53M  200M  21% /boot
tmpfs            44M     0   44M   0% /run/user/1000
  host2 done | stdout: Filesystem      Size  Used Avail Use% Mounted on
/dev/root       7.2G  1.5G  5.4G  22% /overlay/pivot
devtmpfs        212M     0  212M   0% /dev
none            217M     0  217M   0% /overlay/pivot/overlay
none            217M  103M  114M  48% /overlay/rwdata
overlay         217M  103M  114M  48% /
tmpfs           217M     0  217M   0% /dev/shm
tmpfs           217M  5.8M  211M   3% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           217M     0  217M   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   53M  200M  21% /boot
tmpfs            44M     0   44M   0% /run/user/1000


- Play recap -
  host1           : ok=1    changed=1    unreachable=0    failed=0    rescued=0    ignored=0   
  host2           : ok=1    changed=1    unreachable=0    failed=0    rescued=0    ignored=0   

您应该能够使用

ansible-doc -t callback -l
列出所有可用的回调插件,并使用
ansible-doc -t callback <plugin name>

列出它们各自的文档

源文档:https://docs.ansible.com/ansible/2.9/plugins/callback.html


3
投票

这是错误报告:

https://github.com/ansible/ansible/issues/27078 - 为什么 ansible 的默认输出不更具人类可读性...还是?

可能的答案:

[defaults]
nocows = True
# minimal, debug, yaml
stdout_callback = yaml

或:

ANSIBLE_STDOUT_CALLBACK=debug ansible-playbook ....

2
投票

另一种选择:

https://blog.alexgittings.com/improving-the-ansible-output-with-anstomlog/

只需将其存储在 ansible/ansible.cfg 中

➜ tree ansible     
ansible
├── ansible.cfg
├── callbacks
│   ├── anstomlog.py
└── playbooks
    └── nginx.yaml

ANSIBLE_CONFIG=ansible/ansible.cfg ansible-playbook -u centos --private-key .ssh/key -i `terraform output bastion_ip`, ansible/playbooks/nginx.yaml


0
投票

我正在尝试进行以下更改,但仍然没有正确获得 yaml 的输出格式或调试选项输出。后来我发现 ansible 用户配置从用户的配置文件中获取它。所以我改变了用户特定位置的回调并且它起作用了。

[automation@ansibleserver ~]$ ansible --version
   ansible 2.9.9
   config file = /home/automation/ansible.cfg


# Use the YAML callback plugin.
   stdout_callback = yaml
# Use the stdout_callback when running ad-hoc commands.
bin_ansible_callbacks = True

因此请确保,即使您更改了 /etc/ansible/ansible.conf ,也要尝试用户的配置文件以获得良好的结果。除了 yaml 之外,debug 还提供了很好的有用格式(对于 Linux 用户)

© www.soinside.com 2019 - 2024. All rights reserved.