mirror of
https://github.com/FAUSheppy/athq-vm-management
synced 2025-12-06 05:41:35 +01:00
feat: icinga ansible dumper
This commit is contained in:
18
icinga.py
Normal file
18
icinga.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import jinja2
|
||||||
|
environment = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath="./templates"))
|
||||||
|
|
||||||
|
def createMasterHostConfig(vmList):
|
||||||
|
template = environment.get_template("icinga_host.conf.j2")
|
||||||
|
with open("build/icinga_master_hosts.conf", "w") as f:
|
||||||
|
for vmo in vmList:
|
||||||
|
|
||||||
|
if not vmo.check:
|
||||||
|
continue
|
||||||
|
|
||||||
|
checkDomains = filter(lambda x: not x.get("nocheck"), vmo.subdomains)
|
||||||
|
websites = [ (s["name"], s.get("url")) for s in checkDomains]
|
||||||
|
f.write(template.render(hostname=vmo.hostname, address=vmo.ip, websites=websites))
|
||||||
|
|
||||||
|
def createMasterServiceConfig(vmList):
|
||||||
|
pass
|
||||||
|
|
||||||
4
main.py
4
main.py
@@ -2,6 +2,7 @@ import json
|
|||||||
import vm
|
import vm
|
||||||
import sys
|
import sys
|
||||||
import jinja2
|
import jinja2
|
||||||
|
import icinga
|
||||||
|
|
||||||
ACME_CONTENT = '''
|
ACME_CONTENT = '''
|
||||||
location /.well-known/acme-challenge/ {
|
location /.well-known/acme-challenge/ {
|
||||||
@@ -74,3 +75,6 @@ if __name__ == "__main__":
|
|||||||
content = template.render(nginxJson)
|
content = template.render(nginxJson)
|
||||||
|
|
||||||
f.write(content)
|
f.write(content)
|
||||||
|
|
||||||
|
# dump icinga master
|
||||||
|
icinga.createMasterHostConfig(vmList)
|
||||||
|
|||||||
31
templates/icinga_host.conf.j2
Normal file
31
templates/icinga_host.conf.j2
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
object Host "{{ hostname }}" {
|
||||||
|
|
||||||
|
import "generic-host"
|
||||||
|
|
||||||
|
name = "{{ hostname }}"
|
||||||
|
address = "{{ address }}"
|
||||||
|
vars.remote = "true"
|
||||||
|
vars.linux = "true"
|
||||||
|
|
||||||
|
max_check_attempts = 7
|
||||||
|
retry_interval = 1m
|
||||||
|
|
||||||
|
vars.notification["mail"] = {
|
||||||
|
groups = ["icingaadmins"]
|
||||||
|
}
|
||||||
|
|
||||||
|
{% for website_name, url in websites %}
|
||||||
|
vars.http_vhosts["{{ website_name }}"] = {
|
||||||
|
{% if url %}
|
||||||
|
http_uri = "{{ url }}"
|
||||||
|
{% else %}
|
||||||
|
http_uri = "/"
|
||||||
|
{% endif %}
|
||||||
|
http_address = "https://{{ website_name }}"
|
||||||
|
http_ssl = true
|
||||||
|
http_onredirect = "follow"
|
||||||
|
}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
25
vm.py
25
vm.py
@@ -10,6 +10,7 @@ class VM:
|
|||||||
self.hostname = args.get("hostname")
|
self.hostname = args.get("hostname")
|
||||||
self.subdomains = args.get("subdomains")
|
self.subdomains = args.get("subdomains")
|
||||||
self.ports = args.get("ports")
|
self.ports = args.get("ports")
|
||||||
|
self.check = not args.get("nocheck")
|
||||||
self.terminateSSL = args.get("terminate-ssl")
|
self.terminateSSL = args.get("terminate-ssl")
|
||||||
self.network = args.get("network") or "default"
|
self.network = args.get("network") or "default"
|
||||||
self.isExternal = args.get("external")
|
self.isExternal = args.get("external")
|
||||||
@@ -95,25 +96,17 @@ class VM:
|
|||||||
# https components #
|
# https components #
|
||||||
components = []
|
components = []
|
||||||
template = self.environment.get_template("nginx_server_block.conf.j2")
|
template = self.environment.get_template("nginx_server_block.conf.j2")
|
||||||
targetport = 80
|
|
||||||
|
|
||||||
if all([type(e) == dict for e in self.subdomains]):
|
for subdomain in self.subdomains:
|
||||||
for subdomain in self.subdomains:
|
|
||||||
compositeName = "-".join((self.hostname, subdomain["name"].replace(".","-")))
|
|
||||||
targetport = subdomain["port"]
|
|
||||||
component = template.render(targetip=self.ip, targetport=targetport,
|
|
||||||
servernames=[subdomain["name"]], comment=compositeName,
|
|
||||||
proxy_pass_blob=self.proxy_pass_blob, acme=not self.noTerminateACME)
|
|
||||||
components.append(component)
|
|
||||||
|
|
||||||
elif any([type(e) == dict for e in self.subdomains]):
|
if type(subdomain) != dict:
|
||||||
raise ValueError("Mixed subdomains not allowed - must be all complex or all simple")
|
raise ValueError("Subdomain must be object containing 'name' ")
|
||||||
else:
|
|
||||||
compositeName = "-".join((self.hostname, self.subdomains[0].replace(".","-")))
|
compositeName = "-".join((self.hostname, subdomain["name"].replace(".","-")))
|
||||||
|
targetport = subdomain.get("port") or 80
|
||||||
component = template.render(targetip=self.ip, targetport=targetport,
|
component = template.render(targetip=self.ip, targetport=targetport,
|
||||||
servernames=self.subdomains, comment=compositeName,
|
servernames=[subdomain["name"]], comment=compositeName,
|
||||||
proxy_pass_blob=self.proxy_pass_blob, acme= not self.noTerminateACME)
|
proxy_pass_blob=self.proxy_pass_blob, acme=not self.noTerminateACME)
|
||||||
components.append(component)
|
components.append(component)
|
||||||
|
|
||||||
return components
|
return components
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user