VMware: Use managed object id to find VM (#59143)

* Based upon partial work of wilmardo
* Now, user can specify managed object id of virtual machine to find
an existing virtual machine

Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
This commit is contained in:
Abhijeet Kasurde 2019-07-18 07:38:12 +05:30 committed by GitHub
parent 28259ee247
commit 8a13b41823
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 604 additions and 153 deletions

View file

@ -880,7 +880,7 @@ class PyVmomi(object):
# Virtual Machine related functions # Virtual Machine related functions
def get_vm(self): def get_vm(self):
""" """
Find unique virtual machine either by UUID or Name. Find unique virtual machine either by UUID, MoID or Name.
Returns: virtual machine object if found, else None. Returns: virtual machine object if found, else None.
""" """
@ -959,6 +959,8 @@ class PyVmomi(object):
elif vms: elif vms:
# Unique virtual machine found. # Unique virtual machine found.
vm_obj = vms[0] vm_obj = vms[0]
elif self.params['moid']:
vm_obj = VmomiSupport.templateOf('VirtualMachine')(self.params['moid'], self.si._stub)
if vm_obj: if vm_obj:
self.current_vm_obj = vm_obj self.current_vm_obj = vm_obj

View file

@ -28,11 +28,17 @@ options:
name: name:
description: description:
- Name of the virtual machine to export. - Name of the virtual machine to export.
- This is a required parameter, if parameter C(uuid) is not supplied. - This is a required parameter, if parameter C(uuid) or C(moid) is not supplied.
uuid: uuid:
description: description:
- Uuid of the virtual machine to export. - Uuid of the virtual machine to export.
- This is a required parameter, if parameter C(name) is not supplied. - This is a required parameter, if parameter C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
datacenter: datacenter:
default: ha-datacenter default: ha-datacenter
description: description:
@ -304,6 +310,7 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str', default='ha-datacenter'), datacenter=dict(type='str', default='ha-datacenter'),
export_dir=dict(type='str'), export_dir=dict(type='str'),
@ -313,7 +320,7 @@ def main():
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(argument_spec=argument_spec,
supports_check_mode=True, supports_check_mode=True,
required_one_of=[ required_one_of=[
['name', 'uuid'], ['name', 'uuid', 'moid'],
], ],
) )
pyv = VMwareExportVmOvf(module) pyv = VMwareExportVmOvf(module)

View file

@ -20,10 +20,10 @@ DOCUMENTATION = '''
module: vmware_guest_boot_facts module: vmware_guest_boot_facts
short_description: Gather facts about boot options for the given virtual machine short_description: Gather facts about boot options for the given virtual machine
description: description:
- This module can be used to gather facts aboyt boot options for the given virtual machine. - Gather facts about boot options for the given virtual machine.
version_added: 2.7 version_added: 2.7
author: author:
- Abhijeet Kasurde (@Akasurde) <akasurde@redhat.com> - Abhijeet Kasurde (@Akasurde)
notes: notes:
- Tested on vSphere 6.5 - Tested on vSphere 6.5
requirements: requirements:
@ -33,11 +33,17 @@ options:
name: name:
description: description:
- Name of the VM to work with. - Name of the VM to work with.
- This is required if C(uuid) parameter is not supplied. - This is required if C(uuid) or C(moid) parameter is not supplied.
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's BIOS UUID by default. - UUID of the instance to manage if known, this is VMware's BIOS UUID by default.
- This is required if C(name) parameter is not supplied. - This is required if C(name) or C(moid) parameter is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -61,6 +67,15 @@ EXAMPLES = r'''
validate_certs: no validate_certs: no
name: "{{ vm_name }}" name: "{{ vm_name }}"
register: vm_boot_order_facts register: vm_boot_order_facts
- name: Gather facts about virtual machine's boot order using MoID
vmware_guest_boot_facts:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
moid: "vm-42"
register: vm_moid_boot_order_facts
''' '''
RETURN = r""" RETURN = r"""
@ -89,7 +104,7 @@ from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, find_vm_by_id from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, find_vm_by_id
try: try:
from pyVmomi import vim from pyVmomi import vim, VmomiSupport
except ImportError: except ImportError:
pass pass
@ -99,6 +114,7 @@ class VmBootFactsManager(PyVmomi):
super(VmBootFactsManager, self).__init__(module) super(VmBootFactsManager, self).__init__(module)
self.name = self.params['name'] self.name = self.params['name']
self.uuid = self.params['uuid'] self.uuid = self.params['uuid']
self.moid = self.params['moid']
self.use_instance_uuid = self.params['use_instance_uuid'] self.use_instance_uuid = self.params['use_instance_uuid']
self.vm = None self.vm = None
@ -120,13 +136,18 @@ class VmBootFactsManager(PyVmomi):
if temp_vm_object.obj.name == self.name: if temp_vm_object.obj.name == self.name:
vms.append(temp_vm_object.obj) vms.append(temp_vm_object.obj)
elif self.moid:
vm_obj = VmomiSupport.templateOf('VirtualMachine')(self.module.params['moid'], self.si._stub)
if vm_obj:
vms.append(vm_obj)
if vms: if vms:
if self.params.get('name_match') == 'first': if self.params.get('name_match') == 'first':
self.vm = vms[0] self.vm = vms[0]
elif self.params.get('name_match') == 'last': elif self.params.get('name_match') == 'last':
self.vm = vms[-1] self.vm = vms[-1]
else: else:
self.module.fail_json(msg="Failed to find virtual machine using %s" % (self.name or self.uuid)) self.module.fail_json(msg="Failed to find virtual machine using %s" % (self.name or self.uuid or self.moid))
@staticmethod @staticmethod
def humanize_boot_order(boot_order): def humanize_boot_order(boot_order):
@ -165,6 +186,7 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
name_match=dict( name_match=dict(
choices=['first', 'last'], choices=['first', 'last'],
@ -175,10 +197,10 @@ def main():
module = AnsibleModule( module = AnsibleModule(
argument_spec=argument_spec, argument_spec=argument_spec,
required_one_of=[ required_one_of=[
['name', 'uuid'] ['name', 'uuid', 'moid']
], ],
mutually_exclusive=[ mutually_exclusive=[
['name', 'uuid'] ['name', 'uuid', 'moid']
], ],
supports_check_mode=True, supports_check_mode=True,
) )

View file

@ -33,11 +33,17 @@ options:
name: name:
description: description:
- Name of the VM to work with. - Name of the VM to work with.
- This is required if C(uuid) parameter is not supplied. - This is required if C(uuid) or C(moid) parameter is not supplied.
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's BIOS UUID by default. - UUID of the instance to manage if known, this is VMware's BIOS UUID by default.
- This is required if C(name) parameter is not supplied. - This is required if C(name) or C(moid) parameter is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -107,6 +113,26 @@ EXAMPLES = r'''
- disk - disk
delegate_to: localhost delegate_to: localhost
register: vm_boot_order register: vm_boot_order
- name: Change virtual machine's boot order using Virtual Machine MoID
vmware_guest_boot_manager:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
moid: vm-42
boot_delay: 2000
enter_bios_setup: True
boot_retry_enabled: True
boot_retry_delay: 22300
boot_firmware: bios
secure_boot_enabled: False
boot_order:
- floppy
- cdrom
- ethernet
- disk
delegate_to: localhost
register: vm_boot_order
''' '''
RETURN = r""" RETURN = r"""
@ -148,7 +174,7 @@ from ansible.module_utils._text import to_native
from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, find_vm_by_id, wait_for_task, TaskError from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, find_vm_by_id, wait_for_task, TaskError
try: try:
from pyVmomi import vim from pyVmomi import vim, VmomiSupport
except ImportError: except ImportError:
pass pass
@ -158,6 +184,7 @@ class VmBootManager(PyVmomi):
super(VmBootManager, self).__init__(module) super(VmBootManager, self).__init__(module)
self.name = self.params['name'] self.name = self.params['name']
self.uuid = self.params['uuid'] self.uuid = self.params['uuid']
self.moid = self.params['moid']
self.use_instance_uuid = self.params['use_instance_uuid'] self.use_instance_uuid = self.params['use_instance_uuid']
self.vm = None self.vm = None
@ -179,6 +206,11 @@ class VmBootManager(PyVmomi):
if temp_vm_object.obj.name == self.name: if temp_vm_object.obj.name == self.name:
vms.append(temp_vm_object.obj) vms.append(temp_vm_object.obj)
elif self.moid:
vm_obj = VmomiSupport.templateOf('VirtualMachine')(self.module.params['moid'], self.si._stub)
if vm_obj:
vms.append(vm_obj)
if vms: if vms:
if self.params.get('name_match') == 'first': if self.params.get('name_match') == 'first':
self.vm = vms[0] self.vm = vms[0]
@ -324,6 +356,7 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
boot_order=dict( boot_order=dict(
type='list', type='list',
@ -362,10 +395,10 @@ def main():
module = AnsibleModule( module = AnsibleModule(
argument_spec=argument_spec, argument_spec=argument_spec,
required_one_of=[ required_one_of=[
['name', 'uuid'] ['name', 'uuid', 'moid']
], ],
mutually_exclusive=[ mutually_exclusive=[
['name', 'uuid'] ['name', 'uuid', 'moid']
], ],
) )

View file

@ -36,6 +36,7 @@ options:
name: name:
description: description:
- Name of the virtual machine to work with. - Name of the virtual machine to work with.
- This is required parameter, if C(uuid) or C(moid) is not supplied.
required: True required: True
state: state:
description: description:
@ -47,7 +48,13 @@ options:
uuid: uuid:
description: description:
- UUID of the virtual machine to manage if known. This is VMware's unique identifier. - UUID of the virtual machine to manage if known. This is VMware's unique identifier.
- This is required parameter, if C(name) is not supplied. - This is required parameter, if C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -111,6 +118,17 @@ EXAMPLES = '''
delegate_to: localhost delegate_to: localhost
register: attributes register: attributes
- name: Remove virtual machine Attribute using Virtual Machine MoID
vmware_guest_custom_attributes:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
moid: vm-42
state: absent
attributes:
- name: MyAttribute
delegate_to: localhost
register: attributes
''' '''
RETURN = """ RETURN = """
@ -185,6 +203,7 @@ def main():
name=dict(required=True, type='str'), name=dict(required=True, type='str'),
folder=dict(type='str'), folder=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
state=dict(type='str', default='present', state=dict(type='str', default='present',
choices=['absent', 'present']), choices=['absent', 'present']),
@ -201,7 +220,9 @@ def main():
module = AnsibleModule( module = AnsibleModule(
argument_spec=argument_spec, argument_spec=argument_spec,
supports_check_mode=True, supports_check_mode=True,
required_one_of=[['name', 'uuid']], required_one_of=[
['name', 'uuid', 'moid']
],
) )
if module.params.get('folder'): if module.params.get('folder'):
@ -224,8 +245,9 @@ def main():
module.exit_json(**results) module.exit_json(**results)
else: else:
# virtual machine does not exists # virtual machine does not exists
vm_id = (module.params.get('name') or module.params.get('uuid') or module.params.get('moid'))
module.fail_json(msg="Unable to manage custom attributes for non-existing" module.fail_json(msg="Unable to manage custom attributes for non-existing"
" virtual machine %s" % (module.params.get('name') or module.params.get('uuid'))) " virtual machine %s" % vm_id)
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -36,11 +36,17 @@ options:
name: name:
description: description:
- Name of the virtual machine. - Name of the virtual machine.
- This is a required parameter, if parameter C(uuid) is not supplied. - This is a required parameter, if parameter C(uuid) or C(moid) is not supplied.
uuid: uuid:
description: description:
- UUID of the instance to gather facts if known, this is VMware's unique identifier. - UUID of the instance to gather facts if known, this is VMware's unique identifier.
- This is a required parameter, if parameter C(name) is not supplied. - This is a required parameter, if parameter C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
folder: folder:
description: description:
- Destination folder, absolute or relative path to find an existing guest. - Destination folder, absolute or relative path to find an existing guest.
@ -74,7 +80,7 @@ options:
- 'Valid attributes are:' - 'Valid attributes are:'
- ' - C(size[_tb,_gb,_mb,_kb]) (integer): Disk storage size in specified unit.' - ' - C(size[_tb,_gb,_mb,_kb]) (integer): Disk storage size in specified unit.'
- ' If C(size) specified then unit must be specified. There is no space allowed in between size number and unit.' - ' If C(size) specified then unit must be specified. There is no space allowed in between size number and unit.'
- ' Only first occurance in disk element will be considered, even if there are multiple size* parameters available.' - ' Only first occurrence in disk element will be considered, even if there are multiple size* parameters available.'
- ' - C(type) (string): Valid values are:' - ' - C(type) (string): Valid values are:'
- ' - C(thin) thin disk' - ' - C(thin) thin disk'
- ' - C(eagerzeroedthick) eagerzeroedthick disk' - ' - C(eagerzeroedthick) eagerzeroedthick disk'
@ -147,6 +153,21 @@ EXAMPLES = '''
unit_number: 1 unit_number: 1
delegate_to: localhost delegate_to: localhost
register: disk_facts register: disk_facts
- name: Remove disks from virtual machine using moid
vmware_guest_disk:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
validate_certs: no
moid: vm-42
disk:
- state: absent
scsi_controller: 1
unit_number: 1
delegate_to: localhost
register: disk_facts
''' '''
RETURN = """ RETURN = """
@ -578,7 +599,7 @@ class PyVmomiHelper(PyVmomi):
rec = self.content.storageResourceManager.RecommendDatastores(storageSpec=storage_spec) rec = self.content.storageResourceManager.RecommendDatastores(storageSpec=storage_spec)
rec_action = rec.recommendations[0].action[0] rec_action = rec.recommendations[0].action[0]
return rec_action.destination.name return rec_action.destination.name
except Exception as e: except Exception:
# There is some error so we fall back to general workflow # There is some error so we fall back to general workflow
pass pass
datastore = None datastore = None
@ -633,13 +654,18 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str', required=True), datacenter=dict(type='str', required=True),
disk=dict(type='list', default=[]), disk=dict(type='list', default=[]),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
) )
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(
required_one_of=[['name', 'uuid']]) argument_spec=argument_spec,
required_one_of=[
['name', 'uuid', 'moid']
]
)
if module.params['folder']: if module.params['folder']:
# FindByInventoryPath() does not require an absolute path # FindByInventoryPath() does not require an absolute path
@ -653,8 +679,9 @@ def main():
if not vm: if not vm:
# We unable to find the virtual machine user specified # We unable to find the virtual machine user specified
# Bail out # Bail out
vm_id = (module.params.get('name') or module.params.get('uuid') or module.params.get('moid'))
module.fail_json(msg="Unable to manage disks for non-existing" module.fail_json(msg="Unable to manage disks for non-existing"
" virtual machine '%s'." % (module.params.get('uuid') or module.params.get('name'))) " virtual machine '%s'." % vm_id)
# VM exists # VM exists
try: try:

View file

@ -36,11 +36,17 @@ options:
name: name:
description: description:
- Name of the virtual machine. - Name of the virtual machine.
- This is required parameter, if parameter C(uuid) is not supplied. - This is required parameter, if parameter C(uuid) or C(moid) is not supplied.
uuid: uuid:
description: description:
- UUID of the instance to gather facts if known, this is VMware's unique identifier. - UUID of the instance to gather facts if known, this is VMware's unique identifier.
- This is required parameter, if parameter C(name) is not supplied. - This is required parameter, if parameter C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -62,8 +68,6 @@ options:
- ' folder: /folder1/datacenter1/vm' - ' folder: /folder1/datacenter1/vm'
- ' folder: folder1/datacenter1/vm' - ' folder: folder1/datacenter1/vm'
- ' folder: /folder1/datacenter1/vm/folder2' - ' folder: /folder1/datacenter1/vm/folder2'
- ' folder: vm/folder2'
- ' folder: folder2'
datacenter: datacenter:
description: description:
- The datacenter name to which virtual machine belongs to. - The datacenter name to which virtual machine belongs to.
@ -93,6 +97,17 @@ EXAMPLES = '''
name: VM_225 name: VM_225
delegate_to: localhost delegate_to: localhost
register: disk_facts register: disk_facts
- name: Gather disk facts from virtual machine using moid
vmware_guest_disk_facts:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: ha-datacenter
validate_certs: no
moid: vm-42
delegate_to: localhost
register: disk_facts
''' '''
RETURN = """ RETURN = """
@ -270,13 +285,16 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str', required=True), datacenter=dict(type='str', required=True),
) )
module = AnsibleModule( module = AnsibleModule(
argument_spec=argument_spec, argument_spec=argument_spec,
required_one_of=[['name', 'uuid']], required_one_of=[
['name', 'uuid', 'moid']
],
supports_check_mode=True, supports_check_mode=True,
) )
@ -298,7 +316,8 @@ def main():
else: else:
# We unable to find the virtual machine user specified # We unable to find the virtual machine user specified
# Bail out # Bail out
module.fail_json(msg="Unable to gather disk facts for non-existing VM %s" % (module.params.get('uuid') or module.params.get('name'))) vm_id = (module.params.get('uuid') or module.params.get('moid') or module.params.get('name'))
module.fail_json(msg="Unable to gather disk facts for non-existing VM %s" % vm_id)
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -34,7 +34,7 @@ options:
name: name:
description: description:
- Name of the VM to work with - Name of the VM to work with
- This is required if UUID is not supplied. - This is required if C(uuid) or C(moid) is not supplied.
name_match: name_match:
description: description:
- If multiple VMs matching the name, use the first or last found - If multiple VMs matching the name, use the first or last found
@ -43,13 +43,19 @@ options:
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's unique identifier. - UUID of the instance to manage if known, this is VMware's unique identifier.
- This is required if name is not supplied. - This is required if C(name) or C(moid) is not supplied.
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
default: no default: no
type: bool type: bool
version_added: '2.8' version_added: '2.8'
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
folder: folder:
description: description:
- Destination folder, absolute or relative path to find an existing guest. - Destination folder, absolute or relative path to find an existing guest.
@ -65,8 +71,6 @@ options:
- ' folder: /folder1/datacenter1/vm' - ' folder: /folder1/datacenter1/vm'
- ' folder: folder1/datacenter1/vm' - ' folder: folder1/datacenter1/vm'
- ' folder: /folder1/datacenter1/vm/folder2' - ' folder: /folder1/datacenter1/vm/folder2'
- ' folder: vm/folder2'
- ' folder: folder2'
datacenter: datacenter:
description: description:
- Destination datacenter for the deploy operation - Destination datacenter for the deploy operation
@ -134,6 +138,19 @@ EXAMPLES = '''
delegate_to: localhost delegate_to: localhost
register: facts register: facts
- name: Gather some facts from a guest using MoID
vmware_guest_facts:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter_name }}"
moid: vm-42
schema: "vsphere"
properties: ["config.hardware.memoryMB", "guest.disk", "overallStatus"]
delegate_to: localhost
register: vm_moid_facts
- name: Gather Managed object ID (moid) from a guest using the vSphere API output schema for REST Calls - name: Gather Managed object ID (moid) from a guest using the vSphere API output schema for REST Calls
vmware_guest_facts: vmware_guest_facts:
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
@ -237,6 +254,7 @@ def main():
name_match=dict(type='str', choices=['first', 'last'], default='first'), name_match=dict(type='str', choices=['first', 'last'], default='first'),
uuid=dict(type='str'), uuid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str', required=True), datacenter=dict(type='str', required=True),
tags=dict(type='bool', default=False), tags=dict(type='bool', default=False),
@ -244,7 +262,7 @@ def main():
properties=dict(type='list') properties=dict(type='list')
) )
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(argument_spec=argument_spec,
required_one_of=[['name', 'uuid']], required_one_of=[['name', 'uuid', 'moid']],
supports_check_mode=True) supports_check_mode=True)
if module.params.get('folder'): if module.params.get('folder'):
@ -282,8 +300,8 @@ def main():
except Exception as exc: except Exception as exc:
module.fail_json(msg="Fact gather failed with exception %s" % to_text(exc)) module.fail_json(msg="Fact gather failed with exception %s" % to_text(exc))
else: else:
module.fail_json(msg="Unable to gather facts for non-existing VM %s" % (module.params.get('uuid') or vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
module.params.get('name'))) module.fail_json(msg="Unable to gather facts for non-existing VM %s" % vm_id)
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -32,11 +32,17 @@ options:
name: name:
description: description:
- Name of the existing virtual machine to move. - Name of the existing virtual machine to move.
- This is required if C(UUID) is not supplied. - This is required if C(uuid) or C(moid) is not supplied.
uuid: uuid:
description: description:
- UUID of the virtual machine to manage if known, this is VMware's unique identifier. - UUID of the virtual machine to manage if known, this is VMware's unique identifier.
- This is required if C(name) is not supplied. - This is required if C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -83,6 +89,17 @@ EXAMPLES = r'''
dest_folder: "/{{ datacenter }}/vm" dest_folder: "/{{ datacenter }}/vm"
delegate_to: localhost delegate_to: localhost
- name: Move Virtual Machine using MoID
vmware_guest_move:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: datacenter
validate_certs: no
moid: vm-42
dest_folder: "/{{ datacenter }}/vm"
delegate_to: localhost
- name: Get VM UUID - name: Get VM UUID
vmware_guest_facts: vmware_guest_facts:
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
@ -175,6 +192,7 @@ def main():
name_match=dict( name_match=dict(
type='str', choices=['first', 'last'], default='first'), type='str', choices=['first', 'last'], default='first'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
dest_folder=dict(type='str', required=True), dest_folder=dict(type='str', required=True),
datacenter=dict(type='str', required=True), datacenter=dict(type='str', required=True),
@ -182,10 +200,10 @@ def main():
module = AnsibleModule( module = AnsibleModule(
argument_spec=argument_spec, argument_spec=argument_spec,
required_one_of=[ required_one_of=[
['name', 'uuid'] ['name', 'uuid', 'moid']
], ],
mutually_exclusive=[ mutually_exclusive=[
['name', 'uuid'] ['name', 'uuid', 'moid']
], ],
supports_check_mode=True supports_check_mode=True
) )
@ -229,9 +247,8 @@ def main():
else: else:
if module.check_mode: if module.check_mode:
module.exit_json(changed=False) module.exit_json(changed=False)
module.fail_json(msg="Unable to find VM %s to move to %s" % ( vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
(module.params.get('uuid') or module.params.get('name')), module.fail_json(msg="Unable to find VM %s to move to %s" % (vm_id, module.params.get('dest_folder')))
module.params.get('dest_folder')))
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -32,12 +32,17 @@ options:
name: name:
description: description:
- Name of the virtual machine. - Name of the virtual machine.
- This is a required parameter, if parameter C(uuid) is not supplied. - This is a required parameter, if parameter C(uuid) or C(moid) is not supplied.
type: str type: str
uuid: uuid:
description: description:
- UUID of the instance to gather facts if known, this is VMware's unique identifier. - UUID of the instance to gather facts if known, this is VMware's unique identifier.
- This is a required parameter, if parameter C(name) is not supplied. - This is a required parameter, if parameter C(name) or C(moid) is not supplied.
type: str
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
type: str type: str
folder: folder:
description: description:
@ -134,6 +139,20 @@ EXAMPLES = '''
mac: "00:50:56:44:55:77" mac: "00:50:56:44:55:77"
delegate_to: localhost delegate_to: localhost
register: network_facts register: network_facts
- name: Change network adapter settings of virtual machine using MoID
vmware_guest_network:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
validate_certs: no
moid: vm-42
gather_network_facts: false
networks:
- state: absent
mac: "00:50:56:44:55:77"
delegate_to: localhost
''' '''
RETURN = """ RETURN = """
@ -156,8 +175,6 @@ network_data:
} }
""" """
import re
try: try:
from pyVmomi import vim from pyVmomi import vim
except ImportError: except ImportError:
@ -166,7 +183,7 @@ except ImportError:
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.network import is_mac from ansible.module_utils.common.network import is_mac
from ansible.module_utils._text import to_native, to_text from ansible.module_utils._text import to_native, to_text
from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, wait_for_task, find_obj, get_all_objs, get_parent_datacenter from ansible.module_utils.vmware import PyVmomi, vmware_argument_spec, wait_for_task, get_all_objs, get_parent_datacenter
class PyVmomiHelper(PyVmomi): class PyVmomiHelper(PyVmomi):
@ -435,6 +452,7 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str', default='ha-datacenter'), datacenter=dict(type='str', default='ha-datacenter'),
esxi_hostname=dict(type='str'), esxi_hostname=dict(type='str'),
@ -443,12 +461,18 @@ def main():
networks=dict(type='list', default=[]) networks=dict(type='list', default=[])
) )
module = AnsibleModule(argument_spec=argument_spec, required_one_of=[['name', 'uuid']]) module = AnsibleModule(
argument_spec=argument_spec,
required_one_of=[
['name', 'uuid', 'moid']
]
)
pyv = PyVmomiHelper(module) pyv = PyVmomiHelper(module)
vm = pyv.get_vm() vm = pyv.get_vm()
if not vm: if not vm:
module.fail_json(msg='Unable to find the specified virtual machine uuid: %s, name: %s ' vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
% ((module.params.get('uuid')), (module.params.get('name')))) module.fail_json(msg='Unable to find the specified virtual machine using %s' % vm_id)
result = pyv.reconfigure_vm_network(vm) result = pyv.reconfigure_vm_network(vm)
if result['failed']: if result['failed']:

View file

@ -41,7 +41,13 @@ options:
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's unique identifier. - UUID of the instance to manage if known, this is VMware's unique identifier.
- This is required if name is not supplied. - This is required if C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -118,6 +124,18 @@ EXAMPLES = r'''
delegate_to: localhost delegate_to: localhost
register: deploy register: deploy
- name: Set the state of a virtual machine to poweron using MoID
vmware_guest_powerstate:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
folder: "/{{ datacenter_name }}/vm/my_folder"
moid: vm-42
state: powered-on
delegate_to: localhost
register: deploy
- name: Set the state of a virtual machine to poweroff at given scheduled time - name: Set the state of a virtual machine to poweroff at given scheduled time
vmware_guest_powerstate: vmware_guest_powerstate:
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
@ -167,6 +185,7 @@ def main():
name=dict(type='str'), name=dict(type='str'),
name_match=dict(type='str', choices=['first', 'last'], default='first'), name_match=dict(type='str', choices=['first', 'last'], default='first'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
folder=dict(type='str'), folder=dict(type='str'),
force=dict(type='bool', default=False), force=dict(type='bool', default=False),
@ -177,12 +196,13 @@ def main():
state_change_timeout=dict(type='int', default=0), state_change_timeout=dict(type='int', default=0),
) )
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(
supports_check_mode=False, argument_spec=argument_spec,
mutually_exclusive=[ supports_check_mode=False,
['name', 'uuid'], mutually_exclusive=[
], ['name', 'uuid', 'moid'],
) ],
)
result = dict(changed=False,) result = dict(changed=False,)
@ -244,7 +264,8 @@ def main():
else: else:
result = set_vm_power_state(pyv.content, vm, module.params['state'], module.params['force'], module.params['state_change_timeout']) result = set_vm_power_state(pyv.content, vm, module.params['state'], module.params['force'], module.params['state_change_timeout'])
else: else:
module.fail_json(msg="Unable to set power state for non-existing virtual machine : '%s'" % (module.params.get('uuid') or module.params.get('name'))) id = module.params.get('uuid') or module.params.get('moid') or module.params.get('name')
module.fail_json(msg="Unable to set power state for non-existing virtual machine : '%s'" % id)
if result.get('failed') is True: if result.get('failed') is True:
module.fail_json(**result) module.fail_json(**result)

View file

@ -32,12 +32,18 @@ options:
name: name:
description: description:
- Name of the virtual machine. - Name of the virtual machine.
- This is a required parameter, if parameter C(uuid) is not supplied. - This is a required parameter, if parameter C(uuid) or C(moid) is not supplied.
type: str type: str
uuid: uuid:
description: description:
- UUID of the instance to gather facts if known, this is VMware's unique identifier. - UUID of the instance to gather facts if known, this is VMware's unique identifier.
- This is a required parameter, if parameter C(name) is not supplied. - This is a required parameter, if parameter C(name) or C(moid) is not supplied.
type: str
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str type: str
folder: folder:
description: description:
@ -95,6 +101,19 @@ EXAMPLES = '''
local_path: "/tmp/" local_path: "/tmp/"
delegate_to: localhost delegate_to: localhost
register: take_screenshot register: take_screenshot
- name: Take a screenshot of the virtual machine console using MoID
vmware_guest_screenshot:
validate_certs: no
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
folder: "{{ folder_name }}"
moid: vm-42
local_path: "/tmp/"
delegate_to: localhost
register: take_screenshot
''' '''
RETURN = """ RETURN = """
@ -244,18 +263,24 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str'), datacenter=dict(type='str'),
esxi_hostname=dict(type='str'), esxi_hostname=dict(type='str'),
cluster=dict(type='str'), cluster=dict(type='str'),
local_path=dict(type='str'), local_path=dict(type='str'),
) )
module = AnsibleModule(argument_spec=argument_spec, required_one_of=[['name', 'uuid']]) module = AnsibleModule(
argument_spec=argument_spec,
required_one_of=[
['name', 'uuid', 'moid']
]
)
pyv = PyVmomiHelper(module) pyv = PyVmomiHelper(module)
vm = pyv.get_vm() vm = pyv.get_vm()
if not vm: if not vm:
module.fail_json(msg='Unable to find the specified virtual machine uuid: %s, name: %s ' vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
% ((module.params.get('uuid')), (module.params.get('name')))) module.fail_json(msg='Unable to find the specified virtual machine : %s' % vm_id)
result = pyv.take_vm_screenshot() result = pyv.take_vm_screenshot()
if result['failed']: if result['failed']:

View file

@ -32,12 +32,17 @@ options:
name: name:
description: description:
- Name of the virtual machine. - Name of the virtual machine.
- This is a required parameter, if parameter C(uuid) is not supplied. - This is a required parameter, if parameter C(uuid) or C(moid) is not supplied.
type: str type: str
uuid: uuid:
description: description:
- UUID of the instance to gather facts if known, this is VMware's unique identifier. - UUID of the instance to gather facts if known, this is VMware's unique identifier.
- This is a required parameter, if parameter C(name) is not supplied. - This is a required parameter, if parameter C(name) or C(moid) is not supplied.
type: str
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
type: str type: str
folder: folder:
description: description:
@ -87,7 +92,7 @@ extends_documentation_fragment: vmware.documentation
''' '''
EXAMPLES = ''' EXAMPLES = '''
- name: send list of keys to virtual machine - name: Send list of keys to virtual machine
vmware_guest_sendkey: vmware_guest_sendkey:
validate_certs: no validate_certs: no
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
@ -103,7 +108,21 @@ EXAMPLES = '''
delegate_to: localhost delegate_to: localhost
register: keys_num_sent register: keys_num_sent
- name: send a string to virtual machine - name: Send list of keys to virtual machine using MoID
vmware_guest_sendkey:
validate_certs: no
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
folder: "{{ folder_name }}"
moid: vm-42
keys_send:
- CTRL_ALT_DEL
delegate_to: localhost
register: ctrl_alt_del_sent
- name: Send a string to virtual machine
vmware_guest_sendkey: vmware_guest_sendkey:
validate_certs: no validate_certs: no
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
@ -336,6 +355,7 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str'), datacenter=dict(type='str'),
esxi_hostname=dict(type='str'), esxi_hostname=dict(type='str'),
@ -344,12 +364,18 @@ def main():
string_send=dict(type='str') string_send=dict(type='str')
) )
module = AnsibleModule(argument_spec=argument_spec, required_one_of=[['name', 'uuid']]) module = AnsibleModule(
argument_spec=argument_spec,
required_one_of=[
['name', 'uuid', 'moid']
]
)
pyv = PyVmomiHelper(module) pyv = PyVmomiHelper(module)
vm = pyv.get_vm() vm = pyv.get_vm()
if not vm: if not vm:
module.fail_json(msg='Unable to find the specified virtual machine uuid: %s, name: %s ' vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
% ((module.params.get('uuid')), (module.params.get('name')))) module.fail_json(msg='Unable to find the specified virtual machine : %s ' % vm_id)
result = pyv.send_key_to_vm(vm) result = pyv.send_key_to_vm(vm)
if result['failed']: if result['failed']:

View file

@ -44,7 +44,7 @@ options:
name: name:
description: description:
- Name of the virtual machine to work with. - Name of the virtual machine to work with.
- This is required parameter, if C(uuid) is not supplied. - This is required parameter, if C(uuid) or C(moid) is not supplied.
name_match: name_match:
description: description:
- If multiple VMs matching the name, use the first or last found. - If multiple VMs matching the name, use the first or last found.
@ -53,7 +53,13 @@ options:
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's BIOS UUID by default. - UUID of the instance to manage if known, this is VMware's BIOS UUID by default.
- This is required if C(name) parameter is not supplied. - This is required if C(name) or C(moid) parameter is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -75,8 +81,6 @@ options:
- ' folder: /folder1/datacenter1/vm' - ' folder: /folder1/datacenter1/vm'
- ' folder: folder1/datacenter1/vm' - ' folder: folder1/datacenter1/vm'
- ' folder: /folder1/datacenter1/vm/folder2' - ' folder: /folder1/datacenter1/vm/folder2'
- ' folder: vm/folder2'
- ' folder: folder2'
datacenter: datacenter:
description: description:
- Destination datacenter for the deploy operation. - Destination datacenter for the deploy operation.
@ -175,6 +179,17 @@ EXAMPLES = '''
state: remove_all state: remove_all
delegate_to: localhost delegate_to: localhost
- name: Remove all snapshots of a VM using MoID
vmware_guest_snapshot:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
folder: "/{{ datacenter_name }}/vm/"
moid: vm-42
state: remove_all
delegate_to: localhost
- name: Take snapshot of a VM using quiesce and memory flag on - name: Take snapshot of a VM using quiesce and memory flag on
vmware_guest_snapshot: vmware_guest_snapshot:
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
@ -314,8 +329,8 @@ class PyVmomiHelper(PyVmomi):
def rename_snapshot(self, vm): def rename_snapshot(self, vm):
if vm.snapshot is None: if vm.snapshot is None:
self.module.fail_json(msg="virtual machine - %s doesn't have any" vm_id = self.module.params.get('uuid') or self.module.params.get('name') or self.params.get('moid')
" snapshots" % (self.module.params.get('uuid') or self.module.params.get('name'))) self.module.fail_json(msg="virtual machine - %s doesn't have any snapshots" % vm_id)
snap_obj = self.get_snapshots_by_name_recursively(vm.snapshot.rootSnapshotList, snap_obj = self.get_snapshots_by_name_recursively(vm.snapshot.rootSnapshotList,
self.module.params["snapshot_name"]) self.module.params["snapshot_name"])
@ -330,10 +345,10 @@ class PyVmomiHelper(PyVmomi):
else: else:
task = snap_obj.RenameSnapshot(description=self.module.params["new_description"]) task = snap_obj.RenameSnapshot(description=self.module.params["new_description"])
else: else:
vm_id = self.module.params.get('uuid') or self.module.params.get('name') or self.params.get('moid')
self.module.exit_json( self.module.exit_json(
msg="Couldn't find any snapshots with specified name: %s on VM: %s" % msg="Couldn't find any snapshots with specified name: %s on VM: %s" %
(self.module.params["snapshot_name"], (self.module.params["snapshot_name"], vm_id))
self.module.params.get('uuid') or self.module.params.get('name')))
return task return task
def remove_or_revert_snapshot(self, vm): def remove_or_revert_snapshot(self, vm):
@ -357,9 +372,9 @@ class PyVmomiHelper(PyVmomi):
elif self.module.params["state"] == "revert": elif self.module.params["state"] == "revert":
task = snap_obj.RevertToSnapshot_Task() task = snap_obj.RevertToSnapshot_Task()
else: else:
vm_id = self.module.params.get('uuid') or self.module.params.get('name') or self.params.get('moid')
self.module.exit_json(msg="Couldn't find any snapshots with" self.module.exit_json(msg="Couldn't find any snapshots with"
" specified name: %s on VM: %s" % (self.module.params["snapshot_name"], " specified name: %s on VM: %s" % (self.module.params["snapshot_name"], vm_id))
self.module.params.get('uuid') or self.module.params.get('name')))
return task return task
@ -397,6 +412,7 @@ def main():
name=dict(type='str'), name=dict(type='str'),
name_match=dict(type='str', choices=['first', 'last'], default='first'), name_match=dict(type='str', choices=['first', 'last'], default='first'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(required=True, type='str'), datacenter=dict(required=True, type='str'),
@ -408,10 +424,15 @@ def main():
new_snapshot_name=dict(type='str'), new_snapshot_name=dict(type='str'),
new_description=dict(type='str'), new_description=dict(type='str'),
) )
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(
required_together=[['name', 'folder']], argument_spec=argument_spec,
required_one_of=[['name', 'uuid']], required_together=[
) ['name', 'folder']
],
required_one_of=[
['name', 'uuid', 'moid']
],
)
if module.params['folder']: if module.params['folder']:
# FindByInventoryPath() does not require an absolute path # FindByInventoryPath() does not require an absolute path
@ -423,9 +444,8 @@ def main():
vm = pyv.get_vm() vm = pyv.get_vm()
if not vm: if not vm:
# If UUID is set, getvm select UUID, show error message accordingly. vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
module.fail_json(msg="Unable to manage snapshots for non-existing VM %s" % (module.params.get('uuid') or module.fail_json(msg="Unable to manage snapshots for non-existing VM %s" % vm_id)
module.params.get('name')))
if not module.params['snapshot_name'] and module.params['state'] != 'remove_all': if not module.params['snapshot_name'] and module.params['state'] != 'remove_all':
module.fail_json(msg="snapshot_name param is required when state is '%(state)s'" % module.params) module.fail_json(msg="snapshot_name param is required when state is '%(state)s'" % module.params)

View file

@ -22,7 +22,7 @@ description:
- This module can be used to gather facts about virtual machine's snapshots. - This module can be used to gather facts about virtual machine's snapshots.
version_added: 2.6 version_added: 2.6
author: author:
- Abhijeet Kasurde (@Akasurde) <akasurde@redhat.com> - Abhijeet Kasurde (@Akasurde)
notes: notes:
- Tested on vSphere 6.0 and 6.5 - Tested on vSphere 6.0 and 6.5
requirements: requirements:
@ -32,12 +32,18 @@ options:
name: name:
description: description:
- Name of the VM to work with. - Name of the VM to work with.
- This is required if C(uuid) is not supplied. - This is required if C(uuid) or C(moid) is not supplied.
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's BIOS UUID by default. - UUID of the instance to manage if known, this is VMware's BIOS UUID by default.
- This is required if C(name) parameter is not supplied. - This is required if C(name) or C(moid) parameter is not supplied.
- The C(folder) is ignored, if C(uuid) is provided. - The C(folder) is ignored, if C(uuid) is provided.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -67,15 +73,25 @@ extends_documentation_fragment: vmware.documentation
''' '''
EXAMPLES = ''' EXAMPLES = '''
- name: Gather snapshot facts about the virtual machine in the given vCenter - name: Gather snapshot facts about the virtual machine in the given vCenter
vmware_guest_snapshot_facts: vmware_guest_snapshot_facts:
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}" username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}" password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}" datacenter: "{{ datacenter_name }}"
name: "{{ guest_name }}" name: "{{ guest_name }}"
delegate_to: localhost delegate_to: localhost
register: snapshot_facts register: snapshot_facts
- name: Gather snapshot facts about the virtual machine using MoID
vmware_guest_snapshot_facts:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
moid: vm-42
delegate_to: localhost
register: snapshot_facts
''' '''
RETURN = """ RETURN = """
@ -114,7 +130,7 @@ class PyVmomiHelper(PyVmomi):
@staticmethod @staticmethod
def gather_guest_snapshot_facts(vm_obj=None): def gather_guest_snapshot_facts(vm_obj=None):
""" """
Function to return snpashot related facts about given virtual machine Return snapshot related facts about given virtual machine
Args: Args:
vm_obj: Virtual Machine Managed object vm_obj: Virtual Machine Managed object
@ -131,15 +147,21 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(required=True, type='str'), datacenter=dict(required=True, type='str'),
) )
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(
required_together=[['name', 'folder']], argument_spec=argument_spec,
required_one_of=[['name', 'uuid']], required_together=[
supports_check_mode=True, ['name', 'folder']
) ],
required_one_of=[
['name', 'uuid', 'moid']
],
supports_check_mode=True,
)
if module.params['folder']: if module.params['folder']:
# FindByInventoryPath() does not require an absolute path # FindByInventoryPath() does not require an absolute path
@ -151,10 +173,10 @@ def main():
vm = pyv.get_vm() vm = pyv.get_vm()
if not vm: if not vm:
# If UUID is set, getvm select UUID, show error message accordingly. # If UUID is set, get_vm select UUID, show error message accordingly.
vm_id = (module.params.get('uuid') or module.params.get('name') or module.params.get('moid'))
module.fail_json(msg="Unable to gather facts about snapshots for" module.fail_json(msg="Unable to gather facts about snapshots for"
" non-existing VM ['%s']" % (module.params.get('uuid') or " non-existing VM ['%s']" % vm_id)
module.params.get('name')))
results = dict(changed=False, guest_snapshots=pyv.gather_guest_snapshot_facts(vm_obj=vm)) results = dict(changed=False, guest_snapshots=pyv.gather_guest_snapshot_facts(vm_obj=vm))
module.exit_json(**results) module.exit_json(**results)

View file

@ -30,7 +30,7 @@ options:
name: name:
description: description:
- Name of the virtual machine to work with. - Name of the virtual machine to work with.
- This is required if C(UUID) is not supplied. - This is required if C(uuid) or C(moid) is not supplied.
name_match: name_match:
description: description:
- If multiple virtual machines matching the name, use the first or last found. - If multiple virtual machines matching the name, use the first or last found.
@ -39,7 +39,13 @@ options:
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's unique identifier. - UUID of the instance to manage if known, this is VMware's unique identifier.
- This is required if C(name) is not supplied. - This is required if C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
folder: folder:
description: description:
- Destination folder, absolute or relative path to find an existing guest. - Destination folder, absolute or relative path to find an existing guest.
@ -55,7 +61,6 @@ options:
- ' folder: /folder1/datacenter1/vm' - ' folder: /folder1/datacenter1/vm'
- ' folder: folder1/datacenter1/vm' - ' folder: folder1/datacenter1/vm'
- ' folder: /folder1/datacenter1/vm/folder2' - ' folder: /folder1/datacenter1/vm/folder2'
- ' folder: vm/folder2'
datacenter: datacenter:
description: description:
- Destination datacenter where the virtual machine exists. - Destination datacenter where the virtual machine exists.
@ -66,7 +71,7 @@ author:
''' '''
EXAMPLES = ''' EXAMPLES = '''
- name: Upgrade VMware Tools - name: Upgrade VMware Tools using uuid
vmware_guest_tools_upgrade: vmware_guest_tools_upgrade:
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}" username: "{{ vcenter_username }}"
@ -74,6 +79,15 @@ EXAMPLES = '''
datacenter: "{{ datacenter_name }}" datacenter: "{{ datacenter_name }}"
uuid: 421e4592-c069-924d-ce20-7e7533fab926 uuid: 421e4592-c069-924d-ce20-7e7533fab926
delegate_to: localhost delegate_to: localhost
- name: Upgrade VMware Tools using MoID
vmware_guest_tools_upgrade:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
moid: vm-42
delegate_to: localhost
''' '''
RETURN = ''' # ''' RETURN = ''' # '''
@ -145,11 +159,16 @@ def main():
name=dict(type='str'), name=dict(type='str'),
name_match=dict(type='str', choices=['first', 'last'], default='first'), name_match=dict(type='str', choices=['first', 'last'], default='first'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str', required=True), datacenter=dict(type='str', required=True),
) )
module = AnsibleModule(argument_spec=argument_spec, module = AnsibleModule(
required_one_of=[['name', 'uuid']]) argument_spec=argument_spec,
required_one_of=[
['name', 'uuid', 'moid']
]
)
if module.params['folder']: if module.params['folder']:
# FindByInventoryPath() does not require an absolute path # FindByInventoryPath() does not require an absolute path
@ -173,7 +192,8 @@ def main():
except Exception as exc: except Exception as exc:
module.fail_json(msg='Unknown error: %s' % to_native(exc)) module.fail_json(msg='Unknown error: %s' % to_native(exc))
else: else:
module.fail_json(msg='Unable to find VM %s' % (module.params.get('uuid') or module.params.get('name'))) vm_id = module.params.get('uuid') or module.params.get('name') or module.params.get('moid')
module.fail_json(msg='Unable to find VM %s' % vm_id)
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -31,7 +31,7 @@ options:
name: name:
description: description:
- Name of the VM for which to wait until the tools become available. - Name of the VM for which to wait until the tools become available.
- This is required if uuid is not supplied. - This is required if C(uuid) or C(moid) is not supplied.
name_match: name_match:
description: description:
- If multiple VMs match the name, use the first or last found. - If multiple VMs match the name, use the first or last found.
@ -55,7 +55,13 @@ options:
uuid: uuid:
description: description:
- UUID of the VM for which to wait until the tools become available, if known. This is VMware's unique identifier. - UUID of the VM for which to wait until the tools become available, if known. This is VMware's unique identifier.
- This is required, if C(name) is not supplied. - This is required, if C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -89,6 +95,16 @@ EXAMPLES = '''
register: facts register: facts
- name: Wait for VMware tools to become available by MoID
vmware_guest_tools_wait:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
moid: vm-42
delegate_to: localhost
register: facts
- name: Wait for VMware tools to become available by name - name: Wait for VMware tools to become available by name
vmware_guest_tools_wait: vmware_guest_tools_wait:
hostname: "{{ vcenter_hostname }}" hostname: "{{ vcenter_hostname }}"
@ -152,11 +168,15 @@ def main():
name_match=dict(type='str', default='first', choices=['first', 'last']), name_match=dict(type='str', default='first', choices=['first', 'last']),
folder=dict(type='str'), folder=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
) )
module = AnsibleModule( module = AnsibleModule(
argument_spec=argument_spec, argument_spec=argument_spec,
required_one_of=[['name', 'uuid']]) required_one_of=[
['name', 'uuid', 'moid']
]
)
if module.params['folder']: if module.params['folder']:
# FindByInventoryPath() does not require an absolute path # FindByInventoryPath() does not require an absolute path
@ -168,9 +188,8 @@ def main():
vm = pyv.get_vm() vm = pyv.get_vm()
if not vm: if not vm:
module.fail_json(msg="Unable to wait for VMware tools for " vm_id = module.params.get('name') or module.params.get('uuid') or module.params.get('moid')
"non-existing VM '%s'." % (module.params.get('name') or module.fail_json(msg="Unable to wait for VMware tools for non-existing VM '%s'." % vm_id)
module.params.get('uuid')))
result = dict(changed=False) result = dict(changed=False)
try: try:

View file

@ -32,11 +32,17 @@ options:
name: name:
description: description:
- Name of the virtual machine. - Name of the virtual machine.
- This is a required parameter, if parameter C(uuid) is not supplied. - This is a required parameter, if parameter C(uuid) or C(moid) is not supplied.
uuid: uuid:
description: description:
- UUID of the instance to gather facts if known, this is VMware's unique identifier. - UUID of the instance to gather facts if known, this is VMware's unique identifier.
- This is a required parameter, if parameter C(name) is not supplied. - This is a required parameter, if parameter C(name) or C(moid) is not supplied.
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
folder: folder:
description: description:
- Destination folder, absolute or relative path to find an existing guest. - Destination folder, absolute or relative path to find an existing guest.
@ -110,6 +116,24 @@ EXAMPLES = '''
memory_3D_mb: 512 memory_3D_mb: 512
delegate_to: localhost delegate_to: localhost
register: video_facts register: video_facts
- name: Change video card settings of virtual machine using MoID
vmware_guest_video:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ datacenter_name }}"
validate_certs: no
moid: vm-42
gather_video_facts: false
use_auto_detect: false
display_number: 2
video_memory_mb: 8.0
enable_3D: true
renderer_3D: automatic
memory_3D_mb: 512
delegate_to: localhost
register: video_facts
''' '''
RETURN = """ RETURN = """
@ -294,6 +318,7 @@ def main():
argument_spec.update( argument_spec.update(
name=dict(type='str'), name=dict(type='str'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
datacenter=dict(type='str', default='ha-datacenter'), datacenter=dict(type='str', default='ha-datacenter'),
gather_video_facts=dict(type='bool', default=False), gather_video_facts=dict(type='bool', default=False),
@ -304,12 +329,19 @@ def main():
renderer_3D=dict(type='str', choices=['automatic', 'software', 'hardware']), renderer_3D=dict(type='str', choices=['automatic', 'software', 'hardware']),
memory_3D_mb=dict(type='int'), memory_3D_mb=dict(type='int'),
) )
module = AnsibleModule(argument_spec=argument_spec,
required_one_of=[['name', 'uuid']]) module = AnsibleModule(
argument_spec=argument_spec,
required_one_of=[
['name', 'uuid', 'moid']
]
)
pyv = PyVmomiHelper(module) pyv = PyVmomiHelper(module)
vm = pyv.get_vm() vm = pyv.get_vm()
if not vm: if not vm:
module.fail_json(msg='Unable to find the specified virtual machine : %s' % (module.params.get('uuid') or module.params.get('name'))) vm_id = module.params.get('uuid') or module.params.get('name') or module.params.get('moid')
module.fail_json(msg='Unable to find the specified virtual machine : %s' % vm_id)
vm_facts = pyv.gather_facts(vm) vm_facts = pyv.gather_facts(vm)
vm_power_state = vm_facts['hw_power_status'].lower() vm_power_state = vm_facts['hw_power_status'].lower()

View file

@ -51,8 +51,14 @@ options:
uuid: uuid:
description: description:
- UUID of the instance to manage if known, this is VMware's unique identifier. - UUID of the instance to manage if known, this is VMware's unique identifier.
- This is required, if C(name) is not supplied. - This is required, if C(name) or C(moid) is not supplied.
required: false required: false
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(name) or C(uuid) is not supplied.
version_added: '2.9'
type: str
folder: folder:
description: description:
- Destination folder, absolute or relative path to find an existing guest. - Destination folder, absolute or relative path to find an existing guest.
@ -106,6 +112,18 @@ EXAMPLES = '''
state: absent state: absent
delegate_to: localhost delegate_to: localhost
register: vnc_result register: vnc_result
- name: Disable VNC remote display on the VM using MoID
vmware_guest_vnc:
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
validate_certs: no
datacenter: "{{ datacenter_name }}"
moid: vm-42
state: absent
delegate_to: localhost
register: vnc_result
''' '''
RETURN = ''' RETURN = '''
@ -195,6 +213,7 @@ def main():
name=dict(type='str'), name=dict(type='str'),
name_match=dict(type='str', choices=['first', 'last'], default='first'), name_match=dict(type='str', choices=['first', 'last'], default='first'),
uuid=dict(type='str'), uuid=dict(type='str'),
moid=dict(type='str'),
folder=dict(type='str'), folder=dict(type='str'),
vnc_ip=dict(type='str', default='0.0.0.0'), vnc_ip=dict(type='str', default='0.0.0.0'),
vnc_port=dict(type='int', default=0), vnc_port=dict(type='int', default=0),
@ -206,10 +225,10 @@ def main():
argument_spec=argument_spec, argument_spec=argument_spec,
supports_check_mode=True, supports_check_mode=True,
required_one_of=[ required_one_of=[
['name', 'uuid'] ['name', 'uuid', 'moid']
], ],
mutually_exclusive=[ mutually_exclusive=[
['name', 'uuid'] ['name', 'uuid', 'moid']
] ]
) )
@ -227,8 +246,8 @@ def main():
module.params['vnc_password'] module.params['vnc_password']
) )
else: else:
module.fail_json(msg="Unable to set VNC config for non-existing virtual machine : '%s'" % (module.params.get('uuid') or vm_id = module.params.get('uuid') or module.params.get('name') or module.params.get('moid')
module.params.get('name'))) module.fail_json(msg="Unable to set VNC config for non-existing virtual machine : '%s'" % vm_id)
if result.get('failed') is True: if result.get('failed') is True:
module.fail_json(**result) module.fail_json(**result)

View file

@ -44,9 +44,15 @@ options:
vm_uuid: vm_uuid:
description: description:
- UUID of the virtual machine to perform a vMotion operation on. - UUID of the virtual machine to perform a vMotion operation on.
- This is a required parameter, if C(vm_name) is not set. - This is a required parameter, if C(vm_name) or C(moid) is not set.
aliases: ['uuid'] aliases: ['uuid']
version_added: 2.7 version_added: 2.7
moid:
description:
- Managed Object ID of the instance to manage if known, this is a unique identifier only within a single vCenter instance.
- This is required if C(vm_name) or C(vm_uuid) is not supplied.
version_added: '2.9'
type: str
use_instance_uuid: use_instance_uuid:
description: description:
- Whether to use the VMware instance UUID rather than the BIOS UUID. - Whether to use the VMware instance UUID rather than the BIOS UUID.
@ -77,6 +83,16 @@ EXAMPLES = '''
destination_host: 'destination_host_as_per_vcenter' destination_host: 'destination_host_as_per_vcenter'
delegate_to: localhost delegate_to: localhost
- name: Perform vMotion of virtual machine
vmware_vmotion:
hostname: '{{ vcenter_hostname }}'
username: '{{ vcenter_username }}'
password: '{{ vcenter_password }}'
validate_certs: no
moid: vm-42
destination_host: 'destination_host_as_per_vcenter'
delegate_to: localhost
- name: Perform storage vMotion of of virtual machine - name: Perform storage vMotion of of virtual machine
vmware_vmotion: vmware_vmotion:
hostname: '{{ vcenter_hostname }}' hostname: '{{ vcenter_hostname }}'
@ -108,7 +124,7 @@ running_host:
''' '''
try: try:
from pyVmomi import vim from pyVmomi import vim, VmomiSupport
except ImportError: except ImportError:
pass pass
@ -126,12 +142,13 @@ class VmotionManager(PyVmomi):
self.vm_uuid = self.params.get('vm_uuid', None) self.vm_uuid = self.params.get('vm_uuid', None)
self.use_instance_uuid = self.params.get('use_instance_uuid', False) self.use_instance_uuid = self.params.get('use_instance_uuid', False)
self.vm_name = self.params.get('vm_name', None) self.vm_name = self.params.get('vm_name', None)
self.moid = self.params.get('moid') or None
result = dict() result = dict()
self.get_vm() self.get_vm()
if self.vm is None: if self.vm is None:
self.module.fail_json(msg="Failed to find the virtual" vm_id = self.vm_uuid or self.vm_name or self.moid
" machine with %s" % (self.vm_uuid or self.vm_name)) self.module.fail_json(msg="Failed to find the virtual machine with %s" % vm_id)
# Get Destination Host System if specified by user # Get Destination Host System if specified by user
dest_host_name = self.params.get('destination_host', None) dest_host_name = self.params.get('destination_host', None)
@ -147,7 +164,7 @@ class VmotionManager(PyVmomi):
self.datastore_object = find_datastore_by_name(content=self.content, self.datastore_object = find_datastore_by_name(content=self.content,
datastore_name=dest_datastore) datastore_name=dest_datastore)
# Atleast one of datastore, host system is required to migrate # At-least one of datastore, host system is required to migrate
if self.datastore_object is None and self.host_object is None: if self.datastore_object is None and self.host_object is None:
self.module.fail_json(msg="Unable to find destination datastore" self.module.fail_json(msg="Unable to find destination datastore"
" and destination host system.") " and destination host system.")
@ -261,13 +278,11 @@ class VmotionManager(PyVmomi):
""" """
vms = [] vms = []
if self.vm_uuid and not self.use_instance_uuid: if self.vm_uuid:
vm_obj = find_vm_by_id(self.content, vm_id=self.params['vm_uuid'], vm_id_type="uuid") if not self.use_instance_uuid:
vms = [vm_obj] vm_obj = find_vm_by_id(self.content, vm_id=self.params['vm_uuid'], vm_id_type="uuid")
elif self.vm_uuid and self.use_instance_uuid: elif self.use_instance_uuid:
vm_obj = find_vm_by_id(self.content, vm_obj = find_vm_by_id(self.content, vm_id=self.params['vm_uuid'], vm_id_type="instance_uuid")
vm_id=self.params['vm_uuid'],
vm_id_type="instance_uuid")
vms = [vm_obj] vms = [vm_obj]
elif self.vm_name: elif self.vm_name:
objects = self.get_managed_objects_properties(vim_type=vim.VirtualMachine, properties=['name']) objects = self.get_managed_objects_properties(vim_type=vim.VirtualMachine, properties=['name'])
@ -277,6 +292,10 @@ class VmotionManager(PyVmomi):
if temp_vm_object.obj.name == self.vm_name: if temp_vm_object.obj.name == self.vm_name:
vms.append(temp_vm_object.obj) vms.append(temp_vm_object.obj)
break break
elif self.moid:
vm_obj = VmomiSupport.templateOf('VirtualMachine')(self.moid, self.si._stub)
if vm_obj:
vms.append(vm_obj)
if len(vms) > 1: if len(vms) > 1:
self.module.fail_json(msg="Multiple virtual machines with same name %s found." self.module.fail_json(msg="Multiple virtual machines with same name %s found."
@ -291,6 +310,7 @@ def main():
dict( dict(
vm_name=dict(aliases=['vm']), vm_name=dict(aliases=['vm']),
vm_uuid=dict(aliases=['uuid']), vm_uuid=dict(aliases=['uuid']),
moid=dict(type='str'),
use_instance_uuid=dict(type='bool', default=False), use_instance_uuid=dict(type='bool', default=False),
destination_host=dict(aliases=['destination']), destination_host=dict(aliases=['destination']),
destination_datastore=dict(aliases=['datastore']) destination_datastore=dict(aliases=['datastore'])
@ -302,10 +322,10 @@ def main():
supports_check_mode=True, supports_check_mode=True,
required_one_of=[ required_one_of=[
['destination_host', 'destination_datastore'], ['destination_host', 'destination_datastore'],
['vm_uuid', 'vm_name'], ['vm_uuid', 'vm_name', 'moid'],
], ],
mutually_exclusive=[ mutually_exclusive=[
['vm_uuid', 'vm_name'], ['vm_uuid', 'vm_name', 'moid'],
], ],
) )

View file

@ -48,6 +48,8 @@
- set_fact: vm1_instance_uuid="{{ guest_facts_0001['instance']['instance_uuid'] }}" - set_fact: vm1_instance_uuid="{{ guest_facts_0001['instance']['instance_uuid'] }}"
- set_fact: vm1_moid="{{ guest_facts_0001['instance']['moid'] }}"
- debug: - debug:
var: vm1_uuid var: vm1_uuid
@ -153,7 +155,7 @@
- "guest_facts_0004['instance']['snapshots'][0]['name'] == 'snap1'" - "guest_facts_0004['instance']['snapshots'][0]['name'] == 'snap1'"
- "guest_facts_0004['instance']['snapshots'][1]['name'] == 'snap2'" - "guest_facts_0004['instance']['snapshots'][1]['name'] == 'snap2'"
- "guest_facts_0004['instance']['current_snapshot']['name'] == 'snap2'" - "guest_facts_0004['instance']['current_snapshot']['name'] == 'snap2'"
- "guest_facts_0002['instance']['hw_folder'] is defined" - "guest_facts_0004['instance']['hw_folder'] is defined"
# Testcase 0005: Get details about virtual machines using UUID # Testcase 0005: Get details about virtual machines using UUID
- name: get list of facts about virtual machines using instance UUID - name: get list of facts about virtual machines using instance UUID
@ -186,5 +188,39 @@
- "guest_facts_0005['instance']['guest_consolidation_needed'] is defined" - "guest_facts_0005['instance']['guest_consolidation_needed'] is defined"
- "guest_facts_0005['instance']['instance_uuid'] is defined" - "guest_facts_0005['instance']['instance_uuid'] is defined"
- "guest_facts_0005['instance']['instance_uuid'] == vm1_instance_uuid" - "guest_facts_0005['instance']['instance_uuid'] == vm1_instance_uuid"
- "guest_facts_0001['instance']['moid'] is defined" - "guest_facts_0005['instance']['moid'] is defined"
- "guest_facts_0001['instance']['vimref'] is defined" - "guest_facts_0005['instance']['vimref'] is defined"
# Testcase 0006: Get details about virtual machines using MoID
- name: get list of facts about virtual machines using instance MoID
vmware_guest_facts:
validate_certs: False
hostname: "{{ vcenter_hostname }}"
username: "{{ vcenter_username }}"
password: "{{ vcenter_password }}"
datacenter: "{{ dc1 }}"
moid: "{{ vm1_moid }}"
use_instance_uuid: True
register: guest_facts_0006
- debug:
msg: "{{ guest_facts_0006 }}"
- assert:
that:
- "guest_facts_0006['instance']['hw_name'] == virtual_machines[0].name"
- "guest_facts_0006['instance']['hw_product_uuid'] is defined"
- "guest_facts_0006['instance']['hw_product_uuid'] == vm1_uuid"
- "guest_facts_0006['instance']['hw_cores_per_socket'] is defined"
- "guest_facts_0006['instance']['hw_datastores'] is defined"
- "guest_facts_0006['instance']['hw_esxi_host'] is defined"
- "guest_facts_0006['instance']['hw_files'] is defined"
- "guest_facts_0006['instance']['hw_guest_ha_state'] is defined"
- "guest_facts_0006['instance']['hw_is_template'] is defined"
- "guest_facts_0006['instance']['hw_folder'] is defined"
- "guest_facts_0006['instance']['guest_question'] is defined"
- "guest_facts_0006['instance']['guest_consolidation_needed'] is defined"
- "guest_facts_0006['instance']['instance_uuid'] is defined"
- "guest_facts_0006['instance']['instance_uuid'] == vm1_instance_uuid"
- "guest_facts_0006['instance']['moid'] is defined"
- "guest_facts_0006['instance']['vimref'] is defined"