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.

Reply via email to