Ansible:有条件地附加到列表

Ansible:有条件地附加到列表

我对 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

相关内容