mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
add template option to proxmox and proxmox_kvm (#7143)
* add template option to proxmox and proxmox_kvm * make recommended updates * fix tests * resolve comments on PR * save changes to changelog fragment * Update changelogs/fragments/7143-proxmox-template.yml Co-authored-by: Felix Fontein <felix@fontein.de> --------- Co-authored-by: Eric Trombly <etrombly@iomaxis.com> Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
567c7d1839
commit
07a47c047b
3 changed files with 89 additions and 6 deletions
3
changelogs/fragments/7143-proxmox-template.yml
Normal file
3
changelogs/fragments/7143-proxmox-template.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
minor_changes:
|
||||||
|
- proxmox - adds ``template`` value to the ``state`` parameter, allowing conversion of container to a template (https://github.com/ansible-collections/community.general/pull/7143).
|
||||||
|
- proxmox_kvm - adds ``template`` value to the ``state`` parameter, allowing conversion of a VM to a template (https://github.com/ansible-collections/community.general/pull/7143).
|
|
@ -144,8 +144,9 @@ options:
|
||||||
state:
|
state:
|
||||||
description:
|
description:
|
||||||
- Indicate desired state of the instance
|
- Indicate desired state of the instance
|
||||||
|
- V(template) was added in community.general 8.1.0.
|
||||||
type: str
|
type: str
|
||||||
choices: ['present', 'started', 'absent', 'stopped', 'restarted']
|
choices: ['present', 'started', 'absent', 'stopped', 'restarted', 'template']
|
||||||
default: present
|
default: present
|
||||||
pubkey:
|
pubkey:
|
||||||
description:
|
description:
|
||||||
|
@ -419,6 +420,23 @@ EXAMPLES = r'''
|
||||||
api_host: node1
|
api_host: node1
|
||||||
state: restarted
|
state: restarted
|
||||||
|
|
||||||
|
- name: Convert container to template
|
||||||
|
community.general.proxmox:
|
||||||
|
vmid: 100
|
||||||
|
api_user: root@pam
|
||||||
|
api_password: 1q2w3e
|
||||||
|
api_host: node1
|
||||||
|
state: template
|
||||||
|
|
||||||
|
- name: Convert container to template (stop container if running)
|
||||||
|
community.general.proxmox:
|
||||||
|
vmid: 100
|
||||||
|
api_user: root@pam
|
||||||
|
api_password: 1q2w3e
|
||||||
|
api_host: node1
|
||||||
|
state: template
|
||||||
|
force: true
|
||||||
|
|
||||||
- name: Remove container
|
- name: Remove container
|
||||||
community.general.proxmox:
|
community.general.proxmox:
|
||||||
vmid: 100
|
vmid: 100
|
||||||
|
@ -581,6 +599,13 @@ class ProxmoxLxcAnsible(ProxmoxAnsible):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def convert_to_template(self, vm, vmid, timeout, force):
|
||||||
|
if getattr(self.proxmox_api.nodes(vm['node']), VZ_TYPE)(vmid).status.current.get()['status'] == 'running' and force:
|
||||||
|
self.stop_instance(vm, vmid, timeout, force)
|
||||||
|
# not sure why, but templating a container doesn't return a taskid
|
||||||
|
getattr(self.proxmox_api.nodes(vm['node']), VZ_TYPE)(vmid).template.post()
|
||||||
|
return True
|
||||||
|
|
||||||
def umount_instance(self, vm, vmid, timeout):
|
def umount_instance(self, vm, vmid, timeout):
|
||||||
taskid = getattr(self.proxmox_api.nodes(vm['node']), VZ_TYPE)(vmid).status.umount.post()
|
taskid = getattr(self.proxmox_api.nodes(vm['node']), VZ_TYPE)(vmid).status.umount.post()
|
||||||
while timeout:
|
while timeout:
|
||||||
|
@ -621,7 +646,7 @@ def main():
|
||||||
timeout=dict(type='int', default=30),
|
timeout=dict(type='int', default=30),
|
||||||
force=dict(type='bool', default=False),
|
force=dict(type='bool', default=False),
|
||||||
purge=dict(type='bool', default=False),
|
purge=dict(type='bool', default=False),
|
||||||
state=dict(default='present', choices=['present', 'absent', 'stopped', 'started', 'restarted']),
|
state=dict(default='present', choices=['present', 'absent', 'stopped', 'started', 'restarted', 'template']),
|
||||||
pubkey=dict(type='str'),
|
pubkey=dict(type='str'),
|
||||||
unprivileged=dict(type='bool', default=True),
|
unprivileged=dict(type='bool', default=True),
|
||||||
description=dict(type='str'),
|
description=dict(type='str'),
|
||||||
|
@ -791,6 +816,15 @@ def main():
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
module.fail_json(vmid=vmid, msg="stopping of VM %s failed with exception: %s" % (vmid, e))
|
module.fail_json(vmid=vmid, msg="stopping of VM %s failed with exception: %s" % (vmid, e))
|
||||||
|
|
||||||
|
elif state == 'template':
|
||||||
|
try:
|
||||||
|
vm = proxmox.get_vm(vmid)
|
||||||
|
|
||||||
|
proxmox.convert_to_template(vm, vmid, timeout, force=module.params['force'])
|
||||||
|
module.exit_json(changed=True, msg="VM %s is converted to template" % vmid)
|
||||||
|
except Exception as e:
|
||||||
|
module.fail_json(vmid=vmid, msg="conversion of VM %s to template failed with exception: %s" % (vmid, e))
|
||||||
|
|
||||||
elif state == 'restarted':
|
elif state == 'restarted':
|
||||||
try:
|
try:
|
||||||
vm = proxmox.get_vm(vmid)
|
vm = proxmox.get_vm(vmid)
|
||||||
|
|
|
@ -453,8 +453,9 @@ options:
|
||||||
description:
|
description:
|
||||||
- Indicates desired state of the instance.
|
- Indicates desired state of the instance.
|
||||||
- If V(current), the current state of the VM will be fetched. You can access it with C(results.status)
|
- If V(current), the current state of the VM will be fetched. You can access it with C(results.status)
|
||||||
|
- V(template) was added in community.general 8.1.0.
|
||||||
type: str
|
type: str
|
||||||
choices: ['present', 'started', 'absent', 'stopped', 'restarted', 'current']
|
choices: ['present', 'started', 'absent', 'stopped', 'restarted', 'current', 'template']
|
||||||
default: present
|
default: present
|
||||||
storage:
|
storage:
|
||||||
description:
|
description:
|
||||||
|
@ -792,6 +793,25 @@ EXAMPLES = '''
|
||||||
node: sabrewulf
|
node: sabrewulf
|
||||||
state: restarted
|
state: restarted
|
||||||
|
|
||||||
|
- name: Convert VM to template
|
||||||
|
community.general.proxmox_kvm:
|
||||||
|
api_user: root@pam
|
||||||
|
api_password: secret
|
||||||
|
api_host: helldorado
|
||||||
|
name: spynal
|
||||||
|
node: sabrewulf
|
||||||
|
state: template
|
||||||
|
|
||||||
|
- name: Convert VM to template (stop VM if running)
|
||||||
|
community.general.proxmox_kvm:
|
||||||
|
api_user: root@pam
|
||||||
|
api_password: secret
|
||||||
|
api_host: helldorado
|
||||||
|
name: spynal
|
||||||
|
node: sabrewulf
|
||||||
|
state: template
|
||||||
|
force: true
|
||||||
|
|
||||||
- name: Remove VM
|
- name: Remove VM
|
||||||
community.general.proxmox_kvm:
|
community.general.proxmox_kvm:
|
||||||
api_user: root@pam
|
api_user: root@pam
|
||||||
|
@ -1135,6 +1155,19 @@ class ProxmoxKvmAnsible(ProxmoxAnsible):
|
||||||
self.module.fail_json(vmid=vmid, msg="restarting of VM %s failed with exception: %s" % (vmid, e))
|
self.module.fail_json(vmid=vmid, msg="restarting of VM %s failed with exception: %s" % (vmid, e))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def convert_to_template(self, vm, timeout, force):
|
||||||
|
vmid = vm['vmid']
|
||||||
|
try:
|
||||||
|
proxmox_node = self.proxmox_api.nodes(vm['node'])
|
||||||
|
if proxmox_node.qemu(vmid).status.current.get()['status'] == 'running' and force:
|
||||||
|
self.stop_instance(vm, vmid, timeout, force)
|
||||||
|
# not sure why, but templating a container doesn't return a taskid
|
||||||
|
proxmox_node.qemu(vmid).template.post()
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
self.module.fail_json(vmid=vmid, msg="conversion of VM %s to template failed with exception: %s" % (vmid, e))
|
||||||
|
return False
|
||||||
|
|
||||||
def migrate_vm(self, vm, target_node):
|
def migrate_vm(self, vm, target_node):
|
||||||
vmid = vm['vmid']
|
vmid = vm['vmid']
|
||||||
proxmox_node = self.proxmox_api.nodes(vm['node'])
|
proxmox_node = self.proxmox_api.nodes(vm['node'])
|
||||||
|
@ -1222,7 +1255,7 @@ def main():
|
||||||
sshkeys=dict(type='str', no_log=False),
|
sshkeys=dict(type='str', no_log=False),
|
||||||
startdate=dict(type='str'),
|
startdate=dict(type='str'),
|
||||||
startup=dict(),
|
startup=dict(),
|
||||||
state=dict(default='present', choices=['present', 'absent', 'stopped', 'started', 'restarted', 'current']),
|
state=dict(default='present', choices=['present', 'absent', 'stopped', 'started', 'restarted', 'current', 'template']),
|
||||||
storage=dict(type='str'),
|
storage=dict(type='str'),
|
||||||
tablet=dict(type='bool'),
|
tablet=dict(type='bool'),
|
||||||
tags=dict(type='list', elements='str'),
|
tags=dict(type='list', elements='str'),
|
||||||
|
@ -1492,11 +1525,24 @@ def main():
|
||||||
if vm['status'] == 'stopped':
|
if vm['status'] == 'stopped':
|
||||||
module.exit_json(changed=False, vmid=vmid, msg="VM %s is already stopped" % vmid, **status)
|
module.exit_json(changed=False, vmid=vmid, msg="VM %s is already stopped" % vmid, **status)
|
||||||
|
|
||||||
if proxmox.stop_vm(vm, force=module.params['force'], timeout=module.params['timeout']):
|
proxmox.stop_vm(vm, force=module.params['force'], timeout=module.params['timeout'])
|
||||||
module.exit_json(changed=True, vmid=vmid, msg="VM %s is shutting down" % vmid, **status)
|
module.exit_json(changed=True, vmid=vmid, msg="VM %s is shutting down" % vmid, **status)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
module.fail_json(vmid=vmid, msg="stopping of VM %s failed with exception: %s" % (vmid, e), **status)
|
module.fail_json(vmid=vmid, msg="stopping of VM %s failed with exception: %s" % (vmid, e), **status)
|
||||||
|
|
||||||
|
elif state == 'template':
|
||||||
|
if not vmid:
|
||||||
|
module.fail_json(msg='VM with name = %s does not exist in cluster' % name)
|
||||||
|
|
||||||
|
status = {}
|
||||||
|
try:
|
||||||
|
vm = proxmox.get_vm(vmid)
|
||||||
|
|
||||||
|
if proxmox.convert_to_template(vm, force=module.params['force'], timeout=module.params['timeout']):
|
||||||
|
module.exit_json(changed=True, vmid=vmid, msg="VM %s is converting to template" % vmid, **status)
|
||||||
|
except Exception as e:
|
||||||
|
module.fail_json(vmid=vmid, msg="conversion of VM %s to template failed with exception: %s" % (vmid, e), **status)
|
||||||
|
|
||||||
elif state == 'restarted':
|
elif state == 'restarted':
|
||||||
if not vmid:
|
if not vmid:
|
||||||
module.fail_json(msg='VM with name = %s does not exist in cluster' % name)
|
module.fail_json(msg='VM with name = %s does not exist in cluster' % name)
|
||||||
|
|
Loading…
Reference in a new issue