nebula-ansible/plugins/modules/generate_config.py

87 lines
2.8 KiB
Python
Executable File

#!/usr/bin/env python3
from ansible.module_utils.basic import AnsibleModule
from nebula_confgen import NetStack, Host, AuthorizedUser
from pathlib import Path
def main():
module_args = dict(
target_host=dict(type='str', required=True),
listen_port=dict(type='int', required=True),
hosts_info=dict(type='dict', required=True),
ca=dict(type='list', required=True),
authorized_users=dict(
type='list', # List of dictionaries
elements='dict', # Each item is a dictionary
required=False,
default=list(),
options=dict(
user=dict(type='str', required=True), # 'user' is a string
keys=dict(
type='list', # 'keys' is a list
elements='str', # List contains strings
required=True
)
)
),
default_inbound_rules=dict(
type='list',
elements='dict',
required=False,
default=list(),
)
)
result = dict(
changed=False,
config={}
)
module = AnsibleModule(
argument_spec=module_args,
supports_check_mode=False
)
try:
netstack = NetStack(
listen_port=module.params['listen_port'],
ca=[Path(i) for i in module.params['ca']],
authorized_users=tuple(AuthorizedUser(**d) for d in module.params['authorized_users']),
hosts=[],
default_inbound_rules=tuple(module.params['default_inbound_rules'])
)
target_host = None
for inventory_name, props in module.params['hosts_info'].items():
host = Host(
name=inventory_name,
am_relay=module.boolean(props.get('am_relay', False)),
am_lighthouse=module.boolean(props.get('am_lighthouse', False)),
public_addresses=(props['ansible_host'],),
addr=props['nebula_addr'],
subnet=props['nebula_subnet'],
inbound_rules=tuple(props.get('inbound_rules', tuple())),
merge_stack_inbound_rules=bool(props.get('merge_stack_inbound_rules', True))
)
if host.name == module.params['target_host']:
target_host = host
netstack.add_host(host)
if target_host is None:
module.fail_json(msg=f"Failed to find target host ({module.params['target_host']}) among hostvars ({ module.params['hosts_info'].keys()})")
result['config'] = netstack.get_config(target_host)
result['msg'] = "Config generated successfully"
module.exit_json(**result)
except Exception as e:
module.fail_json(msg="Something went wrong", exception=e)
if __name__ == '__main__':
main()