我的目标是达到目标
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的初学者。你能帮我吗?
最佳 马可
答案 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