如何控制 Ansible 循环或任务的默认输出

82次阅读
没有评论

问题描述

在尝试使用 Ansible playbook 打印一些目录的易读的调试输出时遇到了困难。他在描述了使用 with_itemsloop 的方式后表示,虽然两种方式都可以工作,但真正的问题是 Ansible 自身输出每个任务的整个字典或字典列表,例如:

ok: {hostname} => "multi-line spanning string of more information than wanted"

使用循环版本时,每个任务只打印一次较长的字典列表,但每次向 mydirdict 添加新目录时需要进行修改。而 with_items 则不需要修改,但它为 mydirdict 中的每个项目都打印一次 stat 字典,不够易读。用户认为在这种情况下,这种输出并不有用,他想知道是否有一种方法可以控制这个输出。

解决方案

请注意以下操作可能会因版本差异或风险而产生变化,操作前请确保已备份数据。

在 Ansible 中,可以使用 loopwith_items 来处理循环。在用户的问题中,他已经提到了使用 with_itemsloop,但是他想要的是更易读的输出。以下是两种解决方案,一种是改进使用 with_items,另一种是改进使用 loop

方案1:改进使用 with_items

在使用 with_items 时,可以通过为任务添加一个标签(label)来改善输出。这样,输出将只包含列表中的项目和相关消息,而不是整个字典。下面是如何修改 playbook 的步骤:

  1. 为任务添加一个标签,以便在输出中使用。
  2. with_items 修改为 loop,并使用 loop_control 指定之前定义的标签。
  3. 这样就能够获得更易读的输出,只包含列表中的项目和相关消息。

以下是修改后的 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 的步骤:

  1. 为任务添加一个标签,以便在输出中使用。
  2. loop 修改为 with_items,并使用 with_items 的方式指定之前定义的列表。
  3. 这样就能够获得更易读的输出,只包含列表中的项目和相关消息。

以下是修改后的 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_controlwith_items 的方式。这将确保输出仅包含所需的项目和相关消息,不会显示整个字典或不必要的信息。

此外,如果你在 Ansible 中想要更多的控制,可以考虑使用第三方工具或 Ansible 的配置来自定义输出,以满足特定的需求。

以上就是针对用户问题的两种解决方案,根据实际情况选择适合的方法来获得更易读的输出。

正文完