mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Add option to proxmox dynamic inventory to exclude nodes (#7461)
* Create option to exclude proxmox nodes * improve node exclusion by only remove the top level group * add fragment * Update changelogs/fragments/7437-proxmox-inventory-add-exclude-nodes.yaml Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/inventory/proxmox.py Co-authored-by: Felix Fontein <felix@fontein.de> * Rework node exclusion * Update fragement PR number * include release version in option Co-authored-by: Felix Fontein <felix@fontein.de> * Clarify description * Update unit test * Fix typos in unit test * Fix additonal typos in test * Fix CI * Fixing yet another whitespace pep error --------- Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
938aec492e
commit
d05932fb2c
3 changed files with 60 additions and 11 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
minor_changes:
|
||||||
|
- proxmox inventory plugin - adds an option to exclude nodes from the dynamic inventory generation. The new setting is optional, not using this option will behave as usual (https://github.com/ansible-collections/community.general/issues/6714, https://github.com/ansible-collections/community.general/pull/7461).
|
|
@ -116,6 +116,11 @@ DOCUMENTATION = '''
|
||||||
- The default of this option changed from V(true) to V(false) in community.general 6.0.0.
|
- The default of this option changed from V(true) to V(false) in community.general 6.0.0.
|
||||||
type: bool
|
type: bool
|
||||||
default: false
|
default: false
|
||||||
|
exclude_nodes:
|
||||||
|
description: Exclude proxmox nodes and the nodes-group from the inventory output.
|
||||||
|
type: bool
|
||||||
|
default: false
|
||||||
|
version_added: 8.1.0
|
||||||
filters:
|
filters:
|
||||||
version_added: 4.6.0
|
version_added: 4.6.0
|
||||||
description: A list of Jinja templates that allow filtering hosts.
|
description: A list of Jinja templates that allow filtering hosts.
|
||||||
|
@ -565,9 +570,9 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||||
|
|
||||||
for group in default_groups:
|
for group in default_groups:
|
||||||
self.inventory.add_group(self._group('all_%s' % (group)))
|
self.inventory.add_group(self._group('all_%s' % (group)))
|
||||||
|
|
||||||
nodes_group = self._group('nodes')
|
nodes_group = self._group('nodes')
|
||||||
self.inventory.add_group(nodes_group)
|
if not self.exclude_nodes:
|
||||||
|
self.inventory.add_group(nodes_group)
|
||||||
|
|
||||||
want_proxmox_nodes_ansible_host = self.get_option("want_proxmox_nodes_ansible_host")
|
want_proxmox_nodes_ansible_host = self.get_option("want_proxmox_nodes_ansible_host")
|
||||||
|
|
||||||
|
@ -577,22 +582,23 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||||
for node in self._get_nodes():
|
for node in self._get_nodes():
|
||||||
if not node.get('node'):
|
if not node.get('node'):
|
||||||
continue
|
continue
|
||||||
|
if not self.exclude_nodes:
|
||||||
self.inventory.add_host(node['node'])
|
self.inventory.add_host(node['node'])
|
||||||
if node['type'] == 'node':
|
if node['type'] == 'node' and not self.exclude_nodes:
|
||||||
self.inventory.add_child(nodes_group, node['node'])
|
self.inventory.add_child(nodes_group, node['node'])
|
||||||
|
|
||||||
if node['status'] == 'offline':
|
if node['status'] == 'offline':
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# get node IP address
|
# get node IP address
|
||||||
if want_proxmox_nodes_ansible_host:
|
if want_proxmox_nodes_ansible_host and not self.exclude_nodes:
|
||||||
ip = self._get_node_ip(node['node'])
|
ip = self._get_node_ip(node['node'])
|
||||||
self.inventory.set_variable(node['node'], 'ansible_host', ip)
|
self.inventory.set_variable(node['node'], 'ansible_host', ip)
|
||||||
|
|
||||||
# Setting composite variables
|
# Setting composite variables
|
||||||
variables = self.inventory.get_host(node['node']).get_vars()
|
if not self.exclude_nodes:
|
||||||
self._set_composite_vars(self.get_option('compose'), variables, node['node'], strict=self.strict)
|
variables = self.inventory.get_host(node['node']).get_vars()
|
||||||
|
self._set_composite_vars(self.get_option('compose'), variables, node['node'], strict=self.strict)
|
||||||
|
|
||||||
# add LXC/Qemu groups for the node
|
# add LXC/Qemu groups for the node
|
||||||
for ittype in ('lxc', 'qemu'):
|
for ittype in ('lxc', 'qemu'):
|
||||||
|
@ -635,8 +641,8 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
||||||
|
|
||||||
if self.get_option('qemu_extended_statuses') and not self.get_option('want_facts'):
|
if self.get_option('qemu_extended_statuses') and not self.get_option('want_facts'):
|
||||||
raise AnsibleError('You must set want_facts to True if you want to use qemu_extended_statuses.')
|
raise AnsibleError('You must set want_facts to True if you want to use qemu_extended_statuses.')
|
||||||
|
|
||||||
# read rest of options
|
# read rest of options
|
||||||
|
self.exclude_nodes = self.get_option('exclude_nodes')
|
||||||
self.cache_key = self.get_cache_key(path)
|
self.cache_key = self.get_cache_key(path)
|
||||||
self.use_cache = cache and self.get_option('cache')
|
self.use_cache = cache and self.get_option('cache')
|
||||||
self.host_filters = self.get_option('filters')
|
self.host_filters = self.get_option('filters')
|
||||||
|
|
|
@ -646,13 +646,15 @@ def test_populate(inventory, mocker):
|
||||||
inventory.group_prefix = 'proxmox_'
|
inventory.group_prefix = 'proxmox_'
|
||||||
inventory.facts_prefix = 'proxmox_'
|
inventory.facts_prefix = 'proxmox_'
|
||||||
inventory.strict = False
|
inventory.strict = False
|
||||||
|
inventory.exclude_nodes = False
|
||||||
|
|
||||||
opts = {
|
opts = {
|
||||||
'group_prefix': 'proxmox_',
|
'group_prefix': 'proxmox_',
|
||||||
'facts_prefix': 'proxmox_',
|
'facts_prefix': 'proxmox_',
|
||||||
'want_facts': True,
|
'want_facts': True,
|
||||||
'want_proxmox_nodes_ansible_host': True,
|
'want_proxmox_nodes_ansible_host': True,
|
||||||
'qemu_extended_statuses': True
|
'qemu_extended_statuses': True,
|
||||||
|
'exclude_nodes': False
|
||||||
}
|
}
|
||||||
|
|
||||||
# bypass authentication and API fetch calls
|
# bypass authentication and API fetch calls
|
||||||
|
@ -723,13 +725,15 @@ def test_populate_missing_qemu_extended_groups(inventory, mocker):
|
||||||
inventory.group_prefix = 'proxmox_'
|
inventory.group_prefix = 'proxmox_'
|
||||||
inventory.facts_prefix = 'proxmox_'
|
inventory.facts_prefix = 'proxmox_'
|
||||||
inventory.strict = False
|
inventory.strict = False
|
||||||
|
inventory.exclude_nodes = False
|
||||||
|
|
||||||
opts = {
|
opts = {
|
||||||
'group_prefix': 'proxmox_',
|
'group_prefix': 'proxmox_',
|
||||||
'facts_prefix': 'proxmox_',
|
'facts_prefix': 'proxmox_',
|
||||||
'want_facts': True,
|
'want_facts': True,
|
||||||
'want_proxmox_nodes_ansible_host': True,
|
'want_proxmox_nodes_ansible_host': True,
|
||||||
'qemu_extended_statuses': False
|
'qemu_extended_statuses': False,
|
||||||
|
'exclude_nodes': False
|
||||||
}
|
}
|
||||||
|
|
||||||
# bypass authentication and API fetch calls
|
# bypass authentication and API fetch calls
|
||||||
|
@ -743,3 +747,40 @@ def test_populate_missing_qemu_extended_groups(inventory, mocker):
|
||||||
# make sure that ['prelaunch', 'paused'] are not in the group list
|
# make sure that ['prelaunch', 'paused'] are not in the group list
|
||||||
for group in ['paused', 'prelaunch']:
|
for group in ['paused', 'prelaunch']:
|
||||||
assert ('%sall_%s' % (inventory.group_prefix, group)) not in inventory.inventory.groups
|
assert ('%sall_%s' % (inventory.group_prefix, group)) not in inventory.inventory.groups
|
||||||
|
|
||||||
|
|
||||||
|
def test_populate_exclude_nodes(inventory, mocker):
|
||||||
|
# module settings
|
||||||
|
inventory.proxmox_user = 'root@pam'
|
||||||
|
inventory.proxmox_password = 'password'
|
||||||
|
inventory.proxmox_url = 'https://localhost:8006'
|
||||||
|
inventory.group_prefix = 'proxmox_'
|
||||||
|
inventory.facts_prefix = 'proxmox_'
|
||||||
|
inventory.strict = False
|
||||||
|
inventory.exclude_nodes = True
|
||||||
|
|
||||||
|
opts = {
|
||||||
|
'group_prefix': 'proxmox_',
|
||||||
|
'facts_prefix': 'proxmox_',
|
||||||
|
'want_facts': True,
|
||||||
|
'want_proxmox_nodes_ansible_host': True,
|
||||||
|
'qemu_extended_statuses': False,
|
||||||
|
'exclude_nodes': True
|
||||||
|
}
|
||||||
|
|
||||||
|
# bypass authentication and API fetch calls
|
||||||
|
inventory._get_auth = mocker.MagicMock(side_effect=get_auth)
|
||||||
|
inventory._get_json = mocker.MagicMock(side_effect=get_json)
|
||||||
|
inventory._get_vm_snapshots = mocker.MagicMock(side_effect=get_vm_snapshots)
|
||||||
|
inventory.get_option = mocker.MagicMock(side_effect=get_option(opts))
|
||||||
|
inventory._can_add_host = mocker.MagicMock(return_value=True)
|
||||||
|
inventory._populate()
|
||||||
|
|
||||||
|
# make sure that nodes are not in the inventory
|
||||||
|
for node in ['testnode', 'testnode2']:
|
||||||
|
assert node not in inventory.inventory.hosts
|
||||||
|
# make sure that nodes group is absent
|
||||||
|
assert ('%s_nodes' % (inventory.group_prefix)) not in inventory.inventory.groups
|
||||||
|
# make sure that nodes are not in the "ungrouped" group
|
||||||
|
for node in ['testnode', 'testnode2']:
|
||||||
|
assert node not in inventory.inventory.get_groups_dict()["ungrouped"]
|
||||||
|
|
Loading…
Reference in a new issue