Add an item to a list dependent on a conditional i

2020-04-04 17:28发布

问题:

I would like to add an item to a list in ansible dependent on some condition being met.

This doesn't work:

  some_dictionary:
    app:
       - something
       - something else
       - something conditional # only want this item when some_condition == True
         when: some_condition

I am not sure of the correct way to do this. Can I create a new task to add to the app value in the some_dictionary somehow?

回答1:

I'd try to avoid this, but if conditional list is absolutely necessary, you can use this trick:

---
- hosts: localhost
  gather_facts: no
  vars:
    a: 1
    b: 1
    c: 2
    some_dictionary:
      app: "{{ '[\"something\", \"something else\"' + (a + b == c) | ternary(', \"something conditional\"',' ') + ']' }}"
  tasks:
    - debug: var=some_dictionary.app

It will form an array-like string (["item1","item2","item3"]) and ansible variable templator will convert it into list before assigning to app.



回答2:

Is there a reason you have to do everything in one go?

This is pretty easy if you specify the additional item(s) to add in separate vars, as you can just do list1 + list2.

---
- hosts: localhost
  gather_facts: False
  connection: local
  vars:
    mylist:
      - one
      - two
    mycondition: False
    myconditionalitem: foo
  tasks:
    - debug:
        msg: "{{ mylist + [myconditionalitem] if mycondition else mylist }}"


回答3:

Based on Konstantin's solution I developed the following:

- hosts: localhost
  gather_facts: no
  vars:
    a: "{{ True if var1|d(True) else False }}"
    b: "{{ True if var2|d(False) else False }}"
    n: "{{ True if var2|d(True) else False }}"
    some_list: "{{ '[' +
                     a|ternary('\"item1\",',' ') +
                     b|ternary('\"item2\",',' ') +
                     n|ternary('\"itemN\",',' ') + ']' }}"
  tasks:
    - debug: var=some_list

This will create a list with items "item1" till "itemN", but each item is only appended if the corresponding flag expands to 'True'.

Hope, this helps.



标签: ansible