I’m trying to make a playbook to provision some vsphere vm’s using the vsphere_guest module. However, I cant seem to figure out how to iterate through multiple vm disks using either with_items or with_dict defined in host_vars or group_vars.
Any idea’s on how to make this work?
inventory/vmdeploy:
[vmdeploy]
pxc-01.dev.local vm=pxc-01 ansible_host=192.168.1.101 gw=192.168.1.1 static=true
pxc-02.dev.local vm=pxc-02 ansible_host=192.168.1.102 gw=192.168.1.1 static=true
pxc-03.dev.local vm=pxc-03 ansible_host=192.168.1.103 gw=192.168.1.1 static=true
pxc-04.dev.local vm=pxc-04 ansible_host=192.168.1.104 gw=192.168.1.1 static=true
#group_vars/vmdeploy:
vm_notes: ‘created_by_ansible’
vm_folder: ‘ansible’
vm_network: ‘VM Network’
vm_memory: ‘2048’
vm_vcpu: ‘2’
vm_osid: ‘centos64Guest’
vm_disks:
disk1:
size: ‘16’
type: ‘thin’
disk2:
size: ‘30’
type: ‘thin’
#playbooks/vmdeploy.yml:
- hosts: all
connection: local
user: root
sudo: false
gather_facts: false
vars:
vcenter_hostname: “{{ vc_host }}”
vcenter_user: “{{ lookup(‘env’,‘vc_user’) }}”
vcenter_pass: “{{ lookup(‘env’,‘vc_pass’) }}”
esxi_cluster: ‘"{{ vc_cluster }}’
vcenter_datastore: “{{ vc_datastore }}”
vcenter_datacenter: “{{ vc_datacenter }}”
esxi_host: “{{ esxi_host }}”
tasks:
-
debug: msg=“disk={{item}} disk_type={{hostvars[inventory_hostname][‘vm_disk’][item][‘type’]}} disk_size={{hostvars[inventory_hostname][‘vm_disk’][item][‘size’]}} datastore={{hostvars[inventory_hostname][‘vm_disk’][item][‘datastore’]}}”
with_items: “{{vm_disk}}” -
vsphere_guest:
vcenter_hostname: “{{ vcenter_hostname }}”
username: “{{ vcenter_user }}”
password: “{{ vcenter_pass }}”
guest: “{{ inventory_hostname }}”
state: “{{ vm_state|default(‘present’) }}”
vm_extra_config:
notes: “{{ vm_notes }}”
folder: “{{ vm_folder }}”
vm_disk:
“{{item}}”:
size_gb: “{{hostvars[inventory_hostname][‘vm_disk’][item][‘size’]|int}}”
type: “{{hostvars[inventory_hostname][‘vm_disk’][item][‘type’]}}”
datastore: “{{hostvars[inventory_hostname][‘vm_disk’][item][‘datastore’]}}”
vm_nic:
nic1:
type: vmxnet3
network: “{{ vm_network }}”
network_type: “standard”
vm_hardware:
memory_mb: “{{ vm_memory }}”
num_cpus: “{{ vm_vcpu }}”
osid: “{{ vm_osid }}”
scsi: paravirtual
cluster: “{{ esxi_cluster }}”
esxi:
hostname: “{{ esxi_host }}”
datacenter: “{{ vcenter_datacenter }}”
with_items: “{{vm_disk}}”
ansible-play -i inventory/vmdeploy playbooks/vmdeploy.yml
TASK [debug] *******************************************************************
ok: [pxc-01.dev.local] => (item=disk1) => {
“item”: “disk1”,
“msg”: “disk=disk1 disk_type=thin disk_size=16 datastore=testds”
}
ok: [pxc-01.dev.local] => (item=disk2) => {
“item”: “disk2”,
“msg”: “disk=disk2 disk_type=thin disk_size=30 datastore=testds”
}
ok: [pxc-02.dev.local] => (item=disk1) => {
“item”: “disk1”,
“msg”: “disk=disk1 disk_type=thin disk_size=16 datastore=testds”
}
ok: [pxc-03.dev.local] => (item=disk1) => {
“item”: “disk1”,
“msg”: “disk=disk1 disk_type=thin disk_size=16 datastore=testds”
}
ok: [pxc-04.dev.local] => (item=disk1) => {
“item”: “disk1”,
“msg”: “disk=disk1 disk_type=thin disk_size=16 datastore=testds”
}
ok: [pxc-02.dev.local] => (item=disk2) => {
“item”: “disk2”,
“msg”: “disk=disk2 disk_type=thin disk_size=30 datastore=testds”
}
ok: [pxc-03.dev.local] => (item=disk2) => {
“item”: “disk2”,
“msg”: “disk=disk2 disk_type=thin disk_size=30 datastore=testds”
}
ok: [pxc-04.dev.local] => (item=disk2) => {
“item”: “disk2”,
“msg”: “disk=disk2 disk_type=thin disk_size=30 datastore=testds”
}
TASK [vsphere_guest] ***********************************************************
failed: [pxc-02.dev.local] (item=disk1) => {“failed”: true, “item”: “disk1”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}
failed: [pxc-04.dev.local] (item=disk1) => {“failed”: true, “item”: “disk1”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}
failed: [pxc-03.dev.local] (item=disk1) => {“failed”: true, “item”: “disk1”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}
failed: [pxc-01.dev.local] (item=disk1) => {“failed”: true, “item”: “disk1”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}
failed: [pxc-02.dev.local] (item=disk2) => {“failed”: true, “item”: “disk2”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}
failed: [pxc-01.dev.local] (item=disk2) => {“failed”: true, “item”: “disk2”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}
failed: [pxc-03.dev.local] (item=disk2) => {“failed”: true, “item”: “disk2”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}
failed: [pxc-04.dev.local] (item=disk2) => {“failed”: true, “item”: “disk2”, “msg”: “Missing required key/pair [disk1]. vm_disk must contain {‘disk1’: {‘datastore’: <type ‘basestring’>, ‘type’: <type ‘basestring’>, ‘size_gb’: <type ‘int’>}}”}