How to use with_items loop with vmware_guest module

Hello,

I’m trying to create new VM using vmware_guest module with multiple disks which details are defined in host_vars file. Unfortunately I can’t get it working. Is it even possible to use with_items with vmware_guest module?

I have tried the following:

Disk definition in host_vars:

vmware_guest_disks: disk1: size_gb: 20 datastore: datastore1 disk2: size_gb: 1 datastore: datastore1 disk3: size_gb: 2 datastore: datastore1

Task used to try to create new VM:

`

  • name: Create new VM
    vmware_guest:
    hostname: 192.168.1.2
    username: administrator@vsphere.local
    password: password
    datacenter: datacenter
    cluster: cluster
    name: guestname
    guest_id: centos64guest
    template: templatename
    validate_certs: no
    hardware:
    memory_mb: 1024
    num_cpus: 1
    customization:
    dns_servers:
  • 8.8.8.8
  • 8.8.4.4
    hostname: guesthostname
    domain: guestdomain
    password: password
    networks:
  • vlan: 1
    ip: 192.168.1.100
    netmask: 255.255.255.0
    gateway: 192.186.1.1
    disk:
  • size_gb: “{{ item.value.size_gb }}”
  • datastore: “{{ item.value.datastore }}”
    with_items: “{{ vmware_guest_disks | default({}) }}”
    register: deploy

`

Tasks fails but if it had succeeded as I though it should have created new VM with disks which details have been taken from host_vars (disks with sizes 20, 1 and 2 GB placed on datastore1).

Hi Matti,

You've created a dictionary instead of a list.
Check this document: http://docs.ansible.com/ansible/YAMLSyntax.html

The proper use of "with_items" needs a list like this:

vmware_guest_disks:
  - size_gb: 20
    datastore: datastore1
  - size_gb: 1
    datastore: datastore1
  - size_gb: 2
    datastore: datastore1

Note the dash and space per item. The indentation is important, too.

Then you should access the items this way: {{ item.size_gb }} and {{ item.datastore }}. No "value" part.

Cheers,
Marko

Now I realized that you probably wanted to use with_dict instead of with_items.
In that case, you would need the "value" part:
http://docs.ansible.com/ansible/playbooks_loops.html#looping-over-hashes
Cheers,
Marko

Hello Team,

I am getting below error. I try to achieve the looping of VM name which is mentioned in the separate list.

TASK [Clone a VM from Template and customize] **************************************************************************************************************************
fatal: [localhost → localhost]: FAILED! => {“changed”: false, “msg”: “Unsupported parameters for (vmware_guest) module: with_items Supported parameters include: annotation, cdrom, cluster, customization, customvalues, datacenter, disk, esxi_hostname, folder, force, guest_id, hardware, hostname, is_template, linked_clone, name, name_match, networks, password, port, resource_pool, snapshot_src, state, template, username, uuid, validate_certs, wait_for_ip_address”}
to retry, use: --limit @/etc/ansible/clone_vm_from_template.retry

My playbook details.

  • hosts:
    localhost
    connection: local
    become: true
    vars:

ansible_python_interpreter: /usr/local/bin/python2.7

ansible_python_interpreter: /usr/bin/python
vmname_list: /etc/ansible/vmlist

tasks:

  • name: Clone a VM from Template and customize
    vmware_guest:
    annotation: This is a test VM deployment from Ansible
    hostname: “abcl”
    username:
    password:
    validate_certs: no
    folder: /vm
    datacenter: “”

cluster: “”

esxi_hostname: “”
template: CentOS68-tmplt-01
state: poweredon
name: “{{ vmname_list }}”
with_items : “{{vmname_list}}”
disk:

  • size_gb: 40
    type: thin
    datastore: torsav_esx_ds209
    hardware:
    memory_mb: 4096
    num_cpus: 2
    scsi: paravirtual
    networks:
  • name: app
    ip: 10.81.2.172
    netmask: 255.255.255.0
    gateway: 10.177.91.1
    customization:
    #autologon: yes

In my experience you do not need with_items here just create inventory file with multiple names and vms get created i.e.:

name: “{{ inventory_hostname }}”

I used but still getting an error.

state: poweredon
name: “{{ inventory_hostname }}”
with_items : “{{ inventory_hostname }}”
disk:

  • size_gb: 40
    type: thin
    datastore: torsav_esx_ds209
    hardware:
    memory_mb: 4096
    num_cpus: 2
    scsi: paravirtual
    networks:
  • name: app

TASK [Clone a VM from Template and customize] **************************************************************************************************************************
fatal: [localhost → localhost]: FAILED! => {“changed”: false, “msg”: “Unsupported parameters for (vmware_guest) module: with_items Supported parameters include: annotation, cdrom, cluster, customization, customvalues, datacenter, disk, esxi_hostname, folder, force, guest_id, hardware, hostname, is_template, linked_clone, name, name_match, networks, password, port, resource_pool, snapshot_src, state, template, username, uuid, validate_certs, wait_for_ip_address”}
to retry, use: --limit @/etc/ansible/clone_vm_from_template.retry

PLAY RECAP *************************************************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1

remove with_items line all together