Bootstrap FreeKB - Ansible - Loop through list using the with_items parameter
Ansible - Loop through list using the with_items parameter

Updated:   |  Ansible articles

The following parameters can be used to loop through each item in an array / list.

In this example, the debug module and with_items parameter are used to loop over a list of fruit (a fruit loop!).

The loop parameters will, by default, use the {{ item }} variable for each item in the list. Or, the loop_control parameter with loop_var can be used to define your own variable for each item in the list.

---
- name: main play
  hosts: localhost
  vars:
    fruits:
    - apple
    - banana
    - orange
    - grapes
  tasks:
  - name: loop through the 'fruits' list
    debug:
      var: item
    with_items: "{{ fruits }}"
...

 

Which should return the following.

ok: [localhost] => (item=apple) => {
    "item": "apple"
}
ok: [localhost] => (item=banana) => {
    "item": "banana"
}
ok: [localhost] => (item=orange) => {
    "item": "orange"
}
ok: [localhost] => (item=grapes) => {
    "item": "grapes"
}

 


with_items vs loop

Be aware that there are differences between the with_items and loop parameters. For example, the following would produce the same output as above.

- name: loop over list items
  debug: 
    var: item
  with_items:
    - [ apple, banana, orange, grapes ]

 

However, the loop parameter . . .

- name: loop over list items
  debug: 
    var: item
  loop:
    - [ apple, banana, orange, grapes ]

 

would produce the following.

TASK [loop through the 'fruit' array]
ok: [server1.example.com] => (item=['apple', 'banana', 'orange', 'grapes']) => {
    "msg": " ['apple', 'banana', 'orange', 'grapes']"
}

 


Or, sometimes it's OK to include the index number of one of the items in the list.

---
- name: main play
  hosts: localhost
  vars:
    fruits:
    - apple
    - banana
    - orange
    - grapes
  tasks:
  - name: loop through the 'fruits' list
    debug:
      var: item
    with_items: "{{ fruits[0] }}"
...

 

Or like this, without using with_items.

---
- name: main play
  hosts: localhost
  vars:
    fruits:
    - apple
    - banana
    - orange
    - grapes
  tasks:
  - name: return the item that has index 0 in the fruits list
    debug:
      var: fruits[0]
...

 

In this example, fruits[0] is the element in the fruits list that has index 0 (apple).

ok: [localhost] => (item=apple) => {
    "ansible_loop_var": "item",
    "item": "apple"
}

 


register parameter

The register parameter is store the standard output (stdout), standard error (stderr) and return code (rc) of a command. In this example, the stdout/stderr/rc of the ps command will be stored in a variable named "out". 

- name: ps command
  shell: ps
  register: out

 

Here is how you would loop over the standard out of the ps command.

- name: loop through the ps command
  debug: 
    var: item
  with_items: "{{ out.stdout_lines }}"

 

Be aware that sometimes register will have JSON that contains the results array. Notice in this example that the results array contains two items, foo and bar.

ok: [localhost] => {
    "out": {
        "results": [
            "stdout": "foo",
            "stdout": "bar"
            ]
        ]
    }
}
 

 

In this scenario, you would need to loop through the results array.

- name: loop through the ps command
  debug: 
    var: item.stdout
  with_items: "{{ ps.results }}"

 


key value pairs

In this example, the with_items is used to loop over key value pairs.

---
- hosts: localhost
  tasks:
  - debug:
      msg: "key = {{ item.key }}, value = {{ item.value }}"
    with_items:
    - { key: 'fruit', value: 'banana' }
    - { key: 'fruit', value: 'orange' }
    - { key: 'veggy', value: 'onion' }
    - { key: 'veggy', value: 'pepper' }
...

 

Which should return the following.

TASK [loop through the 'food' hash] 
ok: [localhost] => (item={u'value': u'banana', u'key': u'fruit'}) => {
    "msg": "key = fruit, value = banana"
}
ok: [localhost] => (item={u'value': u'orange', u'key': u'fruit'}) => {
    "msg": "key = fruit, value = orange"
}
ok: [localhost] => (item={u'value': u'onion', u'key': u'veggy'}) => {
    "msg": "key = veggy, value = onion"
}
ok: [localhost] => (item={u'value': u'pepper', u'key': u'veggy'}) => {
    "msg": "key = veggy, value = pepper"
}

 

As a bit more of a practical example, here is how you could create create multple files and directories using the file module using with_items.

---
- hosts: localhost
  tasks:
  - name: create multiple files and directories
    file:
      path: "{{ item.path }}"
      state: "{{ item.state }}"
    with_items:
    - { path: "/tmp/foo",             state: "directory" }
    - { path: "/tmp/bar",             state: "directory" }
    - { path: "/tmp/foo/example.txt", state: "touch" }
    - { path: "/tmp/bar/example.txt", state: "touch" }
...  



Did you find this article helpful?

If so, consider buying me a coffee over at Buy Me A Coffee



Comments


February 15 2023 by Victor Vislobokov
Thank you very much. These are good examples.

September 04 2023 by FreeHugs
I wanna know how can i print just (fruits01 and fruits02) in the output i mean the list names --- - name: main play hosts: localhost vars: fruits01: - apple - banana - orange - grapes fruits02: - apple - banana - orange - grapes

Add a Comment


Please enter ec2bf1 in the box below so that we can be sure you are a human.