|
|
|
|
@ -27,6 +27,11 @@ DOCUMENTATION = r"""
|
|
|
|
|
required: true
|
|
|
|
|
env:
|
|
|
|
|
- name: HETZNER_CLOUD_TOKEN
|
|
|
|
|
stage:
|
|
|
|
|
description: Filter servers by this stage.
|
|
|
|
|
required: true
|
|
|
|
|
env:
|
|
|
|
|
- name: HETZNER_STAGE
|
|
|
|
|
label_selector:
|
|
|
|
|
description: Filter servers by this label selector.
|
|
|
|
|
required: true
|
|
|
|
|
@ -47,7 +52,7 @@ class MyHcloudAPI:
|
|
|
|
|
|
|
|
|
|
BASE = "https://api.hetzner.cloud"
|
|
|
|
|
|
|
|
|
|
def __init__(self, token, label_selector):
|
|
|
|
|
def __init__(self, token, label_selector=None):
|
|
|
|
|
self.token = token
|
|
|
|
|
self.label_selector = label_selector
|
|
|
|
|
|
|
|
|
|
@ -61,7 +66,12 @@ class MyHcloudAPI:
|
|
|
|
|
page = 1
|
|
|
|
|
page_size = 20
|
|
|
|
|
while page > 0:
|
|
|
|
|
api_url = "{}/{}?label_selector={}&per_page={}&page={}".format(self.BASE, api_path, self.label_selector, str(page_size), str(page))
|
|
|
|
|
api_url = ""
|
|
|
|
|
if not self.label_selector:
|
|
|
|
|
api_url = "{}/{}?per_page={}&page={}".format(self.BASE, api_path, str(page_size), str(page))
|
|
|
|
|
else:
|
|
|
|
|
api_url = "{}/{}?label_selector={}&per_page={}&page={}".format(self.BASE, api_path, self.label_selector, str(page_size), str(page))
|
|
|
|
|
|
|
|
|
|
display.display(api_url)
|
|
|
|
|
|
|
|
|
|
response = open_url(
|
|
|
|
|
@ -86,6 +96,9 @@ class MyHcloudAPI:
|
|
|
|
|
def get_networks(self):
|
|
|
|
|
return self.get_values("v1/networks", "networks")
|
|
|
|
|
|
|
|
|
|
def get_loadbalancers(self):
|
|
|
|
|
return self.get_values("v1/load_balancers", "load_balancers")
|
|
|
|
|
|
|
|
|
|
class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
|
|
|
|
|
|
|
|
|
NAME = "netgo-hcloud"
|
|
|
|
|
@ -107,6 +120,12 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
|
|
|
|
).get_networks()
|
|
|
|
|
return networks
|
|
|
|
|
|
|
|
|
|
def _read_loadbalancers_from_API(self):
|
|
|
|
|
loadbalancers = MyHcloudAPI(
|
|
|
|
|
self.get_option("api_token")
|
|
|
|
|
).get_loadbalancers()
|
|
|
|
|
return loadbalancers
|
|
|
|
|
|
|
|
|
|
def parse(self, inventory, loader, path, cache=True):
|
|
|
|
|
super(InventoryModule, self).parse(inventory, loader, path, cache)
|
|
|
|
|
config = self._read_config_data(path)
|
|
|
|
|
@ -143,9 +162,11 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
|
|
|
|
|
|
|
|
|
networks = self._read_networks_from_API()
|
|
|
|
|
|
|
|
|
|
self.populate(servers, networks)
|
|
|
|
|
loadbalancers = self._read_loadbalancers_from_API()
|
|
|
|
|
|
|
|
|
|
def populate(self, servers, networks):
|
|
|
|
|
self.populate(servers, networks, loadbalancers)
|
|
|
|
|
|
|
|
|
|
def populate(self, servers, networks, loadbalancers):
|
|
|
|
|
display = Display()
|
|
|
|
|
|
|
|
|
|
# Add a default top group 'hcloud'
|
|
|
|
|
@ -153,6 +174,21 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
|
|
|
|
self.inventory.add_group(group="etcd")
|
|
|
|
|
self.inventory.add_group(group="k8s_cluster")
|
|
|
|
|
|
|
|
|
|
loadbalancerPublicIp = "-"
|
|
|
|
|
loadbalancerPrivateIp = "-"
|
|
|
|
|
|
|
|
|
|
# filter all loadbalancers by naming convention -> {{ stage }}-ingress
|
|
|
|
|
ingressLoadbalancers = [lb for lb in loadbalancers if lb["name"] == self.get_option("stage") + "-ingress"]
|
|
|
|
|
|
|
|
|
|
for loadbalancer in ingressLoadbalancers:
|
|
|
|
|
loadbalancerId = loadbalancer["id"]
|
|
|
|
|
loadbalancerName = loadbalancer["name"]
|
|
|
|
|
loadbalancerLabels = loadbalancer["labels"]
|
|
|
|
|
loadbalancerPublicIp = loadbalancer["public_net"]["ipv4"]["ip"]
|
|
|
|
|
loadbalancerPrivateIp = loadbalancer["private_net"][0]["ip"]
|
|
|
|
|
|
|
|
|
|
display.display("loadbalancer:<" + loadbalancerName + ">, publicIp=<" + loadbalancerPublicIp + ">, privateIp=<" + loadbalancerPrivateIp + ">")
|
|
|
|
|
|
|
|
|
|
for server in servers:
|
|
|
|
|
serverId = server["id"]
|
|
|
|
|
serverName = server["name"]
|
|
|
|
|
@ -170,7 +206,7 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
|
|
|
|
if networkId == privateNet["network"]:
|
|
|
|
|
serverPrivateIp = privateNet["ip"]
|
|
|
|
|
|
|
|
|
|
display.display("server:<" + serverName + ">, stage=<" + serverStage + ">, service=<" + serverService + ">, publicIp=<" + serverPublicIp + ">, privateIp=<" + serverPrivateIp + ">")
|
|
|
|
|
display.display("server:<" + serverName + ">, stage=<" + serverStage + ">, service=<" + serverService + ">, publicIp=<" + serverPublicIp + ">, privateIp=<" + serverPrivateIp + ">, publicIngressLBIp=<" + loadbalancerPublicIp + ">, privateIngressLBIp=<" + loadbalancerPrivateIp + ">")
|
|
|
|
|
|
|
|
|
|
self.inventory.add_group(group=serverService)
|
|
|
|
|
self.inventory.add_group(group="stage_" + serverStage)
|
|
|
|
|
@ -188,3 +224,5 @@ class InventoryModule(BaseInventoryPlugin, Constructable, Cacheable):
|
|
|
|
|
self.inventory.set_variable(serverName, 'stage_server_ip', serverPublicIp)
|
|
|
|
|
self.inventory.set_variable(serverName, 'ansible_ssh_host', serverPublicIp)
|
|
|
|
|
self.inventory.set_variable(serverName, 'stage_private_server_ip', serverPrivateIp)
|
|
|
|
|
self.inventory.set_variable(serverName, 'stage_ingress_loadbalancer_ip', loadbalancerPublicIp)
|
|
|
|
|
self.inventory.set_variable(serverName, 'stage_private_ingress_loadbalancer_ip', loadbalancerPrivateIp)
|
|
|
|
|
|