Looping over nested inventory items with conditional

28 views
Skip to first unread message

Jason Gilfoil

unread,
Feb 13, 2018, 4:02:57 PM2/13/18
to Ansible Project
Hey all, 

We're migrating from a single load balancer pair for all systems (dev/test/qa/prod) to separate pairs for dev/test and qa/prod. As a result, my previous task to pull nodes from the pool on the load balancer will no longer suffice without some conditional logic. I have a partial solution, but it two issues. 

1st Issue
In the following code i'm attempting to make it so that if the server is in the test inventory group, it uses the dev-test f5 pair and if it's not, use the qa-prod f5 pair. The first issue is that it loops over all combinations so the task would essentially execute twice for each f5 target. 


2nd Issue
The second problem is that i need to expand the conditional to allow multiple statements. 

I need to find a way to expand this line:
      msg: "{{ (inventory_hostname in groups['test']) | ternary(hostvars[item[0]].ansible_host,hostvars[item[1]].ansible_host) }}"
into
      msg: "{{ (inventory_hostname in groups['test'] OR inventory_hostname in groups['dev']) | ternary(hostvars[item[0]].ansible_host,hostvars[item[1]].ansible_host) }}"

which doesn't work currently. 

I'm wondering if there's a way to salvage this method or if i need another approach entirely. I've considered just hard coding the f5's into a group_variable, but i'd like to avoid that and leverage the inventory instead if possible.

Thanks!

flowerysong

unread,
Feb 13, 2018, 5:30:55 PM2/13/18
to Ansible Project
On Tuesday, February 13, 2018 at 4:02:57 PM UTC-5, Jason Gilfoil wrote:

We're migrating from a single load balancer pair for all systems (dev/test/qa/prod) to separate pairs for dev/test and qa/prod. As a result, my previous task to pull nodes from the pool on the load balancer will no longer suffice without some conditional logic. I have a partial solution, but it two issues. 

1st Issue
In the following code i'm attempting to make it so that if the server is in the test inventory group, it uses the dev-test f5 pair and if it's not, use the qa-prod f5 pair. The first issue is that it loops over all combinations so the task would essentially execute twice for each f5 target. 


2nd Issue
The second problem is that i need to expand the conditional to allow multiple statements. 

I need to find a way to expand this line:
      msg: "{{ (inventory_hostname in groups['test']) | ternary(hostvars[item[0]].ansible_host,hostvars[item[1]].ansible_host) }}"
into
      msg: "{{ (inventory_hostname in groups['test'] OR inventory_hostname in groups['dev']) | ternary(hostvars[item[0]].ansible_host,hostvars[item[1]].ansible_host) }}"

 I'm not entirely sure of your constraints, but it seems like you would want something more like https://gist.github.com/flowerysong/ae18f75d2103b41198149380e8d6fb1c rather than a nested loop.

Jason Gilfoil

unread,
Feb 14, 2018, 9:24:01 AM2/14/18
to Ansible Project
Thanks! that got me what I needed. I made this slight modification to the item piece and i'm good to go!

msg: "{{ hostvars[item].ansible_host }}"
Reply all
Reply to author
Forward
0 new messages