from ansible.plugins.inventory import BaseInventoryPlugin from ansible.inventory.data import InventoryData from ansible.parsing.dataloader import DataLoader from xmlrpc.client import ServerProxy from zeep import Client, Settings from ansible.utils.display import Display display = Display() class InventoryModule(BaseInventoryPlugin): NAME = "sebastian.netcup.scp" loader: DataLoader inventory: InventoryData plugin: str args: dict[str, str] def parse(self, inventory: InventoryData, loader: DataLoader, path: str, cache=True): super(InventoryModule, self).parse(inventory, loader, path, cache) try: self.config = self._read_config_data(path) except Exception as e: raise e return self.plugin = self.config["plugin"] self.args = dict(loginName=str(self.config["userid"]), password=str(self.config["password"])) client = Client("https://www.servercontrolpanel.de/SCP/WSEndUser?wsdl", settings=Settings(force_https=True)) self.service = client.service inventory.add_group("netcup") inventory.add_group("netcup_online") inventory.add_group("netcup_offline") inventory.add_child("netcup", "netcup_online") inventory.add_child("netcup", "netcup_offline") for hostname in self.service.getVServers(**self.args): serverinfo = self.service.getVServerInformation(vservername=hostname, **self.args) nickname = serverinfo["vServerNickname"] or serverinfo["vServerName"] group = "netcup_online" if serverinfo["status"] != "online": group = "netcup_offline" if inventory.get_host(nickname) is None: inventory.add_host(nickname, group) else: inventory.add_child(group, nickname) interfaces = [] for interface in serverinfo["serverInterfaces"]: interfaces.append( dict( driver=interface["driver"], id=interface["id"], ipv4=interface["ipv4IP"], ipv6=interface["ipv6IP"], mac=interface["mac"], ) ) inventory.set_variable(nickname, "interfaces", interfaces) inventory.set_variable(nickname, "memory", serverinfo["memory"]) inventory.set_variable(nickname, "name", serverinfo["vServerName"]) inventory.set_variable(nickname, "cores", serverinfo["cpuCores"]) inventory.set_variable(nickname, "up", serverinfo["status"] == "online") DOCUMENTATION = r''' name: sebastian.netcup.scp plugin_type: inventory short_description: Returns Ansible inventory from netcup SCP description: Returns Ansible inventory from netcup SCP version_added: 0.1.0 options: plugin: description: Name of the plugin required: true choices: ['scp', "sebastian.netcup.scp"] userid: description: userid for logging into SCP required: true password: description: - API password to authenticate againt the api. - This is different from you SCP password and must be set indipendently from the SCP password required: true '''