Created
February 11, 2020 08:18
-
-
Save omersiar/b1331d184b084d7692436465c9261dc6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
# Copyright: (c) 2019, Ansible Project | |
# Copyright: (c) 2019, Pavan Bidkar <pbidkar@vmware.com> | |
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) | |
from __future__ import absolute_import, division, print_function | |
__metaclass__ = type | |
import uuid | |
from ansible.module_utils.basic import AnsibleModule | |
from ansible.module_utils.vmware_rest_client import VmwareRestClient | |
from ansible.module_utils.vmware import PyVmomi | |
from ansible.module_utils._text import to_native | |
HAS_VAUTOMATION_PYTHON_SDK = False | |
try: | |
#from com.vmware.vcenter.vm_template_client import LibraryItems | |
from com.vmware.vcenter.ovf_client import LibraryItem, DiskProvisioningType | |
from com.vmware.vcenter_client import ResourcePool | |
HAS_VAUTOMATION_PYTHON_SDK = True | |
except ImportError: | |
pass | |
class VmwareContentDeployTemplate(VmwareRestClient): | |
def __init__(self, module): | |
"""Constructor.""" | |
super(VmwareContentDeployTemplate, self).__init__(module) | |
self.template_service = self.api_client.vcenter.ovf.LibraryItem | |
self.template_name = self.params.get('template') | |
self.vm_name = self.params.get('name') | |
self.datacenter = self.params.get('datacenter') | |
self.datastore = self.params.get('datastore') | |
self.folder = self.params.get('folder') | |
self.resourcepool = self.params.get('resource_pool') | |
self.cluster = self.params.get('cluster') | |
self.host = self.params.get('host') | |
def deploy_vm_from_template(self, power_on=False): | |
# Find the datacenter by the given datacenter name | |
self.datacenter_id = self.get_datacenter_by_name(datacenter_name=self.datacenter) | |
if not self.datacenter_id: | |
self.module.fail_json(msg="Failed to find the datacenter %s" % self.datacenter) | |
# Find the datastore by the given datastore name | |
self.datastore_id = self.get_datastore_by_name(self.datacenter, self.datastore) | |
if not self.datastore_id: | |
self.module.fail_json(msg="Failed to find the datastore %s" % self.datastore) | |
# Find the LibraryItem (Template) by the given LibraryItem name | |
self.library_item_id = self.get_library_item_by_name(self.template_name) | |
if not self.library_item_id: | |
self.module.fail_json(msg="Failed to find the library Item %s" % self.template_name) | |
# Find the folder by the given folder name | |
self.folder_id = self.get_folder_by_name(self.datacenter, self.folder) | |
if not self.folder_id: | |
self.module.fail_json(msg="Failed to find the folder %s" % self.folder) | |
# Find the Host by given HostName | |
self.host_id = self.get_host_by_name(self.datacenter, self.host) | |
if not self.host_id: | |
self.module.fail_json(msg="Failed to find the Host %s" % self.host) | |
# Find the Cluster by the given Cluster name | |
self.cluster_id = None | |
if self.cluster: | |
self.cluster_id = self.get_cluster_by_name(self.datacenter, self.cluster) | |
if not self.cluster_id: | |
self.module.fail_json(msg="Failed to find the Cluster %s" % self.cluster) | |
# Find the resourcepool by the given resourcepool name | |
self.resourcepool_id = None | |
if self.resourcepool: | |
self.resourcepool_id = self.get_resource_pool_by_name(self.datacenter, self.resourcepool) | |
else: | |
filter_spec = ResourcePool.FilterSpec(hosts=set([self.host_id])) | |
resource_pool_summaries = self.api_client.vcenter.ResourcePool.list(filter_spec) | |
resource_pool = resource_pool_summaries[0].resource_pool if len(resource_pool_summaries) > 0 else None | |
self.resourcepool_id = resource_pool | |
if not self.resourcepool_id: | |
self.module.fail_json(msg="Failed to find the resource_pool %s" % self.resourcepool) | |
self.placement_spec = LibraryItem.DeploymentTarget(resource_pool_id = self.resourcepool_id, | |
folder_id=self.folder_id, | |
host_id=self.host_id | |
) | |
self.deploy_spec = LibraryItem.ResourcePoolDeploymentSpec( | |
name=self.vm_name, | |
annotation=None, | |
accept_all_eula=True, | |
network_mappings=None, | |
storage_mappings=None, | |
storage_provisioning=DiskProvisioningType('thin'), | |
storage_profile_id=None, | |
locale=None, | |
flags=None, | |
additional_parameters=None, | |
default_datastore_id=self.datastore_id) | |
# Deploy the ovf template | |
result = self.template_service.deploy(self.library_item_id, | |
self.placement_spec, | |
self.deploy_spec, | |
) | |
vm_id = result.resource_id | |
if vm_id: | |
self.module.exit_json( | |
changed=True, | |
vm_deploy_info=dict( | |
msg="Deployed Virtual Machine '%s'." % self.vm_name, | |
vm_id=vm_id.id, | |
vm_name=self.vm_name | |
) | |
) | |
self.module.exit_json(changed=False, | |
vm_deploy_info=dict(msg="Virtual Machine deployment failed", vm_id='', vm_name='')) | |
def main(): | |
argument_spec = VmwareRestClient.vmware_client_argument_spec() | |
argument_spec.update( | |
state=dict(type='str', default='present', | |
choices=['present', 'poweredon']), | |
template=dict(type='str', aliases=['template_src'], required=True), | |
name=dict(type='str', required=True, aliases=['vm_name']), | |
datacenter=dict(type='str', required=True), | |
datastore=dict(type='str', required=True), | |
folder=dict(type='str', required=True), | |
host=dict(type='str', required=True), | |
resource_pool=dict(type='str', required=False), | |
cluster=dict(type='str', required=False), | |
) | |
module = AnsibleModule(argument_spec=argument_spec, | |
supports_check_mode=True) | |
result = {'failed': False, 'changed': False} | |
pyv = PyVmomi(module=module) | |
vm = pyv.get_vm() | |
if vm: | |
module.exit_json( | |
changed=False, | |
vm_deploy_info=dict( | |
msg="Virtual Machine '%s' already Exists." % module.params['name'], | |
vm_id=vm._moId, | |
vm_name=module.params['name'] | |
) | |
) | |
vmware_contentlib_create = VmwareContentDeployTemplate(module) | |
if module.params['state'] in ['present']: | |
if module.check_mode: | |
result.update( | |
vm_name=module.params['name'], | |
changed=True, | |
desired_operation='Create VM with PowerOff State', | |
) | |
module.exit_json(**result) | |
vmware_contentlib_create.deploy_vm_from_template() | |
if module.params['state'] == 'poweredon': | |
if module.check_mode: | |
result.update( | |
vm_name=module.params['name'], | |
changed=True, | |
desired_operation='Create VM with PowerON State', | |
) | |
module.exit_json(**result) | |
vmware_contentlib_create.deploy_vm_from_template(power_on=True) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment