在 Ansible 中,获取循环中唯一的值并使用 register 注册可以通过以下方法实现:
设置一个变量来保存已经处理过的值,然后在循环中检查当前值是否已经存在于已处理列表中。
使用 Ansible 内置的 JINJA2 过滤器来获取唯一值。例如,可以使用 filter_unique 过滤器来获取循环列表中的唯一值。
下面是第一种方法的代码示例:
vars:
processed_items: []
tasks:
- name: Get unique value in loop
command: "{{ item }}"
with_items:
- item1
- item2
- item3
- item1
- item2
when: item not in processed_items
register: unique_item
vars:
processed_items: "{{ processed_items + [item] }}"
在上面的示例中,processed_items 变量用于存储已处理的值。在循环中,使用 when 条件语句来检查当前值是否已经存在于 processed_items 列表中,如果不存在则将其添加到 processed_items 中并注册到 unique_item 变量中。
下面是第二种方法的代码示例:
tasks:
- name: Get unique value in loop
command: "{{ item }}"
with_items:
- item1
- item2
- item3
- item1
- item2
register: unique_item
vars:
unique_items: "{{ unique_item.results | map(attribute='stdout') | unique | list }}"
在上面的示例中,使用 unique 过滤器来获取循环列表中的唯一值,并在结果中注册为 unique_item 变量。然后使用 map 过滤器和 attribute('stdout') 方法来提取所有结果的 stdout 属性,并再次使用 unique 过滤器来获取唯一值。最终的唯一列表存储在 unique_items 变量中。