2022-06-12 22:36:35 +02:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
|
|
Create a dynamic inventory for this ansible playbook
|
|
|
|
"""
|
|
|
|
import socket
|
|
|
|
import sys
|
2022-06-18 13:16:59 +02:00
|
|
|
import json
|
2022-06-12 22:36:35 +02:00
|
|
|
|
2024-07-27 19:34:54 +02:00
|
|
|
INIT_HOST=False
|
|
|
|
|
2022-06-12 22:36:35 +02:00
|
|
|
# create a dict to match hostnames to enviroments
|
|
|
|
env_dict = {
|
|
|
|
'work':
|
2024-08-29 16:32:04 +02:00
|
|
|
['macbook.local'],
|
2022-06-12 22:36:35 +02:00
|
|
|
'private':
|
2023-08-01 22:00:37 +02:00
|
|
|
['derpy.local', 'applejack.local', 'rarity.local', 'discord.local']
|
2022-06-12 22:36:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
def fqdn():
|
|
|
|
"""
|
|
|
|
return fully qualified domain name
|
|
|
|
"""
|
2022-07-06 18:13:26 +02:00
|
|
|
hostname = socket.gethostname()
|
|
|
|
if '.' not in hostname:
|
|
|
|
hostname = f"{hostname}.local"
|
|
|
|
return str(hostname)
|
2022-06-12 22:36:35 +02:00
|
|
|
|
2023-04-21 23:34:20 +02:00
|
|
|
def become_pass(host, group):
|
2023-04-13 23:10:00 +02:00
|
|
|
"""
|
|
|
|
return variable for become password using gopass lookup
|
|
|
|
"""
|
2023-04-21 23:34:20 +02:00
|
|
|
if group == 'work':
|
|
|
|
gopasslookupprefix = 'private/ansible/hosts/'
|
|
|
|
else:
|
|
|
|
gopasslookupprefix = 'ansible/hosts/'
|
|
|
|
passstring = str("\"ansible_become_pass\": \"{{ lookup('community.general.passwordstore', '"
|
|
|
|
+ gopasslookupprefix + host + "/users/root') }}\"")
|
2023-04-13 23:19:42 +02:00
|
|
|
return passstring
|
2023-04-13 23:10:00 +02:00
|
|
|
|
2022-06-12 22:36:35 +02:00
|
|
|
def env(domain):
|
|
|
|
"""
|
|
|
|
map a hostname to a space
|
2022-06-18 13:45:34 +02:00
|
|
|
or print empty list if no one matched and exit
|
2022-06-12 22:36:35 +02:00
|
|
|
"""
|
|
|
|
for key, values in env_dict.items():
|
|
|
|
if domain in values:
|
|
|
|
return key
|
2024-07-27 19:34:54 +02:00
|
|
|
if INIT_HOST:
|
|
|
|
return str('init')
|
2022-06-26 02:31:29 +02:00
|
|
|
print(json.dumps(empty_host_list(domain), sort_keys=True, indent=2))
|
2022-06-18 13:16:59 +02:00
|
|
|
sys.exit()
|
2022-06-12 22:36:35 +02:00
|
|
|
|
2022-06-26 02:31:29 +02:00
|
|
|
def empty_host_list(domain):
|
2022-06-18 13:16:59 +02:00
|
|
|
"""
|
|
|
|
return empty host list
|
|
|
|
"""
|
2022-06-26 02:31:29 +02:00
|
|
|
comment = f"No valid host found. Found '{domain}'. Return empty host list!"
|
2022-06-18 13:16:59 +02:00
|
|
|
return json.loads('{"_meta": {"comment": "' + comment +
|
|
|
|
'", "hostvars": {}}, "instances": {"hosts": []}}')
|
2022-06-12 22:36:35 +02:00
|
|
|
|
2023-04-21 23:34:20 +02:00
|
|
|
def hostvars(host, group):
|
2022-07-16 00:36:15 +02:00
|
|
|
"""
|
|
|
|
set variables to local connection
|
|
|
|
"""
|
2024-07-27 19:34:54 +02:00
|
|
|
local = str('"' + host + '": {"ansible_connection": "local"')
|
|
|
|
if not INIT_HOST:
|
|
|
|
local += str(', ' + str(become_pass(host, group)))
|
|
|
|
local += str('}')
|
2022-07-16 00:36:15 +02:00
|
|
|
return local
|
|
|
|
|
2022-06-18 13:45:34 +02:00
|
|
|
def formated_host_group_list(host, group):
|
|
|
|
"""
|
|
|
|
build inventory and return it
|
|
|
|
"""
|
|
|
|
# pylint: disable=line-too-long
|
2023-04-21 23:34:20 +02:00
|
|
|
return json.loads('{"_meta": {"hostvars": {' + str(hostvars(host, group)) + '}},"' + str(group) + '": {"hosts": ["' + str(host) + '"]},"instances": {"children": ["' + str(group) + '"]}}')
|
2022-06-18 13:45:34 +02:00
|
|
|
|
2022-06-12 22:36:35 +02:00
|
|
|
def main():
|
|
|
|
"""
|
|
|
|
main funktion
|
|
|
|
will analyse on which host this script is started
|
|
|
|
and will print the dynamic inventory to tell ansible
|
|
|
|
which host_vars and group_vars should be used
|
|
|
|
"""
|
|
|
|
host = fqdn()
|
|
|
|
group = env(host)
|
2022-06-18 13:45:34 +02:00
|
|
|
print(json.dumps(formated_host_group_list(host, group), sort_keys=True, indent=2))
|
|
|
|
|
2022-06-12 22:36:35 +02:00
|
|
|
main()
|