1
0
Fork 0
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:
Eric Trombly 2023-11-05 08:57:16 -06:00 committed by GitHub
parent 567c7d1839
commit 07a47c047b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 89 additions and 6 deletions

View 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).

View file

@ -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)

View file

@ -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)