mirror of
https://github.com/norohind/nebula-ansible.git
synced 2025-06-05 04:03:01 +03:00
87 lines
2.8 KiB
Python
Executable File
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() |