Hey folks,
I'm using the vmware_guest module to clone virtual machines (VMs) from a
template and customizing them. When running the same playbook with the same
parameters/values again while the VMs already exist I would expect that
there is nothing to do and task status would just be 'OK'. Instead the task
status is 'Changed' every time I run the playbook.
Now, I'm in doubt wether I hold it wrong or is vmware_guest not idempotent?
Here are my `{defaults,tasks}/main.yml`, playbook and output of the
playbook run:
~~~
$ cat defaults/main.yml
---
# defaults file for vsphere_provision_lab
vsphere_provision_lab_vc_hostname: "vcenter.example.com"
vsphere_provision_lab_vc_username: "[email protected]"
vsphere_provision_lab_vc_password: "ThatsASecret"
vsphere_provision_lab_vc_datacenter: "DC"
vsphere_provision_lab_vc_cluster: "vSphere-Cluster"
vsphere_provision_lab_vc_datastore: "DS1"
vsphere_provision_lab_vc_folder: "/ha-datacenter/vm"
vsphere_provision_lab_guests:
vm1:
vm_template: rhel8-en
vm_ram_mb: 512
vm_vcpu: 1
vm_net: VLAN123
vm_ip: 192.168.0.1
vm_netmask: 255.255.255.0
vm_gateway: 192.168.0.254
vm_domain: sub.example.com
vm_hostname: host1
vm_dns_servers:
- 192.168.0.2
- 192.168.0.3
vm_dns_suffix:
- sub.example.com
- sub2.example.com
- sub3.example.com
vm_second_hdd: false
vm_second_hdd_size_gb: ""
vm_second_hdd_type: ""
vm_second_hdd_datastore: ""
vm_scsi_controller: ""
vm_unit_number: ""
vm_scsi_type: ''
vm2:
vm_template: rhel8-en
vm_ram_mb: 1024
vm_vcpu: 2
vm_net: VLAN123
vm_ip: 192.168.0.5
vm_netmask: 255.255.255.0
vm_gateway: 192.168.0.254
vm_domain: sub.example.com
vm_hostname: host2
vm_dns_servers:
- 192.168.0.2
- 192.168.0.3
vm_dns_suffix:
- sub.example.com
- sub2.example.com
- sub3.example.com
vm_second_hdd: true
vm_second_hdd_size_gb: "10"
vm_second_hdd_type: "thin"
vm_second_hdd_datastore: "DS1"
vm_scsi_controller: "1"
vm_unit_number: "1"
vm_scsi_type: 'paravirtual'
$ cat tasks/main.yml
---
# tasks file for vsphere_provision_lab
- name: Clone virtual machines from RHEL template and customize
vmware_guest:
hostname: "{{ vsphere_provision_lab_vc_hostname }}"
username: "{{ vsphere_provision_lab_vc_username }}"
password: "{{ vsphere_provision_lab_vc_password }}"
datacenter: "{{ vsphere_provision_lab_vc_datacenter }}"
cluster: "{{ vsphere_provision_lab_vc_cluster }}"
datastore: "{{ vsphere_provision_lab_vc_datastore }}"
validate_certs: no
state: present
folder: "{{ vsphere_provision_lab_vc_folder }}"
template: "{{ item.value.vm_template }}"
name: "{{ item.key }}"
hardware:
memory_mb: "{{ item.value.vm_ram_mb }}"
num_cpus: "{{ item.value.vm_vcpu }}"
networks:
- name: "{{ item.value.vm_net }}"
ip: "{{ item.value.vm_ip }}"
netmask: "{{ item.value.vm_netmask }}"
gateway: "{{ item.value.vm_gateway }}"
wait_for_ip_address: True
customization:
domain: "{{ item.value.vm_domain }}"
hostname: "{{ item.value.vm_hostname }}"
dns_servers: "{{ item.value.vm_dns_servers }}"
dns_suffix: "{{ item.value.vm_dns_suffix }}"
delegate_to: localhost
with_dict: "{{ vsphere_provision_lab_guests }}"
- name: Add disks to virtual machine using name
vmware_guest_disk:
hostname: "{{ vsphere_provision_lab_vc_hostname }}"
username: "{{ vsphere_provision_lab_vc_username }}"
password: "{{ vsphere_provision_lab_vc_password }}"
datacenter: "{{ vsphere_provision_lab_vc_datacenter }}"
validate_certs: no
name: "{{ item.key }}"
disk:
- size_gb: "{{ item.value.vm_second_hdd_size_gb }}"
type: "{{ item.value.vm_second_hdd_type }}"
datastore: "{{ item.value.vm_second_hdd_datastore }}"
scsi_controller: "{{ item.value.vm_scsi_controller }}"
unit_number: "{{ item.value.vm_unit_number }}"
scsi_type: "{{ item.value.vm_scsi_type }}"
with_dict: "{{ vsphere_provision_lab_guests }}"
when: item.value.vm_second_hdd is defined and
item.value.vm_second_hdd|bool == true
$ cat vsphere_provision_rhel_lab.yml
---
- hosts: localhost
connection: local
gather_facts: no
vars_files:
- /some/path/vault.vars
- roles/vsphere_provision_lab/vars/rhel.yml
roles:
- vsphere_provision_lab
~~~
The first playbook run produces the following output:
~~~
$ ansible-playbook --ask-vault-pass vsphere_provision_rhel_lab.yml
Vault password:
PLAY [localhost]
***********************************************************************************************************************************************************************************************************************
TASK [vsphere_provision_lab : Clone virtual machines from RHEL template and
customize]
*************************************************************************************************************************************************
changed: [localhost -> localhost] => (item=...)
changed: [localhost -> localhost] => (item=...)
TASK [vsphere_provision_lab : Add disks to virtual machine using name]
*****************************************************************************************************************************************************************
skipping: [localhost] => (item=...)
changed: [localhost] => (item=...)
PLAY RECAP
*****************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=2 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
# NOW I START A SECOND RUN
$ ansible-playbook --ask-vault-pass vsphere_provision_rhel_lab.yml
Vault password:
PLAY [localhost]
***********************************************************************************************************************************************************************************************************************
TASK [vsphere_provision_lab : Clone virtual machines from RHEL template and
customize]
*************************************************************************************************************************************************
changed: [localhost -> localhost] => (item=...)
changed: [localhost -> localhost] => (item=...)
TASK [vsphere_provision_lab : Add disks to virtual machine using name]
*****************************************************************************************************************************************************************
skipping: [localhost] => (item=...)
ok: [localhost] => (item=...)
PLAY RECAP
*****************************************************************************************************************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescued=0 ignored=0
~~~
I truncated the output for a better overview here. But I checked locally
that the values for the task 'vsphere_provision_lab : Clone virtual
machines from RHEL template and customize' are the same in both runs and
the VMs exist before the second run starts. Why is the status 'changed' and
not 'ok' as I would expect?
Kind regards,
Joerg
--
You received this message because you are subscribed to the Google Groups
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/bfc2f2c8-c9eb-48c2-a4bb-63660c2cffa6n%40googlegroups.com.