summaryrefslogtreecommitdiffstats
path: root/ansible_collections/dellemc/openmanage/plugins/inventory
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-18 05:52:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-18 05:52:35 +0000
commit7fec0b69a082aaeec72fee0612766aa42f6b1b4d (patch)
treeefb569b86ca4da888717f5433e757145fa322e08 /ansible_collections/dellemc/openmanage/plugins/inventory
parentReleasing progress-linux version 7.7.0+dfsg-3~progress7.99u1. (diff)
downloadansible-7fec0b69a082aaeec72fee0612766aa42f6b1b4d.tar.xz
ansible-7fec0b69a082aaeec72fee0612766aa42f6b1b4d.zip
Merging upstream version 9.4.0+dfsg.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ansible_collections/dellemc/openmanage/plugins/inventory')
-rw-r--r--ansible_collections/dellemc/openmanage/plugins/inventory/ome_inventory.py208
1 files changed, 208 insertions, 0 deletions
diff --git a/ansible_collections/dellemc/openmanage/plugins/inventory/ome_inventory.py b/ansible_collections/dellemc/openmanage/plugins/inventory/ome_inventory.py
new file mode 100644
index 000000000..93171a429
--- /dev/null
+++ b/ansible_collections/dellemc/openmanage/plugins/inventory/ome_inventory.py
@@ -0,0 +1,208 @@
+# -*- coding: utf-8 -*-
+
+#
+# Dell OpenManage Ansible Modules
+# Version 7.4.0
+# Copyright (C) 2022-2023 Dell Inc. or its subsidiaries. All Rights Reserved.
+
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+#
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+
+DOCUMENTATION = """
+---
+name: ome_inventory
+short_description: Group inventory plugin on OpenManage Enterprise.
+description: This plugin allows to retrieve inventory hosts from groups on OpenManage Enterprise.
+version_added: "7.1.0"
+options:
+ hostname:
+ description:
+ - OpenManage Enterprise or OpenManage Enterprise Modular IP address or hostname.
+ - If the value is not specified in the task, the value of environment variable C(OME_HOSTNAME) will be used instead.
+ env:
+ - name: OME_HOSTNAME
+ type: str
+ required: true
+ username:
+ description:
+ - OpenManage Enterprise or OpenManage Enterprise Modular username.
+ - If the value is not specified in the task, the value of environment variable C(OME_USERNAME) will be used instead.
+ env:
+ - name: OME_USERNAME
+ type: str
+ required: true
+ password:
+ description:
+ - OpenManage Enterprise or OpenManage Enterprise Modular password.
+ - If the value is not specified in the task, the value of environment variable C(OME_PASSWORD) will be used instead.
+ env:
+ - name: OME_PASSWORD
+ type: str
+ required: true
+ port:
+ description:
+ - OpenManage Enterprise or OpenManage Enterprise Modular HTTPS port.
+ - If the value is not specified in the task, the value of environment variable C(OME_PORT) will be used instead.
+ type: int
+ default: 443
+ validate_certs:
+ description:
+ - If C(false), the SSL certificates will not be validated.
+ - Configure C(false) only on personally controlled sites where self-signed certificates are used.
+ - Prior to collection version C(5.0.0), the I(validate_certs) is C(false) by default.
+ type: bool
+ default: true
+ ca_path:
+ description:
+ - The Privacy Enhanced Mail (PEM) file that contains a CA certificate to be used for the validation.
+ type: path
+ timeout:
+ description: The socket level timeout in seconds.
+ type: int
+ default: 30
+ ome_group_name:
+ description: Group name.
+ type: str
+ required: false
+ host_vars:
+ description: To include host related variables in the inventory source.
+ type: dict
+ required: false
+ group_vars:
+ description: To include group variables in the inventory source.
+ type: dict
+ required: false
+requirements:
+ - "python >= 3.9.6"
+author:
+ - "Felix Stephen (@felixs88)"
+notes:
+ - Run this plugin on a system that has direct access to Dell OpenManage Enterprise.
+"""
+
+from ansible.plugins.inventory import BaseInventoryPlugin
+from ansible_collections.dellemc.openmanage.plugins.module_utils.ome import RestOME
+from ansible_collections.dellemc.openmanage.plugins.module_utils.utils import get_all_data_with_pagination
+
+GROUP_API = "GroupService/Groups"
+
+
+class InventoryModule(BaseInventoryPlugin):
+
+ NAME = "dellemc.openmanage.ome_inventory"
+
+ def __init__(self):
+ super(InventoryModule, self).__init__()
+ self.config = None
+
+ def _get_connection_resp(self):
+ port = self.get_option("port") if "port" in self.config else 443
+ validate_certs = self.get_option("validate_certs") if "validate_certs" in self.config else False
+ module_params = {"hostname": self.get_option("hostname"), "username": self.get_option("username"),
+ "password": self.get_option("password"), "port": port, "validate_certs": validate_certs}
+ if "ca_path" in self.config:
+ module_params.update({"ca_path": self.get_option("ca_path")})
+ with RestOME(module_params, req_session=False) as ome:
+ all_group_data = get_all_data_with_pagination(ome, GROUP_API)
+ return all_group_data
+
+ def _set_host_vars(self, host):
+ self.inventory.set_variable(host, "idrac_ip", host)
+ self.inventory.set_variable(host, "baseuri", host)
+ self.inventory.set_variable(host, "hostname", host)
+ if "host_vars" in self.config:
+ host_vars = self.get_option("host_vars")
+ for key, val in dict(host_vars).items():
+ self.inventory.set_variable(host, key, val)
+
+ def _set_group_vars(self, group):
+ self.inventory.add_group(group)
+ if "group_vars" in self.config:
+ group_vars = self.get_option("group_vars")
+ if group in dict(group_vars):
+ for key, val in dict(dict(group_vars)[group]).items():
+ self.inventory.set_variable(group, key, val)
+
+ def _get_device_host(self, mgmt):
+ if len(mgmt["DeviceManagement"]) == 1 and mgmt["DeviceManagement"][0]["NetworkAddress"].startswith("["):
+ dev_host = mgmt["DeviceManagement"][0]["NetworkAddress"][1:-1]
+ elif len(mgmt["DeviceManagement"]) == 2 and mgmt["DeviceManagement"][0]["NetworkAddress"].startswith("["):
+ dev_host = mgmt["DeviceManagement"][1]["NetworkAddress"]
+ else:
+ dev_host = mgmt["DeviceManagement"][0]["NetworkAddress"]
+ return dev_host
+
+ def _get_all_devices(self, device_uri):
+ device_host = []
+ device_host_uri = device_uri.strip("/api/")
+ port = self.get_option("port") if "port" in self.config else 443
+ validate_certs = self.get_option("validate_certs") if "validate_certs" in self.config else False
+ module_params = {
+ "hostname": self.get_option("hostname"),
+ "username": self.get_option("username"),
+ "password": self.get_option("password"),
+ "port": port,
+ "validate_certs": validate_certs}
+ if "ca_path" in self.config:
+ module_params.update({"ca_path": self.get_option("ca_path")})
+ with RestOME(module_params, req_session=False) as ome:
+ device_resp = get_all_data_with_pagination(ome, device_host_uri)
+ device_data = device_resp.get("report_list", [])
+ if device_data is not None:
+ for mgmt in device_data:
+ if (len(mgmt["DeviceManagement"]) != 0):
+ device_host.append(self._get_device_host(mgmt))
+ return device_host
+
+ def _set_child_group(self, group_data):
+ port = self.get_option("port") if "port" in self.config else 443
+ validate_certs = self.get_option("validate_certs") if "validate_certs" in self.config else False
+ module_params = {"hostname": self.get_option("hostname"), "username": self.get_option("username"),
+ "password": self.get_option("password"), "port": port, "validate_certs": validate_certs}
+ if "ca_path" in self.config:
+ module_params.update({"ca_path": self.get_option("ca_path")})
+ with RestOME(module_params, req_session=False) as ome:
+ for gdata in group_data:
+ group_name = gdata["Name"]
+ subgroup_uri = gdata["SubGroups@odata.navigationLink"].strip("/api/")
+ sub_group = get_all_data_with_pagination(ome, subgroup_uri)
+ gdata = sub_group.get("report_list", [])
+ if gdata:
+ self._add_group_data(gdata)
+ self._add_child_group_data(group_name, gdata)
+
+ def _add_child_group_data(self, group_name, gdata):
+ for child_name in gdata:
+ self.inventory.add_child(group_name, child_name["Name"])
+
+ def _add_group_data(self, group_data):
+ visible_gdata = list(filter(lambda d: d.get("Visible") in [False], group_data))
+ if visible_gdata:
+ for gp in visible_gdata:
+ group_data.remove(gp)
+ for gdata in group_data:
+ self._set_group_vars(gdata["Name"])
+ device_ip = self._get_all_devices(gdata["AllLeafDevices@odata.navigationLink"])
+ for hst in device_ip:
+ self.inventory.add_host(host=hst, group=gdata["Name"])
+ self._set_host_vars(hst)
+ self._set_child_group(group_data)
+
+ def _populate(self, all_group_data):
+ group_data = all_group_data.get("report_list", [])
+ group_name = str(self.get_option("ome_group_name")) if "ome_group_name" in self.config else None
+ if group_name is not None:
+ group_data = list(filter(lambda d: d.get("Name").lower() in [group_name.lower()], group_data))
+ elif group_name is None:
+ group_data = list(filter(lambda d: d.get("Name") in ["All Devices"], group_data))
+ self._add_group_data(group_data)
+
+ def parse(self, inventory, loader, path, cache=True):
+ super(InventoryModule, self).parse(inventory, loader, path, cache)
+ self.config = self._read_config_data(path)
+ all_group_data = self._get_connection_resp()
+ self._populate(all_group_data)