How to get a server's identifier

We have a lot of config that wants to fill in templates based on a particular server’s “number” within a certain group.

For example, if we have an inventory file with:

`
[fooservers]
steve
larry
frank
eleanor

`

…we then want to configure steve’s templates with “foo01”, larry with “foo02”, frank with “foo03”, etc.
In most cases I’ve been using the following pattern inside of templates:

{% for pt in groups.ptservers %} {% if inventory_hostname == pt %} special_identifier = foo{{ '%02d' % loop.index }} {% endif %} {% endfor %}

This has worked well for limited use, but is there an easier way to store the server’s associated loop_index for reuse at either the playbook or template level?
We have reached a point where we have a template that needs to use this value 27 times, and I don’t want to have to clutter everything up with 27 loops…

I tried using {% set %} in the template inside of the loop. but set has local scope, so it’s unusable afterwards.

Has anyone else come up with a good solution for this pattern or do I just need to make a really really ugly template?

Can you just use a host variable in your inventory and then reference that in your template?

[fooservers]
steve special_identifier=01
larry special_identifier=02
frank special_identifier=03
eleanor special_identifier=04

Jay

Use set_fact to initially define the variable for each host, then you can reference the variable name wherever you need it later:

  • hosts: fooservers
    tasks:
  • set_fact:
    foo_var: “{% for pt in groups.fooservers %}{% if inventory_hostname == pt %}foo{{ ‘%02d’ % loop.index }}{% endif %}{% endfor %}”
  • debug: var=foo_var

Thanks Chris!
That’s got it working!!!

@Jay: I was hoping to avoid that and just have servers magically renumber themselves as they get added and removed from inventory… it’s one fewer thing that might get misconfigured…