问题描述
在尝试使用 Ansible playbook 打印一些目录的易读的调试输出时遇到了困难。他在描述了使用 with_items
和 loop
的方式后表示,虽然两种方式都可以工作,但真正的问题是 Ansible 自身输出每个任务的整个字典或字典列表,例如:
ok: {hostname} => "multi-line spanning string of more information than wanted"
使用循环版本时,每个任务只打印一次较长的字典列表,但每次向 mydirdict
添加新目录时需要进行修改。而 with_items
则不需要修改,但它为 mydirdict
中的每个项目都打印一次 stat 字典,不够易读。用户认为在这种情况下,这种输出并不有用,他想知道是否有一种方法可以控制这个输出。
解决方案
请注意以下操作可能会因版本差异或风险而产生变化,操作前请确保已备份数据。
在 Ansible 中,可以使用 loop
和 with_items
来处理循环。在用户的问题中,他已经提到了使用 with_items
和 loop
,但是他想要的是更易读的输出。以下是两种解决方案,一种是改进使用 with_items
,另一种是改进使用 loop
。
方案1:改进使用 with_items
在使用 with_items
时,可以通过为任务添加一个标签(label)来改善输出。这样,输出将只包含列表中的项目和相关消息,而不是整个字典。下面是如何修改 playbook 的步骤:
- 为任务添加一个标签,以便在输出中使用。
- 将
with_items
修改为loop
,并使用loop_control
指定之前定义的标签。 - 这样就能够获得更易读的输出,只包含列表中的项目和相关消息。
以下是修改后的 Ansible playbook 示例:
vars:
mydirdict:
- { id: 1, name: /tmp/foo }
- { id: 2, name: /tmp/bar }
tasks:
- name: check dirs
stat:
path: "{{ item.name }}"
loop: "{{ mydirdict }}"
register: stats
loop_control:
label: "{{ item.name }}"
- name: check dir stat debug
debug:
msg:
- "path {{ item.item.name }} exists? {{ item.stat.exists }}"
loop: "{{ stats.results }}"
这样修改后的 playbook 将在输出中只显示项目名称和相关消息,使输出更易读。
方案2:改进使用 loop
在使用 loop
时,也可以通过在任务中添加标签来改善输出。这样,输出将只包含列表中的项目和相关消息,而不是整个字典。下面是如何修改 playbook 的步骤:
- 为任务添加一个标签,以便在输出中使用。
- 将
loop
修改为with_items
,并使用with_items
的方式指定之前定义的列表。 - 这样就能够获得更易读的输出,只包含列表中的项目和相关消息。
以下是修改后的 Ansible playbook 示例:
vars:
mydirdict:
- { id: 1, name: /tmp/foo }
- { id: 2, name: /tmp/bar }
tasks:
- name: check dirs
stat:
path: "{{ item.name }}"
with_items: "{{ mydirdict }}"
register: stats
- name: check dir stat debug
debug:
msg:
- "path {{ item[0].item.name }} exists? {{ item[0].stat.exists }}"
- "path {{ item[1].item.name }} exists? {{ item[1].stat.exists }}"
with_items:
- "{{ stats.results }}"
这样修改后的 playbook 将在输出中只显示项目名称和相关消息,使输出更易读。
注意事项
在以上两种方案中,通过添加标签来改善输出的关键是 loop_control
或 with_items
的方式。这将确保输出仅包含所需的项目和相关消息,不会显示整个字典或不必要的信息。
此外,如果你在 Ansible 中想要更多的控制,可以考虑使用第三方工具或 Ansible 的配置来自定义输出,以满足特定的需求。
以上就是针对用户问题的两种解决方案,根据实际情况选择适合的方法来获得更易读的输出。