Ansible vmware_guest_facts 使用多个虚拟机的事实

Ansible vmware_guest_facts 使用多个虚拟机的事实

我正在编写一个脚本,用于在 vSphere 环境中部署和配置 VM。

部署后,我想收集虚拟机的 IP 以进行 DNS 注册。可以同时收集 2 个或更多虚拟机的信息。但是,如何使用收集到的数据输出带有 IP 地址的虚拟机名称?

对于单个 VM,这可以获取 IP,但是当与 2 个 VM 一起使用时,变量未定义:

- debug:
    var: vm_guest_facts.instance.ipv4

也许我的方法是错误的,但我真的不知道该怎么做。

- name: Gather facts from recently deployed VM's

  vmware_guest_facts:
    validate_certs: False
    hostname: "{{ vcenter_hostname }}"
    username: "{{ vcenter_user }}"
    password: "{{ vcenter_pass }}"
    datacenter: "{{ datacenter }}"
    name: "{{ item.key }}"
  register: vm_guest_facts
  with_dict: "{{ vmdetails }}"

- debug:
    var: vm_guest_facts

结果(主机名和文件夹是 Terraform,但此示例仅使用 Ansible):

TASK [Gather facts from standalone ESXi server having datacenter as 'ha- 
datacenter'] 

ok: [terraform.rum.local] => (item={'value': {u'mem': 512, u'network': u'T1- 
PRD', u'datastore': u'nfs-b', u'cpu': 1, u'vmfolder': u'terraform-deploy'}, 
'key': u'testvm4'})
ok: [terraform.rum.local] => (item={'value': {u'mem': 756, u'network': u'T2- 
TEST', u'datastore': u'nfs-a', u'cpu': 2, u'vmfolder': u'terraform-deploy'}, 
'key': u'testvm3'})

TASK [debug]
*************************************
ok: [terraform.rum.local] => {
"vm_guest_facts": {
    "changed": false,
    "msg": "All items completed",
    "results": [
        {
            "_ansible_ignore_errors": null,
            "_ansible_item_result": true,
            "_ansible_no_log": false,
            "_ansible_parsed": true,
            "changed": false,
            "failed": false,
            "instance": {
                "annotation": "",
                "current_snapshot": null,
                "customvalues": {},
                "guest_consolidation_needed": false,
                "guest_question": null,
                "guest_tools_status": "guestToolsRunning",
                "guest_tools_version": "10304",
                "hw_cores_per_socket": 1,
                "hw_datastores": [
                    "nfs-b",
                    "nfs-a"
                ],
                "hw_esxi_host": "esx-a.rum.local",
                "hw_eth0": {
                    "addresstype": "assigned",
                    "ipaddresses": [
                        "192.168.1.12",
                        "fe80::250:56ff:feb8:d51c"
                    ],
                    "label": "Network adapter 1",
                    "macaddress": "00:50:56:b8:d5:1c",
                    "macaddress_dash": "00-50-56-b8-d5-1c",
                    "summary": "DVSwitch: 50 38 43 04 bb 97 81 76-81 51 a6 cd a4 39 2b 61"
                },
                "hw_files": [
                    "[nfs-b] testvm4/testvm4.vmx",
                    "[nfs-b] testvm4/testvm4.nvram",
                    "[nfs-b] testvm4/testvm4.vmsd",
                    "[nfs-b] testvm4/testvm4.vmxf",
                    "[nfs-b] testvm4/testvm4.vmdk"
                ],
                "hw_folder": "/datacenter1/vm/terraform-deploy",
                "hw_guest_full_name": "CentOS 7 (64-bit)",
                "hw_guest_ha_state": null,
                "hw_guest_id": "centos7_64Guest",
                "hw_interfaces": [
                    "eth0"
                ],
                "hw_is_template": false,
                "hw_memtotal_mb": 512,
                "hw_name": "testvm4",
                "hw_power_status": "poweredOn",
                "hw_processor_count": 1,
                "hw_product_uuid": "42387ae9-cac5-1faa-1e84-0859533dd2b0",
                "instance_uuid": "5038a877-e2db-1bfd-6439-78f6522a9049",
                "ipv4": "192.168.1.12",
                "ipv6": "fe80::250:56ff:feb8:d51c",
                "module_hw": true,
                "snapshots": []
            },
            "invocation": {
                "module_args": {
                    "datacenter": "datacenter1",
                    "folder": "/vm",
                    "hostname": "vcenter.rum.local",
                    "name": "testvm4",
                    "name_match": "first",
                    "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
                    "port": 443,
                    "username": "[email protected]",
                    "uuid": null,
                    "validate_certs": false
                }
            },
            "item": {
                "key": "testvm4",
                "value": {
                    "cpu": 1,
                    "datastore": "nfs-b",
                    "mem": 512,
                    "network": "T1-PRD",
                    "vmfolder": "terraform-deploy"
                }
            }
        },
        {
            "_ansible_ignore_errors": null,
            "_ansible_item_result": true,
            "_ansible_no_log": false,
            "_ansible_parsed": true,
            "changed": false,
            "failed": false,
            "instance": {
                "annotation": "",
                "current_snapshot": null,
                "customvalues": {},
                "guest_consolidation_needed": false,
                "guest_question": null,
                "guest_tools_status": "guestToolsRunning",
                "guest_tools_version": "10304",
                "hw_cores_per_socket": 1,
                "hw_datastores": [
                    "nfs-a"
                ],
                "hw_esxi_host": "esx-a.rum.local",
                "hw_eth0": {
                    "addresstype": "assigned",
                    "ipaddresses": [
                        "192.168.1.16",
                        "fe80::250:56ff:feb8:5e2c"
                    ],
                    "label": "Network adapter 1",
                    "macaddress": "00:50:56:b8:5e:2c",
                    "macaddress_dash": "00-50-56-b8-5e-2c",
                    "summary": "DVSwitch: 50 38 43 04 bb 97 81 76-81 51 a6 cd a4 39 2b 61"
                },
                "hw_files": [
                    "[nfs-a] testvm3/testvm3.vmx",
                    "[nfs-a] testvm3/testvm3.nvram",
                    "[nfs-a] testvm3/testvm3.vmsd",
                    "[nfs-a] testvm3/testvm3.vmxf",
                    "[nfs-a] testvm3/testvm3.vmdk"
                ],
                "hw_folder": "/datacenter1/vm/terraform-deploy",
                "hw_guest_full_name": "CentOS 7 (64-bit)",
                "hw_guest_ha_state": null,
                "hw_guest_id": "centos7_64Guest",
                "hw_interfaces": [
                    "eth0"
                ],
                "hw_is_template": false,
                "hw_memtotal_mb": 756,
                "hw_name": "testvm3",
                "hw_power_status": "poweredOn",
                "hw_processor_count": 2,
                "hw_product_uuid": "4238b6c3-a81a-cb51-a816-b83627bfcab0",
                "instance_uuid": "5038a0b1-f75a-f8cb-a872-344afdb1bc6f",
                "ipv4": "192.168.1.16",
                "ipv6": "fe80::250:56ff:feb8:5e2c",
                "module_hw": true,
                "snapshots": []
            },
            "invocation": {
                "module_args": {
                    "datacenter": "datacenter1",
                    "folder": "/vm",
                    "hostname": "vcenter.rum.local",
                    "name": "testvm3",
                    "name_match": "first",
                    "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER",
                    "port": 443,
                    "username": "[email protected]",
                    "uuid": null,
                    "validate_certs": false
                }
            },
            "item": {
                "key": "testvm3",
                "value": {
                    "cpu": 2,
                    "datastore": "nfs-a",
                    "mem": 756,
                    "network": "T2-TEST",
                    "vmfolder": "terraform-deploy"
                }
            }
        }
    ]
  }
}

答案1

您可能想要json_query这样使用。在这里,我从中收集事实vmware_guest_facts并在中注册输出no_vm_result。然后,使用它no_vm_resultjson_query遍历所有结果并获取ipv4可用于执行任何操作的结果。这是相当简单的事情。

---
- name: StackOverflow answer
  gather_facts: no
  vars_files:
    - vcsim_vars.yml
  vars:
    vm_list:
      - DC0_H0_VM0
      - DC0_H0_VM1
  hosts: localhost
  tasks:
    - name: Gather VMware guest facts
      vmware_guest_facts:
        hostname: "{{ vcenter_server }}"
        username: "{{ vcenter_user }}"
        password: "{{ vcenter_pass }}"
        datacenter: DC0
        validate_certs: no
        name: "{{ item }}"
      register: no_vm_result
      with_items: "{{ vm_list }}"

    - name: Get IPv4 address of VMs to add to DNS configuration
      debug:
        msg: "{{ no_vm_result.results | json_query(s_query) }}"
      vars:
        s_query: "[?instance.hw_name == '{{ item }}'].instance.ipv4"
      with_items: "{{ vm_list }}"

相关内容