mirror of
				https://github.com/kevinveenbirkenbach/computer-playbook.git
				synced 2025-11-04 04:08:15 +00:00 
			
		
		
		
	Refactored docker role include
This commit is contained in:
		
							
								
								
									
										27
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								Makefile
									
									
									
									
									
								
							@@ -1,17 +1,26 @@
 | 
				
			|||||||
ROLES_DIR=./roles
 | 
					ROLES_DIR         	:= ./roles
 | 
				
			||||||
OUTPUT=./group_vars/all/11_applications.yml
 | 
					APPLICATIONS_OUT  	:= ./group_vars/all/11_applications.yml
 | 
				
			||||||
SCRIPT=./cli/generate_defaults_applications.py
 | 
					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:
 | 
					build:
 | 
				
			||||||
	@echo "🔧 Generating $(OUTPUT) from roles in $(ROLES_DIR)..."
 | 
						@echo "🔧 Generating applications defaults → $(APPLICATIONS_OUT) from roles in $(ROLES_DIR)…"
 | 
				
			||||||
	@mkdir -p $(dir $(OUTPUT))
 | 
						@mkdir -p $(dir $(APPLICATIONS_OUT))
 | 
				
			||||||
	python3 $(SCRIPT) --roles-dir $(ROLES_DIR) --output-file $(OUTPUT)
 | 
						python3 $(APPLICATIONS_SCRIPT) --roles-dir $(ROLES_DIR) --output-file $(APPLICATIONS_OUT)
 | 
				
			||||||
	@echo "✅ Output written to $(OUTPUT)"
 | 
						@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
 | 
					install: build
 | 
				
			||||||
 | 
						@echo "⚙️  Install complete."
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test:
 | 
					test:
 | 
				
			||||||
	@echo "Executing Unit Tests:"
 | 
						@echo "\n🧪 Running Unit Tests..."
 | 
				
			||||||
	python -m unittest discover -s tests/unit
 | 
						python -m unittest discover -s tests/unit
 | 
				
			||||||
	@echo "Executing Integration Tests:"
 | 
						@echo "\n🔬 Running Integration Tests..."
 | 
				
			||||||
	python -m unittest discover -s tests/integration
 | 
						python -m unittest discover -s tests/integration
 | 
				
			||||||
							
								
								
									
										79
									
								
								cli/generate_role_includes.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								cli/generate_role_includes.py
									
									
									
									
									
										Normal file
									
								
							@@ -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()
 | 
				
			||||||
							
								
								
									
										1
									
								
								tasks/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tasks/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					include-docker-roles.yml
 | 
				
			||||||
							
								
								
									
										211
									
								
								tasks/server.yml
									
									
									
									
									
								
							
							
						
						
									
										211
									
								
								tasks/server.yml
									
									
									
									
									
								
							@@ -11,215 +11,8 @@
 | 
				
			|||||||
    - health-btrfs
 | 
					    - health-btrfs
 | 
				
			||||||
    - system-btrfs-auto-balancer
 | 
					    - system-btrfs-auto-balancer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#########################################################################
 | 
					- name: "Integrate Docker Role includes"
 | 
				
			||||||
### Docker Roles                                                      ###
 | 
					  include_tasks: "include-docker-roles.yml"
 | 
				
			||||||
#########################################################################
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- 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
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Native Webserver Roles
 | 
					# Native Webserver Roles
 | 
				
			||||||
- name: setup nginx-serve-htmls
 | 
					- name: setup nginx-serve-htmls
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user