I have to goals with my plabook:
a) get mac address from a specific VM running on vsphere b) add it to my inventory file My test environment is: -Vsphere 6.5 -Ansible 2.7 running on Centos 7.6 I have been able to make point a) following this post How retrieve the name of specific dictionary - Ansible <https://stackoverflow.com/questions/53453718/how-retrieve-the-name-of-specific-dictionary-ansible> Playbook: # Deploy a guest from a template* - hosts: 127.0.0.1 vars: vcenter_hostname: virtvcsami1.virtlab.local vcenter_user: [email protected] vcenter_pass: Esxilab!1 vcenter_datastore: vsanDatastore vcenter_datacenter: DatacenterMI tasks: - name: Gather VMware guest facts vmware_vm_facts: validate_certs: False hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" vm_type: vm delegate_to: localhost register: vm_guest_facts - debug: msg="{{ item.value.mac_address }}" loop: "{{ vm_guest_facts.virtual_machines|dict2items }}" but now I still have two problems to solve: Problem 1) Playbook gets ALL virtual machines while I need to get just a VM named "testvm" [root@nlnxmi1 testvmcdromiso]# ansible-playbook getvminfo.yml PLAY [127.0.0.1] *********************************************************************************************************************************************************************************************** TASK [Gathering Facts] ***************************************************************************************************************************************************************************************** ok: [127.0.0.1] TASK [Gather VMware guest facts] ******************************************************************************************************************************************************************************* ok: [127.0.0.1 -> localhost] TASK [debug] *************************************************************************************************************************************************************************************************** ok: [127.0.0.1] => (item={'key': u'kubemst01', 'value': {u'guest_fullname': u'CentOS 7 (64-bit)', u'vm_network': {u'00:50:56:be:de:b9': {u'ipv4': [u'192.168.40.31'], u'ipv6': [u'fe80::250:56ff:febe:deb9']}, u'52:54:00:62:fe:fe': {u'ipv4': [u'192.168.122.1'], u'ipv6': []}}, u'cluster': u'VirtlabMI', u'esxi_hostname': u'virtesxmi3.virtlab.local', u'mac_address': [u'00:50:56:be:de:b9'], u'power_state': u'poweredOn', u'ip_address': u'192.168.40.31', u'uuid': u'423e7580-1ca4-a6ca-5cb4-5b8fa963d527'}}) => { "msg": [ "00:50:56:be:de:b9" ] } ok: [127.0.0.1] => (item={'key': u'testvm', 'value': {u'guest_fullname': >u'CentOS 7 (64-bit)', u'vm_network': {}, u'cluster': u'VirtlabMI', >u'esxi_hostname': u'virtesxmi1.virtlab.local', u'mac_address': >[u'00:50:56:be:a3:a0'], u'power_state': u'poweredOn', u'ip_address': u'', >u'uuid': u'423e8645-ca2a-1097-2e1c-624810a461d1'}}) => { "msg": [ "00:50:56:be:a3:a0" ] } ...... Trying to solve this tedious problem I posted on stackoverflow (https://stackoverflow.com/questions/56243269/ansible-vmware-vm-facts-get-mac-address-for-a-specific-vm-and-write-it-to-exist/56245634#56245634) and a user gave me this suggestion: -----from stackoverflow---- That's not a problem. It looks like the vmware_vm_facts module returns a dictionary, so just ask for the vm you want: - debug: msg="{{ vm_guest_facts.virtual_machines['testvm'].mac_address }}" --------------------------------- So....I changed my playbook as suggested: # Deploy a guest from a template* - hosts: 127.0.0.1 vars: vcenter_hostname: virtvcsami1.virtlab.local vcenter_user: [email protected] vcenter_pass: Esxilab!1 vcenter_datastore: vsanDatastore vcenter_datacenter: DatacenterMI tasks: - name: Gather VMware guest facts vmware_vm_facts: validate_certs: False hostname: "{{ vcenter_hostname }}" username: "{{ vcenter_user }}" password: "{{ vcenter_pass }}" vm_type: vm delegate_to: localhost register: vm_guest_facts # - debug: msg="{{ item.value.mac_address }}" # loop: "{{ vm_guest_facts.virtual_machines|dict2items }}" - debug: msg="{{ vm_guest_facts.virtual_machines['testvm'].mac_address }}" but is this way I get an error: [root@nlnxmi1 testvmcdromiso]# ansible-playbook getvminfo.yml ERROR! Syntax Error while loading YAML. did not find expected key The error appears to have been in '/etc/ansible/testvmcdromiso/getvminfo.yml': line 22, column 4, but may be elsewhere in the file depending on the exact syntax problem. The offending line appears to be: #loop: "{{ vm_guest_facts.virtual_machines|dict2items }}" - debug: msg="{{ vm_guest_facts.virtual_machines['testvm'].mac_address }}" ^ here We could be wrong, but this one looks like it might be an issue with missing quotes. >Always quote template expression brackets when they start a value. For instance: with_items: - {{ foo }} Should be written as: with_items: - "{{ foo }}" Unfortunately the user on stackoverflow didn't reply anymore. This mailing list is last chance to get it working. Problem 2) Add mac address to existing inventory file or, if not possible, at least in some file Just as a stupid test I tried adding the following code at the end: - set_fact: vm_mac_address="prova" - name: Register host to Inventory lineinfile: path: /etc/ansible/testvmcdromiso/inventory regexp: '(testvm)' line: '\1 macaddres={{ vm_mac_address }}' backrefs: yes [root@nlnxmi1 testvmcdromiso]# cat inventory [testhost] testvm macaddress=prova but as you can see I just used a "fixed" string instead I need to get the mac address from the running vm but never figure it out even after 2 days of attempts :( I'm just a beginner with ansible. Could you please help me? -- 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/59aa4ea9-fbb0-4165-9fc3-4a3e42cc5065%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
