From 2478e4013fc5b21bbf9b3d341a898ad52f765734 Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Thu, 15 May 2025 18:35:21 +0200 Subject: [PATCH] Refactored docker role include --- Makefile | 27 +++-- cli/generate_role_includes.py | 79 +++++++++++++ tasks/.gitignore | 1 + tasks/server.yml | 211 +--------------------------------- 4 files changed, 100 insertions(+), 218 deletions(-) create mode 100644 cli/generate_role_includes.py create mode 100644 tasks/.gitignore diff --git a/Makefile b/Makefile index 734eff31..0bbde034 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,26 @@ -ROLES_DIR=./roles -OUTPUT=./group_vars/all/11_applications.yml -SCRIPT=./cli/generate_defaults_applications.py +ROLES_DIR := ./roles +APPLICATIONS_OUT := ./group_vars/all/11_applications.yml +APPLICATIONS_SCRIPT := ./cli/generate_defaults_applications.py +INCLUDES_OUT := ./tasks/include-docker-roles.yml +INCLUDES_SCRIPT := ./cli/generate_role_includes.py + +.PHONY: build install test build: - @echo "๐Ÿ”ง Generating $(OUTPUT) from roles in $(ROLES_DIR)..." - @mkdir -p $(dir $(OUTPUT)) - python3 $(SCRIPT) --roles-dir $(ROLES_DIR) --output-file $(OUTPUT) - @echo "โœ… Output written to $(OUTPUT)" + @echo "๐Ÿ”ง Generating applications defaults โ†’ $(APPLICATIONS_OUT) from roles in $(ROLES_DIR)โ€ฆ" + @mkdir -p $(dir $(APPLICATIONS_OUT)) + python3 $(APPLICATIONS_SCRIPT) --roles-dir $(ROLES_DIR) --output-file $(APPLICATIONS_OUT) + @echo "โœ… Applications defaults written to $(APPLICATIONS_OUT)\n" + @echo "๐Ÿ”ง Generating Docker role includes โ†’ $(INCLUDES_OUT)โ€ฆ" + @mkdir -p $(dir $(INCLUDES_OUT)) + python3 $(INCLUDES_SCRIPT) $(ROLES_DIR) -o $(INCLUDES_OUT) -p docker- + @echo "โœ… Docker role includes written to $(INCLUDES_OUT)" install: build + @echo "โš™๏ธ Install complete." test: - @echo "Executing Unit Tests:" + @echo "\n๐Ÿงช Running Unit Tests..." python -m unittest discover -s tests/unit - @echo "Executing Integration Tests:" + @echo "\n๐Ÿ”ฌ Running Integration Tests..." python -m unittest discover -s tests/integration \ No newline at end of file diff --git a/cli/generate_role_includes.py b/cli/generate_role_includes.py new file mode 100644 index 00000000..3ae02dec --- /dev/null +++ b/cli/generate_role_includes.py @@ -0,0 +1,79 @@ +import os +import argparse +import yaml + +def find_roles(roles_dir, prefix=None): + """ + Yield absolute paths of role directories under roles_dir. + Only include roles whose directory name starts with prefix (if given) and contain vars/main.yml. + """ + for entry in os.listdir(roles_dir): + if prefix and not entry.startswith(prefix): + continue + path = os.path.join(roles_dir, entry) + vars_file = os.path.join(path, 'vars', 'main.yml') + if os.path.isdir(path) and os.path.isfile(vars_file): + yield path, vars_file + + +def load_application_id(vars_file): + """ + Load the vars/main.yml and return the value of application_id key. + Returns None if not found. + """ + with open(vars_file, 'r') as f: + data = yaml.safe_load(f) or {} + return data.get('application_id') + + +def generate_playbook_entries(roles_dir, prefix=None): + entries = [] + for role_path, vars_file in find_roles(roles_dir, prefix): + app_id = load_application_id(vars_file) + if not app_id: + continue + # Derive role name from directory name + role_name = os.path.basename(role_path) + # entry text + entry = ( + f"- name: setup {app_id}\n" + f" when: (\"{app_id}\" in group_names)\n" + f" include_role:\n" + f" name: {role_name}\n" + ) + entries.append(entry) + return entries + + +def main(): + parser = argparse.ArgumentParser( + description='Generate an Ansible playbook include file from Docker roles and application_ids.' + ) + parser.add_argument( + 'roles_dir', + help='Path to directory containing role folders' + ) + parser.add_argument( + '-p', '--prefix', + help='Only include roles whose names start with this prefix (e.g. docker-, client-)', + default=None + ) + parser.add_argument( + '-o', '--output', + help='Output file path (default: stdout)', + default=None + ) + args = parser.parse_args() + + entries = generate_playbook_entries(args.roles_dir, args.prefix) + output = ''.join(entries) + + if args.output: + with open(args.output, 'w') as f: + f.write(output) + print(f"Playbook entries written to {args.output}") + else: + print(output) + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/tasks/.gitignore b/tasks/.gitignore new file mode 100644 index 00000000..67ccfec4 --- /dev/null +++ b/tasks/.gitignore @@ -0,0 +1 @@ +include-docker-roles.yml \ No newline at end of file diff --git a/tasks/server.yml b/tasks/server.yml index 8e854f57..a864f5f9 100644 --- a/tasks/server.yml +++ b/tasks/server.yml @@ -11,215 +11,8 @@ - health-btrfs - system-btrfs-auto-balancer -######################################################################### -### Docker Roles ### -######################################################################### - -- name: "setup matomo" - when: ("matomo" in group_names) - include_role: - name: docker-matomo - -- name: setup ldap - when: ("ldap" in group_names) - include_role: - name: docker-ldap - -- name: setup keycloak - when: ("keycloak" in group_names) - include_role: - name: docker-keycloak - -- name: setup lam - when: ("lam" in group_names) - include_role: - name: docker-lam - -- name: setup phpldapadmin - when: ("phpldapadmin" in group_names) - include_role: - name: docker-phpldapadmin - -- name: setup nextcloud hosts - when: ("nextcloud" in group_names) - include_role: - name: docker-nextcloud - -- name: setup gitea hosts - when: ("gitea" in group_names) - include_role: - name: docker-gitea - vars: - run_mode: prod - -- name: setup wordpress hosts - when: ("wordpress" in group_names) - include_role: - name: docker-wordpress - -- name: setup mediawiki hosts - when: ("mediawiki" in group_names) - include_role: - name: docker-mediawiki - -- name: setup mybb hosts - when: ("mybb" in group_names) - include_role: - name: docker-mybb - vars: - mybb_domains: "{{domains.mybb}}" - -- name: setup yourls hosts - when: ("yourls" in group_names) - include_role: - name: docker-yourls - -- name: setup mailu hosts - when: ("mailu" in group_names) - include_role: - name: docker-mailu - -- name: setup elk hosts - when: ("elk" in group_names) - include_role: - name: docker-elk - -- name: setup mastodon hosts - when: ("mastodon" in group_names) - include_role: - name: docker-mastodon - -- name: setup pixelfed hosts - when: ("pixelfed" in group_names) - include_role: - name: docker-pixelfed - -- name: setup peertube hosts - when: ("peertube" in group_names) - include_role: - name: docker-peertube - -- name: setup bigbluebutton hosts - when: ("bigbluebutton" in group_names) - include_role: - name: docker-bigbluebutton - vars: - domain: "{{domains.bigbluebutton}}" - -- name: setup funkwhale hosts - when: ("funkwhale" in group_names) - include_role: - name: docker-funkwhale - -- name: setup roulette-wheel hosts - when: ("roulette-wheel" in group_names) - include_role: - name: docker-roulette-wheel - -- name: setup joomla hosts - when: ("joomla" in group_names) - include_role: - name: docker-joomla - -- name: setup attendize - when: ("attendize" in group_names) - include_role: - name: docker-attendize - -- name: setup baserow hosts - when: ("baserow" in group_names) - include_role: - name: docker-baserow - -- name: setup listmonk - when: ("listmonk" in group_names) - include_role: - name: docker-listmonk - -- name: setup discourse - when: ("discourse" in group_names) - include_role: - name: docker-discourse - -- name: setup matrix with flavor 'ansible' - include_role: - name: docker-matrix-ansible - when: applications.matrix.role == 'ansible' and ("matrix" in group_names) - -- name: setup matrix with flavor 'compose' - include_role: - name: docker-matrix - when: applications.matrix.role == 'compose' and ("matrix" in group_names) - -- name: setup open project instances - when: ("openproject" in group_names) - include_role: - name: docker-openproject - -- name: setup gitlab hosts - when: ("gitlab" in group_names) - include_role: - name: docker-gitlab - -- name: setup akaunting hosts - when: ("akaunting" in group_names) - include_role: - name: docker-akaunting - -- name: setup moodle instance - when: ("moodle" in group_names) - include_role: - name: docker-moodle - -- name: setup taiga instance - when: ("taiga" in group_names) - include_role: - name: docker-taiga - -- name: setup friendica hosts - when: ("friendica" in group_names) - include_role: - name: docker-friendica - -- name: setup portfolio - when: ("portfolio" in group_names) - include_role: - name: docker-portfolio - -- name: setup bluesky - when: ("bluesky" in group_names) - include_role: - name: docker-bluesky - -- name: setup PHPMyAdmin - when: ("phpmyadmin" in group_names) - include_role: - name: docker-phpmyadmin - -- name: setup SNIPE-IT - when: ("snipe_it" in group_names) - include_role: - name: docker-snipe_it - -- name: setup sphinx - when: ("sphinx" in group_names) - include_role: - name: docker-sphinx - -- name: setup pgadmin - when: ("pgadmin" in group_names) - include_role: - name: docker-pgadmin - -- name: setup presentation - when: ("presentation" in group_names) - include_role: - name: docker-presentation - -- name: setup espocrm hosts - when: ("espocrm" in group_names) - include_role: - name: docker-espocrm +- name: "Integrate Docker Role includes" + include_tasks: "include-docker-roles.yml" # Native Webserver Roles - name: setup nginx-serve-htmls