Use constructable with NetBox dynamic inventory (#45913)

This commit is contained in:
Rémy Léone 2018-10-11 19:01:29 +02:00 committed by John R Barker
parent b2ac745461
commit a8925484c9

View file

@ -14,6 +14,8 @@ DOCUMENTATION = '''
short_description: NetBox inventory source short_description: NetBox inventory source
description: description:
- Get inventory hosts from NetBox - Get inventory hosts from NetBox
extends_documentation_fragment:
- constructed
options: options:
plugin: plugin:
description: token that ensures this is a source file for the 'netbox' plugin. description: token that ensures this is a source file for the 'netbox' plugin.
@ -51,10 +53,15 @@ DOCUMENTATION = '''
query_filters: query_filters:
description: List of parameters passed to the query string (Multiple values may be separated by commas) description: List of parameters passed to the query string (Multiple values may be separated by commas)
type: list type: list
default: []
timeout: timeout:
description: Timeout for Netbox requests in seconds description: Timeout for Netbox requests in seconds
type: int type: int
default: 60 default: 60
compose:
description: List of custom ansible host vars to create from the device object fetched from NetBox
default: {}
type: dict
''' '''
EXAMPLES = ''' EXAMPLES = '''
@ -83,6 +90,15 @@ query_filters:
query_filters: query_filters:
- cf_foo: bar - cf_foo: bar
# NetBox inventory plugin also supports Constructable semantics
# You can fill your hosts vars using the compose option:
plugin: netbox
compose:
foo: last_updated
bar: display_name
nested_variable: rack.display_name
''' '''
import json import json
@ -90,7 +106,7 @@ import uuid
from sys import version as python_version from sys import version as python_version
from threading import Thread from threading import Thread
from ansible.plugins.inventory import BaseInventoryPlugin from ansible.plugins.inventory import BaseInventoryPlugin, Constructable
from ansible.module_utils.ansible_release import __version__ as ansible_version from ansible.module_utils.ansible_release import __version__ as ansible_version
from ansible.errors import AnsibleError from ansible.errors import AnsibleError
from ansible.module_utils._text import to_text from ansible.module_utils._text import to_text
@ -131,7 +147,7 @@ ALLOWED_DEVICE_QUERY_PARAMETERS = (
) )
class InventoryModule(BaseInventoryPlugin): class InventoryModule(BaseInventoryPlugin, Constructable):
NAME = 'netbox' NAME = 'netbox'
def _fetch_information(self, url): def _fetch_information(self, url):
@ -358,6 +374,16 @@ class InventoryModule(BaseInventoryPlugin):
hostname = self.extract_name(host=host) hostname = self.extract_name(host=host)
self.inventory.add_host(host=hostname) self.inventory.add_host(host=hostname)
self._fill_host_variables(host=host, hostname=hostname) self._fill_host_variables(host=host, hostname=hostname)
strict = self.get_option("strict")
# Composed variables
self._set_composite_vars(self.get_option('compose'), host, hostname, strict=strict)
# Complex groups based on jinja2 conditionals, hosts that meet the conditional are added to group
self._set_composite_vars(self.get_option('compose'), host, hostname, strict=strict)
# Create groups based on variable values and add the corresponding hosts to it
self._add_host_to_keyed_groups(self.get_option('keyed_groups'), host, hostname, strict=strict)
self.add_host_to_groups(host=host, hostname=hostname) self.add_host_to_groups(host=host, hostname=hostname)
def parse(self, inventory, loader, path, cache=True): def parse(self, inventory, loader, path, cache=True):