Gathering list of unique variable values and number of servers with each value

Hi,

I have an inventory file set up like this:

[loc1]
server1
server2

[loc1:vars]
loc_name=“location1”

[loc2]
server3

[loc2:vars]
loc_name=“location2”

[loc3]
server4
server5
server6

[loc3:vars]
loc_name=“location3”

I want to create a configuration file on all the servers containing all the different locations and the number of members in each location. Example:

location1: 2,
location2: 1,
location3: 3

The number of different loc_names can vary. Is there a simple Jinja2 template that can yield those results? I’m worried that I’m approaching this from the wrong angle or that I set up the inventory in a way that is anti-Ansible; I want to avoid creating a convoluted template file if at all possible.

Any suggestions? Thanks!

you have all the locations in the groups dictionary and you can get
the number of hosts by looking at the length of each group's host
list.

{% for loc in groups %}
{{loc +': ' + groups[loc]|length,}}
...

Unfortunately, I may have made the example too simple. The actual inventory file has more groups and not all the groups are just locations. Furthermore, the group names are not necessarily the same as the “loc_name” variable. For example, in addition to the location groups, we could have groups like:

[master-server]
server4

[loadbalancer]
server6

Which should not show up in the breakdown.

Thanks.

add an {% if loc.startswith('location') %}

Alright, so it looks like the only way would be to key off a specifically formatted group name?

I was hoping to be able to rely on the variable alone. Ideally, an inventory could look like this (no groups):

server1 loc_name=“location1”
server2 loc_name=“location1”
server3 loc_name=“location2”
server4 loc_name=“location3”
server5 loc_name=“location3”
server6 loc_name=“location3”

But that might be getting away from proper Ansible design.

I appreciate the input you’ve given, thanks!

you could just create a variable with the list of 'location groups'
and iterate over that.