Add an item to a list dependent on a conditional in ansible

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 }}"

You can filter out all falsey values with select(), but remember to apply the list() filter afterwards. This seems an easier and more readable approach for me:

- name: Test
  hosts: localhost
  gather_facts: no
  vars:
      mylist:
        - "{{ (true)  | ternary('a','') }}"
        - "{{ (false) | ternary('b','') }}"
        - "{{ (true)  | ternary('c','') }}"
 
  tasks:
  - debug:
      var: mylist|select|list

Result:

TASK [debug] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "mylist|select()|list": [
        "a", 
        "c"
    ]
}

Replace (true) and (false) with whatever test you want.


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.

Tags:

Ansible