I have a pair of servers (server1..domain, server2..domain) in two environments (staging and production). Server1 is primary, server2 is secondary.
When I originally built the playbook, I had aliases in the inventory file
[staging-cluster]
primary server1.staging.domain
secondary server2.staging.domain
And I’d target the IP of the other host with {{ hostvars[‘primary’][‘ansible_eth0’][‘ipv4’][‘address’] }} to get the of the “other” host. This worked fine, until I needed the playbook to target another set of hosts in production:
[production-cluster]
primary server1.prod.domain
secondary server2.prod.domain
The problem with the above, aliases are global and you can’t have more than one in an inventory. So…this breaks the above lookup {{ hostvars[‘secondary’][‘ansible_eth0’][‘ipv4’][‘address’] }}
As much as I disliked the idea, I then thought to leverage hostvars/serverX.environment.domain with a var like:
primary: true
partner: server2.environment.domain
The above var would exist on server1 since it is the primary and it’s partner is server2
The problem with the above is, I can’t expand {{ partner }} in the above fact (may not have explained that properly, I can’t do this:
{{ hostvars[‘{{ partner }}’][‘ansible_eth0’][‘ipv4’][‘address’] }} or this {{ hostavars[{{partner}}][‘ansible_eth0’][‘ipv4’][‘address’] }}
Anyone have any ideas on how I can manage a primary/secondary role/membership in a cluster? Actually defining if the host is primary/secondary is the easy part…but defining it’s partner and getting facts from its partner, I’m not certain of.
Thanks!!