mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-25 06:10:22 -07:00
vmware_guest: Various fixes and changes
Changes missing from a poor merge probably, but also a few new things. - Reordered the examples from important (often used) to less important (fewer used) - Remove the new_name: option and replace it with the uuid/name combination for renaming + added example - Added an example using the VM uuid instead of the VM name - Also check whether the password is non-empty (rogue merge) - Wait for all tasks to finish (to be sure the new facts reflect the state) - Ensure that on failure we still set the change-bit - Moved a set of functions that are unused (related to transfering files to guest, or running commands) to module_utils
This commit is contained in:
parent
efda0323be
commit
20df62ab31
2 changed files with 216 additions and 207 deletions
|
@ -233,3 +233,153 @@ def get_all_objs(content, vimtype, folder=None, recurse=True):
|
|||
for managed_object_ref in container.view:
|
||||
obj.update({managed_object_ref: managed_object_ref.name})
|
||||
return obj
|
||||
|
||||
def fetch_file_from_guest(content, vm, username, password, src, dest):
|
||||
|
||||
""" Use VMWare's filemanager api to fetch a file over http """
|
||||
|
||||
result = {'failed': False}
|
||||
|
||||
tools_status = vm.guest.toolsStatus
|
||||
if tools_status == 'toolsNotInstalled' or tools_status == 'toolsNotRunning':
|
||||
result['failed'] = True
|
||||
result['msg'] = "VMwareTools is not installed or is not running in the guest"
|
||||
return result
|
||||
|
||||
# https://github.com/vmware/pyvmomi/blob/master/docs/vim/vm/guest/NamePasswordAuthentication.rst
|
||||
creds = vim.vm.guest.NamePasswordAuthentication(
|
||||
username=username, password=password
|
||||
)
|
||||
|
||||
# https://github.com/vmware/pyvmomi/blob/master/docs/vim/vm/guest/FileManager/FileTransferInformation.rst
|
||||
fti = content.guestOperationsManager.fileManager. \
|
||||
InitiateFileTransferFromGuest(vm, creds, src)
|
||||
|
||||
result['size'] = fti.size
|
||||
result['url'] = fti.url
|
||||
|
||||
# Use module_utils to fetch the remote url returned from the api
|
||||
rsp, info = fetch_url(self.module, fti.url, use_proxy=False,
|
||||
force=True, last_mod_time=None,
|
||||
timeout=10, headers=None)
|
||||
|
||||
# save all of the transfer data
|
||||
for k, v in iteritems(info):
|
||||
result[k] = v
|
||||
|
||||
# exit early if xfer failed
|
||||
if info['status'] != 200:
|
||||
result['failed'] = True
|
||||
return result
|
||||
|
||||
# attempt to read the content and write it
|
||||
try:
|
||||
with open(dest, 'wb') as f:
|
||||
f.write(rsp.read())
|
||||
except Exception as e:
|
||||
result['failed'] = True
|
||||
result['msg'] = str(e)
|
||||
|
||||
return result
|
||||
|
||||
def push_file_to_guest(content, vm, username, password, src, dest, overwrite=True):
|
||||
|
||||
""" Use VMWare's filemanager api to fetch a file over http """
|
||||
|
||||
result = {'failed': False}
|
||||
|
||||
tools_status = vm.guest.toolsStatus
|
||||
if tools_status == 'toolsNotInstalled' or tools_status == 'toolsNotRunning':
|
||||
result['failed'] = True
|
||||
result['msg'] = "VMwareTools is not installed or is not running in the guest"
|
||||
return result
|
||||
|
||||
# https://github.com/vmware/pyvmomi/blob/master/docs/vim/vm/guest/NamePasswordAuthentication.rst
|
||||
creds = vim.vm.guest.NamePasswordAuthentication(
|
||||
username=username, password=password
|
||||
)
|
||||
|
||||
# the api requires a filesize in bytes
|
||||
fdata = None
|
||||
try:
|
||||
# filesize = os.path.getsize(src)
|
||||
filesize = os.stat(src).st_size
|
||||
with open(src, 'rb') as f:
|
||||
fdata = f.read()
|
||||
result['local_filesize'] = filesize
|
||||
except Exception as e:
|
||||
result['failed'] = True
|
||||
result['msg'] = "Unable to read src file: %s" % str(e)
|
||||
return result
|
||||
|
||||
# https://www.vmware.com/support/developer/converter-sdk/conv60_apireference/vim.vm.guest.FileManager.html#initiateFileTransferToGuest
|
||||
file_attribute = vim.vm.guest.FileManager.FileAttributes()
|
||||
url = content.guestOperationsManager.fileManager. \
|
||||
InitiateFileTransferToGuest(vm, creds, dest, file_attribute,
|
||||
filesize, overwrite)
|
||||
|
||||
# PUT the filedata to the url ...
|
||||
rsp, info = fetch_url(self.module, url, method="put", data=fdata,
|
||||
use_proxy=False, force=True, last_mod_time=None,
|
||||
timeout=10, headers=None)
|
||||
|
||||
result['msg'] = str(rsp.read())
|
||||
|
||||
# save all of the transfer data
|
||||
for k, v in iteritems(info):
|
||||
result[k] = v
|
||||
|
||||
return result
|
||||
|
||||
def run_command_in_guest(content, vm, username, password, program_path, program_args, program_cwd, program_env):
|
||||
|
||||
result = {'failed': False}
|
||||
|
||||
tools_status = vm.guest.toolsStatus
|
||||
if (tools_status == 'toolsNotInstalled' or
|
||||
tools_status == 'toolsNotRunning'):
|
||||
result['failed'] = True
|
||||
result['msg'] = "VMwareTools is not installed or is not running in the guest"
|
||||
return result
|
||||
|
||||
# https://github.com/vmware/pyvmomi/blob/master/docs/vim/vm/guest/NamePasswordAuthentication.rst
|
||||
creds = vim.vm.guest.NamePasswordAuthentication(
|
||||
username=username, password=password
|
||||
)
|
||||
|
||||
try:
|
||||
# https://github.com/vmware/pyvmomi/blob/master/docs/vim/vm/guest/ProcessManager.rst
|
||||
pm = content.guestOperationsManager.processManager
|
||||
# https://www.vmware.com/support/developer/converter-sdk/conv51_apireference/vim.vm.guest.ProcessManager.ProgramSpec.html
|
||||
ps = vim.vm.guest.ProcessManager.ProgramSpec(
|
||||
# programPath=program,
|
||||
# arguments=args
|
||||
programPath=program_path,
|
||||
arguments=program_args,
|
||||
workingDirectory=program_cwd,
|
||||
)
|
||||
|
||||
res = pm.StartProgramInGuest(vm, creds, ps)
|
||||
result['pid'] = res
|
||||
pdata = pm.ListProcessesInGuest(vm, creds, [res])
|
||||
|
||||
# wait for pid to finish
|
||||
while not pdata[0].endTime:
|
||||
time.sleep(1)
|
||||
pdata = pm.ListProcessesInGuest(vm, creds, [res])
|
||||
|
||||
result['owner'] = pdata[0].owner
|
||||
result['startTime'] = pdata[0].startTime.isoformat()
|
||||
result['endTime'] = pdata[0].endTime.isoformat()
|
||||
result['exitCode'] = pdata[0].exitCode
|
||||
if result['exitCode'] != 0:
|
||||
result['failed'] = True
|
||||
result['msg'] = "program exited non-zero"
|
||||
else:
|
||||
result['msg'] = "program completed successfully"
|
||||
|
||||
except Exception as e:
|
||||
result['msg'] = str(e)
|
||||
result['failed'] = True
|
||||
|
||||
return result
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue