Andrew Ramnikov
Andrew Ramnikov

Reputation: 793

How to loop over a dictionary in Ansible

I have a following dictionary in default/main.yml

servers_as:
  ABxxxxx1:
    - server1-WASN_xcv_02.service
    - server2-WASN_xcv_01.service
    - server2-WASN_xcv_02.service
  CBxxxx2:
    - server1-abcd_02.service
    - server1-abcd_03.service
    - server2-abcd_01.service
    - server2-abcd_02.service
    - server2-abcd_03.service

I have tried to output each value with length, but it just gave me the last value. How can i run it from 0-(servers_as | legnth )

- name: check output list
  debug:
    msg:  "{{ item.value[ lookup('dict', servers_as) | length] }}"
  loop:  "{{ lookup('dict', servers_as) }}"
  when:
    - "item.key in inventory_hostname"

Expected output is the name of each value in order to start services:

- name: Start all services 
 systemd:
   name: "{{ item.value }}.service"
   state: started
 loop:  "{{ lookup('dict', servers_as) }}"
 when:
   - "item.key in inventory_hostname"

Upvotes: 2

Views: 3851

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 67959

As a hint on how to iterate the lists

    - name: Start all services
      debug:
        msg: "Start {{ item }}"
      loop: "{{ servers_as[inventory_hostname]|d([]) }}"

gives

ok: [ABxxxx1] => (item=server1-WASN_xcv_02.service) => 
  msg: Start server1-WASN_xcv_02.service
ok: [ABxxxx1] => (item=server2-WASN_xcv_01.service) => 
  msg: Start server2-WASN_xcv_01.service
ok: [ABxxxx1] => (item=server2-WASN_xcv_02.service) => 
  msg: Start server2-WASN_xcv_02.service
ok: [CBxxxx2] => (item=server1-abcd_02.service) => 
  msg: Start server1-abcd_02.service
ok: [CBxxxx2] => (item=server1-abcd_03.service) => 
  msg: Start server1-abcd_03.service
ok: [CBxxxx2] => (item=server2-abcd_01.service) => 
  msg: Start server2-abcd_01.service
ok: [CBxxxx2] => (item=server2-abcd_02.service) => 
  msg: Start server2-abcd_02.service
ok: [CBxxxx2] => (item=server2-abcd_03.service) => 
  msg: Start server2-abcd_03.service

If this is what you want, use systemd instead of debug

    - name: Start all services
      systemd:
        name: "{{ item }}"
        state: started
      loop: "{{ servers_as[inventory_hostname]|d([]) }}"

Upvotes: 3

Related Questions