92 Zeilen
3.7 KiB
Python
92 Zeilen
3.7 KiB
Python
from xmlrpc.client import ServerProxy
|
|
|
|
from ansible.inventory.data import InventoryData
|
|
from ansible.parsing.dataloader import DataLoader
|
|
from ansible.plugins.inventory import BaseInventoryPlugin
|
|
from ansible.utils.display import Display
|
|
from zeep import Client, Settings
|
|
|
|
display = Display()
|
|
|
|
|
|
class InventoryModule(BaseInventoryPlugin):
|
|
NAME = "ansible.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 = dict()
|
|
for interface in serverinfo["serverInterfaces"]:
|
|
interfaces[interface["mac"]] = dict(
|
|
driver=interface["driver"],
|
|
id=interface["id"],
|
|
ipv4=interface["ipv4IP"],
|
|
ipv6=interface["ipv6IP"],
|
|
mac=interface["mac"],
|
|
)
|
|
if len(interface["ipv4IP"]) > 0:
|
|
ansible_host = interface["ipv4IP"][0]
|
|
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")
|
|
if self.config.get("nickname_is_hostname", False):
|
|
ansible_host = nickname
|
|
inventory.set_variable(nickname, "ansible_host", ansible_host)
|
|
|
|
|
|
DOCUMENTATION = """
|
|
name: ansible.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', "ansible.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
|
|
nickname_is_hostname:
|
|
version_added: 0.1.1
|
|
description: use the nickname as hostname
|
|
type: bool
|
|
required: false
|
|
default: false
|
|
"""
|