Home > Software design >  How to use ansible-playbook in a nested for loop?
How to use ansible-playbook in a nested for loop?

Time:10-14

I am trying to write a script that will automatically reboot servers in our environment. We are using ansible-playbook -i rebootlist reboot.yml for rebooting 100 servers at a time as we have around 400 servers and its needs to reboot in a order. So, i came up with this:

for j in $(cat rebootlist); do for k in $(cat $j); do ansible-playbook -i $k reboot.yml  >> $output; done; done

here,

rebootlist has 4 list of 100 servers.

$ cat rebootlist
reboot00
reboot02
reboot03
reboot04

I am getting this warning below

[WARNING]: No inventory was parsed, only implicit localhost is available

[WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'

Thanks RaalK

CodePudding user response:

Let's simplify the data a bit. For example, given the files

shell> cat rebootlist 
reboot00
reboot02

shell> cat reboot00
host000
host099

shell> cat reboot02
host100
host199

In the playbook below create a dynamic group in the first play and use it in the second, e.g.

shell> cat reboot.yml
- hosts: localhost
  gather_facts: false
  tasks:
    - add_host:
        name: "{{ item }}"
        groups: "{{ group }}"
      loop: "{{ lookup('file', group).splitlines() }}"

- hosts: "{{ group }}"
  gather_facts: false
  tasks:
    - debug:
        msg: "Reboot {{ inventory_hostname }}"

Then iterate the items from the file rebootlist.e.g.

shell> for j in $(cat rebootlist); do ansible-playbook -e group=$j reboot.yml; done

gives (abridged)

PLAY [localhost] ***********************

TASK [add_host] ************************
ok: [localhost] => (item=host000)
ok: [localhost] => (item=host099)

PLAY [reboot00] ************************

TASK [debug] ***************************
ok: [host000] => 
  msg: Reboot host000
ok: [host099] => 
  msg: Reboot host099

PLAY RECAP *****************************
host000: ok=1    changed=0    unreachable=0
host099: ok=1    changed=0    unreachable=0
localhost: ok=1    changed=0    unreachable=0


PLAY [localhost] ***********************

TASK [add_host] ************************
ok: [localhost] => (item=host100)
ok: [localhost] => (item=host199)

PLAY [reboot02] ************************

TASK [debug] ***************************
ok: [host100] => 
  msg: Reboot host100
ok: [host199] => 
  msg: Reboot host199

PLAY RECAP *****************************
host100: ok=1    changed=0    unreachable=0
host199: ok=1    changed=0    unreachable=0
localhost: ok=1    changed=0    unreachable=0
  • Related