ansible

Double loop Ansible


I have an object like that

objs:
    - { key1: value1, key2: [value2, value3] }
    - { key1: value4, key2: [value5, value6] }

And I'd like to create the following files

value1/value2
value1/value3
value4/value5
value4/value6

but I have no idea how to do a double loop using with_items


Solution

  • Take a look at with_subelements in Ansible's docs for loops.

    1. You need to create directories:
    2. Iterate though objs and create files:

    Here is an example:

    ---
    
    - hosts: localhost
      gather_facts: no
      vars:
        objs:
          - { key1: value1, key2: [ value2, value3] }
          - { key1: value4, key2: [ value5, value6] }
      tasks:
        - name: create directories
          file: path="{{ item.key1 }}"  state=directory
          with_items:
            objs
    
        - name: create files
          file: path="{{ item.0.key1 }}/{{ item.1 }}"  state=touch
          with_subelements:
            - objs
            - key2
    

    An output is pretty self explanatory, the second loop iterates through the values the way you need it:

    PLAY [localhost] ************************************************************** 
    
    TASK: [create files] ********************************************************** 
    changed: [localhost] => (item={'key2': ['value2', 'value3'], 'key1': 'value1'})
    changed: [localhost] => (item={'key2': ['value5', 'value6'], 'key1': 'value4'})
    
    TASK: [create files] ********************************************************** 
    changed: [localhost] => (item=({'key1': 'value1'}, 'value2'))
    changed: [localhost] => (item=({'key1': 'value1'}, 'value3'))
    changed: [localhost] => (item=({'key1': 'value4'}, 'value5'))
    changed: [localhost] => (item=({'key1': 'value4'}, 'value6'))
    
    PLAY RECAP ******************************************************************** 
    localhost                  : ok=2    changed=2    unreachable=0    failed=0