Hi,
I'm looking at switching to using the vmware_guest_snapshot module to take
snapshots of VMs before performing package updates on them (I previously
used another custom module where we changed case of hostnames to lowercase
and compared to vm object name after also making that lowercase).
Unfortunately, our VMs are not consistently named in vCenter - they can be
lowercase, uppercase or even a mixture of both - but the module only
supports finding VMs using the exact case. This makes it difficult when
passing hostnames to a playbook, we always pass a lowercase and the
hostnames are used as the VM name by my playbook.
I've thought about using a daily cache file created using the
vmware_vm_facts module (we don't want to have to query vCentre for these
facts on each run as it contains hundreds of VMs), retrieving the machine
UUID from that cache and using it to identify the VM to snapshot (rathre
than its name). However, I've not been able to figure out how to select
from my cache file (without actually making it all lowercase).
So to debug, the following just writes out the facts gathered by
vmware_vm_facts and then the debug grabs the UUID by matching the inventory
hostname (but obviously that only works if it matches the case sensitive
hostname);
- name: Write out facts to file
copy: content="{{ vm_facts.virtual_machines }}"
dest=vm_facts.cache
delegate_to: localhost
run_once: 'True'
- debug:
msg: "My UUID is {{ myvm[inventory_hostname]['uuid'] }}"
vars:
myvm: "{{ lookup('file', 'vm_facts.cache') }}"
I know I can work with this by making things all lower case as follows;
- debug:
msg: "My UUID is {{ myvm[inventory_hostname|lower]['uuid'] }}"
vars:
myvm: "{{ lookup('file', 'vm_facts.cache') | lower }}"
Sample cache file (ignore values - they've been changed);
{"SERVER1": {"esxi_hostname": "test_esx", "vm_network": {"00:00:00:00:00":
{"ipv4": ["10.0.0.1"], "ipv6": ["f----"]}}, "power_state": "poweredOn",
"mac_address": ["00:00:00:00:00"], "guest_fullname": "CentOS 4/5 or later
(64-bit)", "ip_address": "10.0.0.1", "uuid":
"422342435-de04-5014-58d4-475ab4ffdc8a"}, "server2": {"esxi_hostname":
"test_esx", "vm_network": {}, "power_state": "poweredOn", "mac_address":
["00:00:00:00:00:00"], "guest_fullname": "CentOS 4/5 or later (64-bit)",
"ip_address": "", "uuid": "422344329-d4df-72c9-477b-bdd976e72be7"}}
But can anyone advise a better way of achieving this without having to
change everything to lowercase (just in case UUID ever contains upper and
lowercase characters)? Alternatively, a way to find the VM name from the
cache file and use that to pass as the name to the module.
It would be nice if the vmware modules would allow case insensitive matches
of VM names (the modules already cater for a situation where more than one
VM has the same name by using the name_match parameter).
Ansible Version: 2.6.5
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/e5bcfe9d-3299-4c09-ac4f-777a03fc7be5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.