'Ansible vmware_guest module with_items how to loop the debug msg output

I'm trying to deploy some virtual machines which seems to be working fine, and I can get the output to a debug screen, but what I would like is to be able to filter the output a bit and show hostname and IP address really. But I'm not sure how to loop the output! I've tried:

- debug:
    msg: {{ item.instance.ipv4 }}
  with_items: _result.results

Here is my playbook:

---
 - name: Clone VMs
   hosts: localhost 
   gather_facts: false
   vars_files:
      - vars.yml
      - secrets.yml
   tasks: 
   - name: Clone multiple VMs from template
     local_action:
       module: vmware_guest
       hostname: "{{ vcenter_hostname }}"
       username: "{{ username }}"
       password: "{{ password }}"
       validate_certs: no      
       folder: "{{ folder }}"
       template: "{{ item.template }}"
       name: "{{ item.name }}"
       esxi_hostname: "{{ esxi_hostname }}"
       datacenter: "{{ datacenter }}"
       state: "{{ state }}"
       # customization_spec: "{{ customization_spec }}"
     with_items: "{{ servers }}" 
     register: _result

   - name: Output
     debug:
        msg: "{{ _result.results }}"
     #with_items: _result.results.msg

In my vars I have the following (amongst other things)

servers:
        - { name: centos8_01, template: centos8 }
        - { name: centos7_01, template: centos7-minimal }

The output in the debug currently is:

ok: [localhost] => {
    "msg": [
        {
            "ansible_loop_var": "item", 
            "changed": false, 
            "failed": false, 
            "instance": {
                "annotation": "", 
                "current_snapshot": null, 
                "customvalues": {}, 
                "guest_consolidation_needed": false, 
                "guest_question": null, 
                "guest_tools_status": "guestToolsRunning", 
                "guest_tools_version": "10346", 
                "hw_cluster": "Cluster", 
                "hw_cores_per_socket": 1, 
                "hw_datastores": [
                    "SSD"
                ], 
                "hw_esxi_host": "******", 
                "hw_eth0": {
                    "addresstype": "assigned", 
                    "ipaddresses": [], 
                    "label": "Network adapter 1", 
                    "macaddress": "00:50:56:a3:4b:ba", 
                    "macaddress_dash": "00-50-56-a3-4b-ba", 
                    "portgroup_key": null, 
                    "portgroup_portkey": null, 
                    "summary": "10.0.0.0"
                }, 
                "hw_files": [
                    "[SSD] centos8_01/centos8_01.vmx", 
                    "[SSD] centos8_01/centos8_01.nvram", 
                    "[SSD] centos8_01/centos8_01.vmsd", 
                    "[SSD] centos8_01/centos8_01.vmdk"
                ], 
                "hw_folder": "/Learn/vm/L2L", 
                "hw_guest_full_name": "CentOS 8 (64-bit)", 
                "hw_guest_ha_state": null, 
                "hw_guest_id": "centos8_64Guest", 
                "hw_interfaces": [
                    "eth0"
                ], 
                "hw_is_template": false, 
                "hw_memtotal_mb": 4096, 
                "hw_name": "centos8_01", 
                "hw_power_status": "poweredOn", 
                "hw_processor_count": 2, 
                "hw_product_uuid": "4223465f-32ce-38ab-0d0e-a92f187b7d4d", 
                "hw_version": "vmx-14", 
                "instance_uuid": "5023b456-cda0-1fa6-c0a5-67d57ede5707", 
                "ipv4": null, 
                "ipv6": null, 
                "module_hw": true, 
                "moid": "vm-12173", 
                "snapshots": [], 
                "vimref": "vim.VirtualMachine:vm-12173", 
                "vnc": {}
            }, 
            "invocation": {
                "module_args": {
                    "annotation": null, 
                    "cdrom": [], 
                    "cluster": null, 
                    "convert": null, 
                    "customization": {}, 
                    "customization_spec": null, 
                    "customvalues": [], 
                    "datacenter": "******", 
                    "datastore": null, 
                    "disk": [], 
                    "esxi_hostname": "******", 
                    "folder": "L2L", 
                    "force": false, 
                    "guest_id": null, 
                    "hardware": {}, 
                    "hostname": "******", 
                    "is_template": false, 
                    "linked_clone": false, 
                    "name": "centos8_01", 
                    "name_match": "first", 
                    "networks": [], 
                    "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
                    "port": 443, 
                    "proxy_host": null, 
                    "proxy_port": null, 
                    "resource_pool": null, 
                    "snapshot_src": null, 
                    "state": "poweredon", 
                    "state_change_timeout": 0, 
                    "template": "centos8", 
                    "use_instance_uuid": false, 
                    "username": "******@vsphere.local", 
                    "uuid": null, 
                    "validate_certs": false, 
                    "vapp_properties": [], 
                    "wait_for_customization": false, 
                    "wait_for_ip_address": false
                }
            }, 
            "item": {
                "name": "centos8_01", 
                "template": "centos8"
            }
        }, 
        {
            "ansible_loop_var": "item", 
            "changed": false, 
            "failed": false, 
            "instance": {
                "annotation": "", 
                "current_snapshot": null, 
                "customvalues": {}, 
                "guest_consolidation_needed": false, 
                "guest_question": null, 
                "guest_tools_status": "guestToolsRunning", 
                "guest_tools_version": "10309", 
                "hw_cluster": "Corby", 
                "hw_cores_per_socket": 1, 
                "hw_datastores": [
                    "SSD"
                ], 
                "hw_esxi_host": "******", 
                "hw_eth0": {
                    "addresstype": "assigned", 
                    "ipaddresses": [
                        "10.0.0.137", 
                        "fe80::e1b4:c7c5:8268:4e7b"
                    ], 
                    "label": "Network adapter 1", 
                    "macaddress": "00:50:56:a3:f8:9f", 
                    "macaddress_dash": "00-50-56-a3-f8-9f", 
                    "portgroup_key": null, 
                    "portgroup_portkey": null, 
                    "summary": "VM Network"
                }, 
                "hw_files": [
                    "[SSD] centos7_01/centos7_01.vmx", 
                    "[SSD] centos7_01/centos7_01.nvram", 
                    "[SSD] centos7_01/centos7_01.vmsd", 
                    "[SSD] centos7_01/centos7_01_2.vmdk"
                ], 
                "hw_folder": "/Learn/vm/L2L", 
                "hw_guest_full_name": "CentOS 6 (64-bit)", 
                "hw_guest_ha_state": null, 
                "hw_guest_id": "centos6_64Guest", 
                "hw_interfaces": [
                    "eth0"
                ], 
                "hw_is_template": false, 
                "hw_memtotal_mb": 2048, 
                "hw_name": "centos7_01", 
                "hw_power_status": "poweredOn", 
                "hw_processor_count": 1, 
                "hw_product_uuid": "4223d5ef-9363-03d4-8aea-7b1822b21e36", 
                "hw_version": "vmx-14", 
                "instance_uuid": "5023eea9-85ac-1c18-48bb-e0b63339c9fa", 
                "ipv4": "10.0.0.137", 
                "ipv6": null, 
                "module_hw": true, 
                "moid": "vm-12174", 
                "snapshots": [], 
                "vimref": "vim.VirtualMachine:vm-12174", 
                "vnc": {}
            }, 
            "invocation": {
                "module_args": {
                    "annotation": null, 
                    "cdrom": [], 
                    "cluster": null, 
                    "convert": null, 
                    "customization": {}, 
                    "customization_spec": null, 
                    "customvalues": [], 
                    "datacenter": "******", 
                    "datastore": null, 
                    "disk": [], 
                    "esxi_hostname": "******", 
                    "folder": "******", 
                    "force": false, 
                    "guest_id": null, 
                    "hardware": {}, 
                    "hostname": "******", 
                    "is_template": false, 
                    "linked_clone": false, 
                    "name": "centos7_01", 
                    "name_match": "first", 
                    "networks": [], 
                    "password": "VALUE_SPECIFIED_IN_NO_LOG_PARAMETER", 
                    "port": 443, 
                    "proxy_host": null, 
                    "proxy_port": null, 
                    "resource_pool": null, 
                    "snapshot_src": null, 
                    "state": "poweredon", 
                    "state_change_timeout": 0, 
                    "template": "centos7-minimal", 
                    "use_instance_uuid": false, 
                    "username": "******", 
                    "uuid": null, 
                    "validate_certs": false, 
                    "vapp_properties": [], 
                    "wait_for_customization": false, 
                    "wait_for_ip_address": false
                }
            }, 
            "item": {
                "name": "centos7_01", 
                "template": "centos7-minimal"
            }
        }
    ]
}


Solution 1:[1]

There are multiple ways to do this.

A loop is one of them:

- debug:
    msg: 
      hostname: "{{ item.invocation.module_args.hostname }}"
      ip: "{{ item.instance.ipv4 }}"
  loop: "{{ _result.results }}" 
  loop_control:
    label: "item.invocation.module_args.hostname"

This would yield:

ok: [localhost] => (item=item.invocation.module_args.hostname) => 
  msg:
    hostname: '******'
    ip: ''
ok: [localhost] => (item=item.invocation.module_args.hostname) => 
  msg:
    hostname: '******'
    ip: 10.0.0.137

Another solution is to use JMESPath and the json_query filter:

- debug:
    var: >-
      _result.results 
      | json_query('[].{
          hostname: invocation.module_args.hostname, ip: instance.ipv4
      }')

This would yield:

ok: [localhost] => 
  ? |-
    _result.results  | json_query('[].{
        hostname: invocation.module_args.hostname, ip: instance.ipv4
    }')
  : - hostname: '******'
      ip: null
    - hostname: '******'
      ip: 10.0.0.137

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 β.εηοιτ.βε