mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
feat: add tags to proxmox containers (#5714)
* feat: add tags to proxmox containers * fix: correct version added * fix: code style * feat: changelog fragment * fix: correct version_added Co-authored-by: Felix Fontein <felix@fontein.de> * feat: fail on unsupported params, rather than silently ignoring them * fix: actually check unsupported feature presence before failing Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
669d0925f7
commit
2d4ce9f219
2 changed files with 37 additions and 1 deletions
3
changelogs/fragments/5714-proxmox-lxc-tag-support.yml
Normal file
3
changelogs/fragments/5714-proxmox-lxc-tag-support.yml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
minor_changes:
|
||||||
|
- proxmox - added new module parameter ``tags`` for use with PVE 7+ (https://github.com/ansible-collections/community.general/pull/5714).
|
|
@ -106,6 +106,14 @@ options:
|
||||||
description:
|
description:
|
||||||
- sets DNS search domain for a container
|
- sets DNS search domain for a container
|
||||||
type: str
|
type: str
|
||||||
|
tags:
|
||||||
|
description:
|
||||||
|
- List of tags to apply to the container.
|
||||||
|
- Tags must start with C([a-z0-9_]) followed by zero or more of the following characters C([a-z0-9_-+.]).
|
||||||
|
- Tags are only available in Proxmox 7+.
|
||||||
|
type: list
|
||||||
|
elements: str
|
||||||
|
version_added: 6.2.0
|
||||||
timeout:
|
timeout:
|
||||||
description:
|
description:
|
||||||
- timeout for operations
|
- timeout for operations
|
||||||
|
@ -391,6 +399,7 @@ EXAMPLES = r'''
|
||||||
state: absent
|
state: absent
|
||||||
'''
|
'''
|
||||||
|
|
||||||
|
import re
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
|
from ansible_collections.community.general.plugins.module_utils.version import LooseVersion
|
||||||
|
@ -415,11 +424,25 @@ class ProxmoxLxcAnsible(ProxmoxAnsible):
|
||||||
return config['template']
|
return config['template']
|
||||||
|
|
||||||
def create_instance(self, vmid, node, disk, storage, cpus, memory, swap, timeout, clone, **kwargs):
|
def create_instance(self, vmid, node, disk, storage, cpus, memory, swap, timeout, clone, **kwargs):
|
||||||
|
|
||||||
|
# Version limited features
|
||||||
|
minimum_version = {
|
||||||
|
'tags': 7,
|
||||||
|
}
|
||||||
proxmox_node = self.proxmox_api.nodes(node)
|
proxmox_node = self.proxmox_api.nodes(node)
|
||||||
|
|
||||||
# Remove all empty kwarg entries
|
# Remove all empty kwarg entries
|
||||||
kwargs = dict((k, v) for k, v in kwargs.items() if v is not None)
|
kwargs = dict((k, v) for k, v in kwargs.items() if v is not None)
|
||||||
|
|
||||||
|
version = self.version()
|
||||||
|
pve_major_version = 3 if version < LooseVersion('4.0') else version.version[0]
|
||||||
|
|
||||||
|
# Fail on unsupported features
|
||||||
|
for option, version in minimum_version.items():
|
||||||
|
if pve_major_version < version and option in kwargs:
|
||||||
|
self.module.fail_json(changed=False, msg="Feature {option} is only supported in PVE {version}+, and you're using PVE {pve_major_version}".
|
||||||
|
format(option=option, version=version, pve_major_version=pve_major_version))
|
||||||
|
|
||||||
if VZ_TYPE == 'lxc':
|
if VZ_TYPE == 'lxc':
|
||||||
kwargs['cpulimit'] = cpus
|
kwargs['cpulimit'] = cpus
|
||||||
kwargs['rootfs'] = disk
|
kwargs['rootfs'] = disk
|
||||||
|
@ -437,6 +460,14 @@ class ProxmoxLxcAnsible(ProxmoxAnsible):
|
||||||
kwargs['cpus'] = cpus
|
kwargs['cpus'] = cpus
|
||||||
kwargs['disk'] = disk
|
kwargs['disk'] = disk
|
||||||
|
|
||||||
|
# LXC tags are expected to be valid and presented as a comma/semi-colon delimited string
|
||||||
|
if 'tags' in kwargs:
|
||||||
|
re_tag = re.compile(r'^[a-z0-9_][a-z0-9_\-\+\.]*$')
|
||||||
|
for tag in kwargs['tags']:
|
||||||
|
if not re_tag.match(tag):
|
||||||
|
self.module.fail_json(msg='%s is not a valid tag' % tag)
|
||||||
|
kwargs['tags'] = ",".join(kwargs['tags'])
|
||||||
|
|
||||||
if clone is not None:
|
if clone is not None:
|
||||||
if VZ_TYPE != 'lxc':
|
if VZ_TYPE != 'lxc':
|
||||||
self.module.fail_json(changed=False, msg="Clone operator is only supported for LXC enabled proxmox clusters.")
|
self.module.fail_json(changed=False, msg="Clone operator is only supported for LXC enabled proxmox clusters.")
|
||||||
|
@ -569,6 +600,7 @@ def main():
|
||||||
proxmox_default_behavior=dict(type='str', default='no_defaults', choices=['compatibility', 'no_defaults']),
|
proxmox_default_behavior=dict(type='str', default='no_defaults', choices=['compatibility', 'no_defaults']),
|
||||||
clone=dict(type='int'),
|
clone=dict(type='int'),
|
||||||
clone_type=dict(default='opportunistic', choices=['full', 'linked', 'opportunistic']),
|
clone_type=dict(default='opportunistic', choices=['full', 'linked', 'opportunistic']),
|
||||||
|
tags=dict(type='list', elements='str')
|
||||||
)
|
)
|
||||||
module_args.update(proxmox_args)
|
module_args.update(proxmox_args)
|
||||||
|
|
||||||
|
@ -674,7 +706,8 @@ def main():
|
||||||
features=",".join(module.params['features']) if module.params['features'] is not None else None,
|
features=",".join(module.params['features']) if module.params['features'] is not None else None,
|
||||||
unprivileged=ansible_to_proxmox_bool(module.params['unprivileged']),
|
unprivileged=ansible_to_proxmox_bool(module.params['unprivileged']),
|
||||||
description=module.params['description'],
|
description=module.params['description'],
|
||||||
hookscript=module.params['hookscript'])
|
hookscript=module.params['hookscript'],
|
||||||
|
tags=module.params['tags'])
|
||||||
|
|
||||||
module.exit_json(changed=True, msg="Deployed VM %s from template %s" % (vmid, module.params['ostemplate']))
|
module.exit_json(changed=True, msg="Deployed VM %s from template %s" % (vmid, module.params['ostemplate']))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
Loading…
Reference in a new issue