Nested Loops? Sorting inventory_hostnames

37 views
Skip to first unread message

Mike Fennemore

unread,
May 24, 2016, 5:13:53 AM5/24/16
to Ansible Project
I have a custom hostvar called server_dependson defined in my inventory. The thinking is that each server will have a server it is dependent on.
Therefore when running updates and rebooting (Windows servers) I want to be able to specify that certain servers be updated and rebooted based on dependency.

My initial thought was to have a nested loop, outer loop with inventory_hostname and inner with server_dependson. Within the loop it would compare the server_dependson with the current inventory_hostname from the outer loop. If it matched then it would add the inventory_hostname to a list after the server it depended on. This way at the end of the loops I would have a sorted list of servers to feed to tasks in the list's order.

Any ideas about how to achieve this?

J Hawkesworth

unread,
May 24, 2016, 5:54:13 AM5/24/16
to Ansible Project
Hi Mike,

I'm curious what problem you are solving by making each server dependent on another one.  Maybe worth taking a step back and asking what problem you are solving by doing this?

I'd probably look at creating some dynamic inventory if I had to do this, although I would be surprised if every server wound up being dependent on another for all hosts in an inventory.  But, like I say, I don't know what problem you are solving.

Jon

Mike Fennemore

unread,
May 24, 2016, 6:50:13 AM5/24/16
to Ansible Project
Hi Jon,

We do currently use a dynamic inventory. Basically with the Windows domain servers we have instances where an application server would depend on a database server that would rely on a domain controller. In that example we would want a certain order of update and reboot.

J Hawkesworth

unread,
May 24, 2016, 8:15:01 AM5/24/16
to Ansible Project
Thanks.

Personally I think I'd shy away from coupling this relationship in the inventory but instead use groups and enforce the order by having multiple plays in a given playbook (something like the following), but whatever works for you.

# reboot_stuff_playbook.yml - NOT tested, just to illustrate idea
--
hosts: domain_controllers
tasks:
   - win_updates
   - win_reboot

hosts: db_servers
tasks:
   - win_updates
   - win_reboot

hosts: app_servers
tasks:
   - win_updates
   - win_reboot

Jon
Reply all
Reply to author
Forward
0 new messages