Ansible vmware_vm_facts:获取特定VM的MAC地址并将其写入现有清单

时间:2019-05-21 17:08:36

标签: ansible virtual-machine vmware

我的目标是达到目标

a)从在vSphere上运行的特定VM获取MAC地址 b)将其添加到我的库存文件中

我的测试环境是:
-Vsphere 6.5
-在Centos 7.6上运行的Ansible 2.7

根据这篇帖子How retrieve the name of specific dictionary - Ansible

,我已经提出了要点a)

剧本:

# Deploy a guest from a template*  
- hosts: 127.0.0.1  
  vars:
    vcenter_hostname: virtvcsami1.virtlab.local  
    vcenter_user: administrator@vsphere.local  
    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 }}"

但是现在我仍然要解决两个问题:

问题1)

Playbook获取所有虚拟机,而我只需要获取一个名为“ testvm”的虚拟机

  

[root @ nlnxmi1 testvmcdromiso]#ansible-playbook getvminfo.yml

     

播放[127.0.0.1] ********************************************* ****************************************************** ****************************************************** ******************************************************
  任务[聚会事实] ************************************************* ****************************************************** ****************************************************** ********************************************
  好的:[127.0.0.1]
  任务[收集VMware来宾事实] *********************************************** ****************************************************** ****************************************************** ********************************
  好的:[127.0.0.1->本地主机]
  任务[调试] ************************************************** ****************************************************** ****************************************************** ****************************************************** < br />   好的:[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'}})=> {       “味精”:[           “ 00:50:56:be:de:b9”       ]   }

     

确定:[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'}})=> {      “味精”:[          “ 00:50:56:be:a3:a0”      ]   }   ......

问题2)

将Mac地址添加到现有清单文件中,或者如果可能,至少在某些文件中添加

我尝试在末尾添加以下代码:

  - 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]#猫库存   [测试主机]   testvm macaddress = prova

但是如您所见,我只是使用了“固定”字符串,而是需要从正在运行的vm中获取mac地址,但即使经过2天的尝试也从未弄清楚它:(

我只是ansible的初学者。你能帮我吗?

最佳 马可

1 个答案:

答案 0 :(得分:0)

  

Playbook获取所有虚拟机,而我只需要获取一个名为“ testvm”的虚拟机

这不是问题。看来vmware_vm_facts模块返回了一个字典,所以只需询问您想要的虚拟机:

  - debug: msg="{{ vm_guest_facts.virtual_machines['testvm'].mac_address }}"  
  

将Mac地址添加到现有清单文件中,或者如果可能,至少在某些文件中添加

由于您现在知道如何检索MAC地址,因此您可以利用以下信息来修改lineinfile任务:

  - name: Register host to Inventory  
    lineinfile:  
      path: /etc/ansible/testvmcdromiso/inventory  
      regexp: '(testvm)'  
      line: '\1 macaddres={{ vm_guest_facts.virtual_machines['testvm'].mac_address }}'  
      backrefs: yes