我对 Ansible 还不太熟悉,所以请耐心等待。我正在尝试想出一种优雅的方式来填充列表。有些项目应该无条件地出现在列表中,例如 item1。如果满足“当”条件,其中一些将被添加到列表中。到目前为止,我得到了这个,但它不起作用,我假设它只是用 item2 和 3 覆盖了 item1。此外,您添加的项目越多,它看起来就越难看。有没有人有条件地填充 ansible 列表的经验?
- name: Add items to list
set_fact:
items_list: ["item1"]
with_items:
- item2
when:
- condition1 is defined
- condition3 is defined
- item3
when:
- condition 4 is defined
答案1
- set_fact:
items_list: "{{ items_list | default(['item1']) + [item] }}"
loop:
- "{{ (True and True) | ternary('item2', None) }}"
- "{{ (True) | ternary('item3', None) }}"
when: item
- debug: var=items_list
或者
- set_fact:
items_list: "{{ items_list | default(['item1']) + [item] }}"
loop:
- "item2"
- "item3"
when: >-
(item == "item2" and True and True) or
(item == "item3" and True)
- debug: var=items_list
答案2
用例是,如果某些变量定义最好的结构是字典,例如
d1:
item1:
l: []
item2:
l: [condition1, condition3]
item3:
l: [condition4]
如果变量条件4已定义,但其他的不是下面的任务
- set_fact:
items_list: "{{ items_list|default([]) + [item.key] }}"
loop: "{{ d1|dict2items }}"
when: _vals|from_yaml is all
vars:
_vals: |
[
{% for i in item.value.l %}
{{ vars[i] is defined }},
{% endfor %}
]
给出
items_list:
- item1
- item3