Create a variable based on a variable

Hello, all.

The subject of this post is probably terribly named. That said, here’s what I’m trying to accomplish:

I have two VMware vCenter hosts - vcenter1.mycompany.com and vcenter2.mycompany.com. Within each host is are two datacenters - datacenter1 and datacenter2. for each host, the datacenter alignments are vcenter1 – datacenter1 and vcenter2 – datacenter2.

I have a number of playbooks that do actions against vCenter. For example, I have one deletes all snapshots. It looks like this:

A dictionary would solve this using the guest name as the key.

vcenter:
host1: { datacenter: datacenter1, vcenter: vcenter2 }

host2: { datacenter: datacenter1, vcenter: vcenter1 }
host3: { datacenter: datacenter2, vcenter: vcenter2 }
host4: { datacenter: datacenter2, vcenter: vcenter1 }

{{ vcenter[inventory_hostname].datacenter }}
{{ vcenter[inventory_hostname].vcenter }}

Keeping that dictionary update to date will be tedious but could be automated too. Query each vcenter / datacenter pair for its list of VMs and generate a vars file with the above dictionary. Include that vars file in your playbooks. Alternatively (and more expensive) is to create an initial task that queries the each vcenter / datacenter pair and creates this dictionary in real time.

Walter

i am quite a newbee with ansible, but i would suggest to
a) use host-variables with e.g. “datacenter” set to the matching datacenter value or
b) use a regex on the host variable to create the datacenter on it

regards,
andre

Just off the top of my head you can use set_fact.

  • name: Set datacenter variable based on hostname
    set_fact:
    datacenter: “datacenter{{ ansible_hostname[-1] }}”
    when: ansible_hostname | regex_search(‘[1]*[1-2]’)

You can then just use {{ datacenter }} and it should populate correctly. I haven’t tested the above, but if it doesn’t work it should at least put you in the ball park.


  1. a-zA-Z0-9 ↩︎

Than you all. I’ll make note of your suggestions. I solved my issue like this (whether it’s "optimal, I don;t know):

vars:
vcenter_datacenter: >-
{% if vcenter_hostname == ‘vcenter1’ %}
Datacenter1 Datacenter
{% elif vcenter_hostname == ‘vcenter2’ %}
Datacenter2 Datacenter
{% else %}
Default Datacenter
{% endif %}

Also:

vars:
  vcenter_datacenter: '{{ vcenter_hostname ==
"vcenter1"|ternary("First", vcenter_hostname ==
"vcenter2"|ternary("datacenter1", "datacenter2")) }}' Dataceenter

but i would do this:

vars:
   DCS:
      vcenter1: First
      vcenter2: datacenter1
  vcenter_datacenter: '{{ DCS[vcenter_hostname]|default("datacenter2")
}}' Datacenter

Not exactly based on the variables, but I use this to find the datacenter in the vCenter (in my case I have only one datacenter per vCenter so it works)

  • name: Gather information about all datacenters in vCenter
    community.vmware.vmware_datacenter_info:
    hostname: “{{ hostname }}”
    username: “{{ username }}”
    password: “{{ password }}”
    validate_certs: “{{ false}}”
    delegate_to: localhost
    register: datacenterInfo

#- name: Display datacenter Info
ansible.builtin.debug:
#msg: “{{ datacenterInfo.datacenter_info[0].name }}”

  • name: set Fact - datacenter
    set_fact:
    datacenter: “{{ datacenterInfo.datacenter_info[0].name }}”

Hope this helps.

Warm Regards,
Abhi