Last active
January 15, 2019 17:37
-
-
Save sivel/8f50a0e468504ba83d7f6cb032bacc9c to your computer and use it in GitHub Desktop.
Revisions
-
sivel revised this gist
Jan 15, 2019 . 1 changed file with 1 addition and 1 deletion.There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -78,7 +78,7 @@ index 6eb690baed..0fe301a301 100644 + + opt = vim.option.OptionValue() + opt.key = 'guestinfo.ovfEnv' + opt.value = '<?xml version="1.0" encoding="UTF-8"?>' + to_native(ET.tostring(env)) + + config_spec = vim.vm.ConfigSpec() + config_spec.extraConfig = [opt] -
sivel created this gist
Jan 15, 2019 .There are no files selected for viewing
This file contains hidden or 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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,124 @@ diff --git a/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py b/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py index 6eb690baed..0fe301a301 100644 --- a/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py +++ b/lib/ansible/modules/cloud/vmware/vmware_deploy_ovf.py @@ -56,6 +56,12 @@ options: default: thin description: - Disk provisioning type. + enable_hidden_properties: + description: + - Enable source properties that are marked as ovf:userConfigurable=false + default: "no" + type: bool + version_added: "2.8" fail_on_spec_warnings: description: - Cause the module to treat OVF Import Spec warnings as errors. @@ -65,6 +71,10 @@ options: description: - Absolute path of folder to place the virtual machine. - If not specified, defaults to the value of C(datacenter.vmFolder). + inject_ovf_env: + description: + - Force the given properties to be inserted into an OVF Environment and injected through VMware Tools + version_added: "2.8" name: description: - Name of the VM to work with. @@ -149,6 +159,8 @@ import tarfile import time import traceback +import xml.etree.ElementTree as ET + from threading import Thread from ansible.module_utils._text import to_native @@ -377,6 +389,10 @@ class VMwareDeployOvf: spec_params ) + if self.params['enable_hidden_properties']: + for prop in self.import_spec.importSpec.configSpec.vAppConfig.property: + prop.info.userConfigurable = True + errors = [to_native(e.msg) for e in getattr(self.import_spec, 'error', [])] if self.params['fail_on_spec_warnings']: errors.extend( @@ -509,8 +525,47 @@ class VMwareDeployOvf: def complete(self): self.lease.HttpNfcLeaseComplete() - def power_on(self): + def inject_ovf_env(self): + attrib = { + 'xmlns': 'http://schemas.dmtf.org/ovf/environment/1', + 'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', + 'xmlns:oe': 'http://schemas.dmtf.org/ovf/environment/1', + 'xmlns:ve': 'http://www.vmware.com/schema/ovfenv', + 'oe:id': '', + 've:esxId': self.entity._moId + } + env = ET.Element('Environment', **attrib) + + platform = ET.SubElement(env, 'PlatformSection') + ET.SubElement(platform, 'Kind').text = self.si.about.name + ET.SubElement(platform, 'Version').text = self.si.about.version + ET.SubElement(platform, 'Vendor').text = self.si.about.vendor + ET.SubElement(platform, 'Locale').text = 'US' + + prop_section = ET.SubElement(env, 'PropertySection') + for key, value in self.params['properties'].items(): + params = { + 'oe:key': key, + 'oe:value': str(value) if isinstance(value, bool) else value + } + ET.SubElement(prop_section, 'Property', **params) + + opt = vim.option.OptionValue() + opt.key = 'guestinfo.ovfEnv' + opt.value = to_native(ET.tostring(env)) + + config_spec = vim.vm.ConfigSpec() + config_spec.extraConfig = [opt] + + task = self.entity.ReconfigVM_Task(config_spec) + wait_for_task(task) + + def deploy(self): facts = {} + + if self.params['inject_ovf_env']: + self.inject_ovf_env() + if self.params['power_on']: task = self.entity.PowerOn() if self.params['wait']: @@ -543,9 +598,17 @@ def main(): 'deployment_option': { 'default': None, }, + 'enable_hidden_properties': { + 'default': False, + 'type': 'bool', + }, 'folder': { 'default': None, }, + 'inject_ovf_env': { + 'default': False, + 'type': 'bool', + }, 'resource_pool': { 'default': 'Resources', }, @@ -609,7 +672,7 @@ def main(): deploy_ovf = VMwareDeployOvf(module) deploy_ovf.upload() deploy_ovf.complete() - facts = deploy_ovf.power_on() + facts = deploy_ovf.deploy() module.exit_json(instance=facts, changed=True)