mirror of
				https://github.com/kevinveenbirkenbach/computer-playbook.git
				synced 2025-11-04 12:18:17 +00:00 
			
		
		
		
	Finished new role identification system implementation
This commit is contained in:
		@@ -80,7 +80,7 @@ def main():
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
    parser.add_argument(
 | 
					    parser.add_argument(
 | 
				
			||||||
        "--host-type",
 | 
					        "--host-type",
 | 
				
			||||||
        choices=["server", "personal-computer"],
 | 
					        choices=["server", "desktop"],
 | 
				
			||||||
        default="server",
 | 
					        default="server",
 | 
				
			||||||
        help="Specify whether the target is a server or a personal computer. Affects role selection and variables."
 | 
					        help="Specify whether the target is a server or a personal computer. Affects role selection and variables."
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,7 +10,7 @@ from pathlib import Path
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Directory containing roles; can be overridden by tests
 | 
					# Directory containing roles; can be overridden by tests
 | 
				
			||||||
MODULE_DIR = Path(__file__).resolve().parent
 | 
					MODULE_DIR = Path(__file__).resolve().parent
 | 
				
			||||||
ROLES_DIR = (MODULE_DIR.parent / "roles").resolve()
 | 
					ROLES_DIR = (MODULE_DIR.parent.parent / "roles").resolve()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def process_role(role_dir: Path, prefix: str, preview: bool, overwrite: bool):
 | 
					def process_role(role_dir: Path, prefix: str, preview: bool, overwrite: bool):
 | 
				
			||||||
    name = role_dir.name
 | 
					    name = role_dir.name
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,7 @@ system_maintenance_cleanup_services:
 | 
				
			|||||||
system_maintenance_manipulation_services:
 | 
					system_maintenance_manipulation_services:
 | 
				
			||||||
  - "maint-docker-heal"
 | 
					  - "maint-docker-heal"
 | 
				
			||||||
  - "update-docker"
 | 
					  - "update-docker"
 | 
				
			||||||
  - "maint-docker-storage-optimizer"
 | 
					  - "cln-docker-storage-optimizer"
 | 
				
			||||||
  - "maint-docker-restart"
 | 
					  - "maint-docker-restart"
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
## Total System Maintenance Services
 | 
					## Total System Maintenance Services
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,9 @@
 | 
				
			|||||||
  hosts: all
 | 
					  hosts: all
 | 
				
			||||||
  tasks:
 | 
					  tasks:
 | 
				
			||||||
  - name: "Load 'constructor' tasks"
 | 
					  - name: "Load 'constructor' tasks"
 | 
				
			||||||
    include_tasks: "tasks/plays/01_constructor.yml"
 | 
					    include_tasks: "tasks/stages/01_constructor.yml"
 | 
				
			||||||
  - name: "Load '{{host_type}}' tasks"
 | 
					  - name: "Load '{{host_type}}' tasks"
 | 
				
			||||||
    include_tasks: "tasks/plays/02_{{host_type}}.yml"
 | 
					    include_tasks: "tasks/stages/02_{{host_type}}.yml"
 | 
				
			||||||
  - name: "Load 'destructor' tasks"
 | 
					  - name: "Load 'destructor' tasks"
 | 
				
			||||||
    include_tasks: "tasks/plays/03_destructor.yml"
 | 
					    include_tasks: "tasks/stages/03_destructor.yml"
 | 
				
			||||||
  become: true
 | 
					  become: true
 | 
				
			||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
backup_to_usb_script_path:    "/usr/local/sbin/bkp-data-to-usb.python"
 | 
					backup_to_usb_script_path: /usr/local/sbin/bkp-data-to-usb.python
 | 
				
			||||||
backup_to_usb_destination:    "{{backup_to_usb_mount}}{{backup_to_usb_destination_subdirectory}}"
 | 
					backup_to_usb_destination: '{{backup_to_usb_mount}}{{backup_to_usb_destination_subdirectory}}'
 | 
				
			||||||
backups_folder_path:          "{{backup_to_usb_destination}}"
 | 
					backups_folder_path: '{{backup_to_usb_destination}}'
 | 
				
			||||||
systemctl_mount_service_name: "{{ backup_to_usb_mount | trim('/') | replace('/', '-') }}.mount"
 | 
					systemctl_mount_service_name: '{{ backup_to_usb_mount | trim(''/'') | replace(''/'',
 | 
				
			||||||
 | 
					  ''-'') }}.mount'
 | 
				
			||||||
 | 
					application_id: data-to-usb
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1,2 @@
 | 
				
			|||||||
backup_directory_validator_folder: "{{path_administrator_scripts}}directory-validator/"
 | 
					backup_directory_validator_folder: '{{path_administrator_scripts}}directory-validator/'
 | 
				
			||||||
 | 
					application_id: directory-validator
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1,2 @@
 | 
				
			|||||||
bkp_docker_to_local_pkg: backup-docker-to-local
 | 
					bkp_docker_to_local_pkg: backup-docker-to-local
 | 
				
			||||||
 | 
					application_id: docker-to-local
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,2 +1,3 @@
 | 
				
			|||||||
authorized_keys_path: "{{ inventory_dir }}/files/{{ inventory_hostname }}/home/backup/.ssh/authorized_keys"
 | 
					authorized_keys_path: '{{ inventory_dir }}/files/{{ inventory_hostname }}/home/backup/.ssh/authorized_keys'
 | 
				
			||||||
authorized_keys_list: "{{ lookup('file', authorized_keys_path).splitlines() }}"
 | 
					authorized_keys_list: '{{ lookup(''file'', authorized_keys_path).splitlines() }}'
 | 
				
			||||||
 | 
					application_id: provider-user
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								roles/bkp-provider/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								roles/bkp-provider/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					application_id: provider
 | 
				
			||||||
@@ -1 +1,2 @@
 | 
				
			|||||||
docker_backup_remote_to_local_folder: "{{path_administrator_scripts}}bkp-remote-to-local/"
 | 
					docker_backup_remote_to_local_folder: '{{path_administrator_scripts}}bkp-remote-to-local/'
 | 
				
			||||||
 | 
					application_id: remote-to-local
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,7 +92,7 @@ roles:
 | 
				
			|||||||
    title: "Backup & Restore"
 | 
					    title: "Backup & Restore"
 | 
				
			||||||
    description: "Backup strategies & restore procedures"
 | 
					    description: "Backup strategies & restore procedures"
 | 
				
			||||||
    icon: "fas fa-hdd"
 | 
					    icon: "fas fa-hdd"
 | 
				
			||||||
    invokable: false
 | 
					    invokable: true
 | 
				
			||||||
  update:
 | 
					  update:
 | 
				
			||||||
    title: "Updates & Package Management"
 | 
					    title: "Updates & Package Management"
 | 
				
			||||||
    description: "OS & package updates"
 | 
					    description: "OS & package updates"
 | 
				
			||||||
@@ -103,3 +103,8 @@ roles:
 | 
				
			|||||||
    description: "User accounts & access control"
 | 
					    description: "User accounts & access control"
 | 
				
			||||||
    icon: "fas fa-users"
 | 
					    icon: "fas fa-users"
 | 
				
			||||||
    invokable: false
 | 
					    invokable: false
 | 
				
			||||||
 | 
					  cln:
 | 
				
			||||||
 | 
					    title: "Cleanup"
 | 
				
			||||||
 | 
					    description: "Roles for cleaning up various system resources—old backups, unused certificates, temporary files, Docker volumes, disk caches, deprecated domains, and more."
 | 
				
			||||||
 | 
					    icon: "fas fa-trash-alt"
 | 
				
			||||||
 | 
					    invokable: true
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1,2 @@
 | 
				
			|||||||
cleanup_backups_directory: "{{path_administrator_scripts}}cln-backups/"
 | 
					cleanup_backups_directory: '{{path_administrator_scripts}}cln-backups/'
 | 
				
			||||||
 | 
					application_id: backups-service
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								roles/cln-backups-timer/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								roles/cln-backups-timer/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					application_id: backups-timer
 | 
				
			||||||
							
								
								
									
										1
									
								
								roles/cln-certs/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								roles/cln-certs/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					application_id: certs
 | 
				
			||||||
@@ -1 +1,2 @@
 | 
				
			|||||||
cleanup_disc_space_folder: "{{path_administrator_scripts}}cln-disc-space/"
 | 
					cleanup_disc_space_folder: '{{path_administrator_scripts}}cln-disc-space/'
 | 
				
			||||||
 | 
					application_id: disc-space
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								roles/cln-docker-anonymous-volumes/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								roles/cln-docker-anonymous-volumes/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					application_id: docker-anonymous-volumes
 | 
				
			||||||
							
								
								
									
										5
									
								
								roles/cln-docker-storage-optimizer/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								roles/cln-docker-storage-optimizer/handlers/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
				
			|||||||
 | 
					- name: "reload cln-docker-storage-optimizer.cymais.service"
 | 
				
			||||||
 | 
					  systemd:
 | 
				
			||||||
 | 
					    name: cln-docker-storage-optimizer.cymais.service
 | 
				
			||||||
 | 
					    state: reloaded
 | 
				
			||||||
 | 
					    daemon_reload: yes
 | 
				
			||||||
							
								
								
									
										22
									
								
								roles/cln-docker-storage-optimizer/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								roles/cln-docker-storage-optimizer/tasks/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					- name: "create {{storage_optimizer_directory}}"
 | 
				
			||||||
 | 
					  file:
 | 
				
			||||||
 | 
					    path: "{{storage_optimizer_directory}}"
 | 
				
			||||||
 | 
					    state: directory
 | 
				
			||||||
 | 
					    mode: 0755
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- name: create cln-docker-storage-optimizer.cymais.service
 | 
				
			||||||
 | 
					  template: 
 | 
				
			||||||
 | 
					    src: cln-docker-storage-optimizer.service.j2
 | 
				
			||||||
 | 
					    dest: /etc/systemd/system/cln-docker-storage-optimizer.cymais.service
 | 
				
			||||||
 | 
					  notify: reload cln-docker-storage-optimizer.cymais.service
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- name: create cln-docker-storage-optimizer.py
 | 
				
			||||||
 | 
					  copy: 
 | 
				
			||||||
 | 
					    src: cln-docker-storage-optimizer.py
 | 
				
			||||||
 | 
					    dest: "{{storage_optimizer_script}}"
 | 
				
			||||||
 | 
					    mode: 0755
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- name: "optimize storage performance"
 | 
				
			||||||
 | 
					  systemd:
 | 
				
			||||||
 | 
					    name: cln-docker-storage-optimizer.cymais.service
 | 
				
			||||||
 | 
					    state: started
 | 
				
			||||||
@@ -4,5 +4,5 @@ OnFailure=alert-compose.cymais@%n.service
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[Service]
 | 
					[Service]
 | 
				
			||||||
Type=oneshot
 | 
					Type=oneshot
 | 
				
			||||||
ExecStartPre=/bin/sh -c '/usr/bin/python {{ path_system_lock_script }} {{ system_maintenance_services | join(' ')  }} --ignore maint-docker-storage-optimizer bkp-remote-to-local --timeout "{{system_maintenance_lock_timeout_storage_optimizer}}"'
 | 
					ExecStartPre=/bin/sh -c '/usr/bin/python {{ path_system_lock_script }} {{ system_maintenance_services | join(' ')  }} --ignore cln-docker-storage-optimizer bkp-remote-to-local --timeout "{{system_maintenance_lock_timeout_storage_optimizer}}"'
 | 
				
			||||||
ExecStart=/bin/sh -c '/usr/bin/python {{storage_optimizer_script}} --rapid-storage-path {{path_rapid_storage}} --mass-storage-path {{path_mass_storage}}'
 | 
					ExecStart=/bin/sh -c '/usr/bin/python {{storage_optimizer_script}} --rapid-storage-path {{path_rapid_storage}} --mass-storage-path {{path_mass_storage}}'
 | 
				
			||||||
							
								
								
									
										3
									
								
								roles/cln-docker-storage-optimizer/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								roles/cln-docker-storage-optimizer/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					storage_optimizer_directory: '{{path_administrator_scripts}}cln-docker-storage-optimizer/'
 | 
				
			||||||
 | 
					storage_optimizer_script: '{{storage_optimizer_directory}}cln-docker-storage-optimizer.py'
 | 
				
			||||||
 | 
					application_id: docker-storage-optimizer
 | 
				
			||||||
							
								
								
									
										1
									
								
								roles/cln-domains/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								roles/cln-domains/vars/main.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					application_id: domains
 | 
				
			||||||
@@ -1 +1,2 @@
 | 
				
			|||||||
cln_failed_docker_backups_pkg: cleanup-failed-docker-backups
 | 
					cln_failed_docker_backups_pkg: cleanup-failed-docker-backups
 | 
				
			||||||
 | 
					application_id: failed-docker-backups
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1 @@
 | 
				
			|||||||
application_id: docker
 | 
					application_id: desk-docker
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,4 +17,4 @@ galaxy_info:
 | 
				
			|||||||
    - git
 | 
					    - git
 | 
				
			||||||
    - configuration
 | 
					    - configuration
 | 
				
			||||||
    - pacman
 | 
					    - pacman
 | 
				
			||||||
    - personal-computer
 | 
					    - desktop
 | 
				
			||||||
@@ -16,7 +16,7 @@
 | 
				
			|||||||
    group: administrator
 | 
					    group: administrator
 | 
				
			||||||
  when: run_once_docker is not defined
 | 
					  when: run_once_docker is not defined
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- name: Set docker_enabled to true, to activate maint-docker-storage-optimizer 
 | 
					- name: Set docker_enabled to true, to activate cln-docker-storage-optimizer 
 | 
				
			||||||
  set_fact:
 | 
					  set_fact:
 | 
				
			||||||
    docker_enabled: true
 | 
					    docker_enabled: true
 | 
				
			||||||
  when: run_once_docker is not defined
 | 
					  when: run_once_docker is not defined
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
- name: "reload maint-docker-storage-optimizer.cymais.service"
 | 
					 | 
				
			||||||
  systemd:
 | 
					 | 
				
			||||||
    name: maint-docker-storage-optimizer.cymais.service
 | 
					 | 
				
			||||||
    state: reloaded
 | 
					 | 
				
			||||||
    daemon_reload: yes
 | 
					 | 
				
			||||||
@@ -1,22 +0,0 @@
 | 
				
			|||||||
- name: "create {{storage_optimizer_directory}}"
 | 
					 | 
				
			||||||
  file:
 | 
					 | 
				
			||||||
    path: "{{storage_optimizer_directory}}"
 | 
					 | 
				
			||||||
    state: directory
 | 
					 | 
				
			||||||
    mode: 0755
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: create maint-docker-storage-optimizer.cymais.service
 | 
					 | 
				
			||||||
  template: 
 | 
					 | 
				
			||||||
    src: maint-docker-storage-optimizer.service.j2
 | 
					 | 
				
			||||||
    dest: /etc/systemd/system/maint-docker-storage-optimizer.cymais.service
 | 
					 | 
				
			||||||
  notify: reload maint-docker-storage-optimizer.cymais.service
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: create maint-docker-storage-optimizer.py
 | 
					 | 
				
			||||||
  copy: 
 | 
					 | 
				
			||||||
    src: maint-docker-storage-optimizer.py
 | 
					 | 
				
			||||||
    dest: "{{storage_optimizer_script}}"
 | 
					 | 
				
			||||||
    mode: 0755
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: "optimize storage performance"
 | 
					 | 
				
			||||||
  systemd:
 | 
					 | 
				
			||||||
    name: maint-docker-storage-optimizer.cymais.service
 | 
					 | 
				
			||||||
    state: started
 | 
					 | 
				
			||||||
@@ -1,3 +0,0 @@
 | 
				
			|||||||
storage_optimizer_directory: '{{path_administrator_scripts}}maint-docker-storage-optimizer/'
 | 
					 | 
				
			||||||
storage_optimizer_script: '{{storage_optimizer_directory}}maint-docker-storage-optimizer.py'
 | 
					 | 
				
			||||||
application_id: docker-storage-optimizer
 | 
					 | 
				
			||||||
@@ -1,91 +0,0 @@
 | 
				
			|||||||
---
 | 
					 | 
				
			||||||
## pc applications
 | 
					 | 
				
			||||||
- name: "setup docker role includes for desktop pc"
 | 
					 | 
				
			||||||
  include_tasks: "./tasks/groups/{{ item }}-roles.yml"
 | 
					 | 
				
			||||||
  loop:
 | 
					 | 
				
			||||||
    - util-desk
 | 
					 | 
				
			||||||
    - desk
 | 
					 | 
				
			||||||
  loop_control:
 | 
					 | 
				
			||||||
    label: "{{ item }}-roles.yml"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: general host setup
 | 
					 | 
				
			||||||
  when: ("personal_computers" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: "{{ item }}"
 | 
					 | 
				
			||||||
  loop:
 | 
					 | 
				
			||||||
    - util-gen-admin
 | 
					 | 
				
			||||||
    - drv-non-free
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: util-desk-office-tools
 | 
					 | 
				
			||||||
  when: ("collection_officetools" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: "{{ item }}"
 | 
					 | 
				
			||||||
  loop:
 | 
					 | 
				
			||||||
    - util-desk-office-tools
 | 
					 | 
				
			||||||
    - desk-jrnl
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: personal computer for business
 | 
					 | 
				
			||||||
  when: ("business_personal_computer" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-gnucash
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: util-desk-design
 | 
					 | 
				
			||||||
  when: ("collection_designer" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: util-desk-design
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: desk-qbittorrent
 | 
					 | 
				
			||||||
  when: ("collection_torrent" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-qbittorrent
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: desk-obs
 | 
					 | 
				
			||||||
  when: ("collection_streamer" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-obs
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: desk-bluray-player
 | 
					 | 
				
			||||||
  when: ("collection_bluray_player" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-bluray-player
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: GNOME setup
 | 
					 | 
				
			||||||
  when: ("gnome" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-gnome
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup ssh client
 | 
					 | 
				
			||||||
  when: ("ssh-client" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-ssh
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup gaming hosts
 | 
					 | 
				
			||||||
  when: ("gaming" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: util-desk-game-compose
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup entertainment hosts
 | 
					 | 
				
			||||||
  when: ("entertainment" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-spotify
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup torbrowser hosts
 | 
					 | 
				
			||||||
  when: ("torbrowser" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-torbrowser
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup nextcloud-client
 | 
					 | 
				
			||||||
  when: ("nextcloud_client" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-nextcloud-client
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup docker
 | 
					 | 
				
			||||||
  when: ("docker_client" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: desk-docker
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# driver 
 | 
					 | 
				
			||||||
- name: setup msi rgb keyboard
 | 
					 | 
				
			||||||
  when: ("msi_perkeyrgb" in group_names)
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: drv-msi-keyboard-color
 | 
					 | 
				
			||||||
@@ -1,15 +0,0 @@
 | 
				
			|||||||
- name: optimize storage performance
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: maint-docker-storage-optimizer
 | 
					 | 
				
			||||||
  when: ('storage-optimizer' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
- name: Cleanup Docker Anonymous Volumes
 | 
					 | 
				
			||||||
  import_role:
 | 
					 | 
				
			||||||
    name: cln-docker-anonymous-volumes
 | 
					 | 
				
			||||||
  when: mode_cleanup | bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: Show all facts
 | 
					 | 
				
			||||||
  debug:
 | 
					 | 
				
			||||||
    var: ansible_facts
 | 
					 | 
				
			||||||
  when: enable_debug | bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@@ -101,7 +101,7 @@
 | 
				
			|||||||
    name: update
 | 
					    name: update
 | 
				
			||||||
  when: mode_update | bool
 | 
					  when: mode_update | bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- name: "Integrate Docker Role includes"
 | 
					- name: "Load base roles"
 | 
				
			||||||
  include_tasks: "./tasks/groups/{{ item }}-roles.yml"
 | 
					  include_tasks: "./tasks/groups/{{ item }}-roles.yml"
 | 
				
			||||||
  loop:
 | 
					  loop:
 | 
				
			||||||
    - core
 | 
					    - core
 | 
				
			||||||
@@ -111,55 +111,8 @@
 | 
				
			|||||||
    - alert
 | 
					    - alert
 | 
				
			||||||
    - mon
 | 
					    - mon
 | 
				
			||||||
    - maint
 | 
					    - maint
 | 
				
			||||||
 | 
					    - update
 | 
				
			||||||
 | 
					    - bkp
 | 
				
			||||||
 | 
					    - cln
 | 
				
			||||||
  loop_control:
 | 
					  loop_control:
 | 
				
			||||||
    label: "{{ item }}-roles.yml"
 | 
					    label: "{{ item }}-roles.yml"
 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup standard wireguard
 | 
					 | 
				
			||||||
  when: ('wireguard_server' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: net-wireguard-core
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# vpn setup
 | 
					 | 
				
			||||||
- name: setup wireguard client behind firewall\nat
 | 
					 | 
				
			||||||
  when: ('wireguard_behind_firewall' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: net-wireguard-firewalled
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup wireguard client
 | 
					 | 
				
			||||||
  when: ('wireguard_client' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: net-wireguard-plain
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## backup setup
 | 
					 | 
				
			||||||
- name: setup replica backup hosts
 | 
					 | 
				
			||||||
  when: ('backup_remote_to_local' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: bkp-remote-to-local
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup backup to swappable
 | 
					 | 
				
			||||||
  when: ('backup_to_usb' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: bkp-data-to-usb
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## driver setup
 | 
					 | 
				
			||||||
- name: drv-intel
 | 
					 | 
				
			||||||
  when: ('intel' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: drv-intel
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup multiprinter hosts
 | 
					 | 
				
			||||||
  when: ('epson_multiprinter' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: drv-epson-multiprinter
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
- name: setup hibernate lid switch
 | 
					 | 
				
			||||||
  when: ('drv-lid-switch' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: drv-lid-switch
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## system setup 
 | 
					 | 
				
			||||||
- name: setup swapfile hosts
 | 
					 | 
				
			||||||
  when: ('swapfile' | application_allowed(group_names, allowed_applications))
 | 
					 | 
				
			||||||
  include_role:
 | 
					 | 
				
			||||||
    name: maint-swapfile
 | 
					 | 
				
			||||||
							
								
								
									
										16
									
								
								tasks/stages/02_personal-computer.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								tasks/stages/02_personal-computer.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					- name: "setup docker role includes for desktop pc"
 | 
				
			||||||
 | 
					  include_tasks: "./tasks/groups/{{ item }}-roles.yml"
 | 
				
			||||||
 | 
					  loop:
 | 
				
			||||||
 | 
					    - util-srv  # Services need to run before applications
 | 
				
			||||||
 | 
					    - util-desk
 | 
				
			||||||
 | 
					  loop_control:
 | 
				
			||||||
 | 
					    label: "{{ item }}-roles.yml"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- name: general host setup
 | 
				
			||||||
 | 
					  when: ("personal_computers" in group_names)
 | 
				
			||||||
 | 
					  include_role:
 | 
				
			||||||
 | 
					    name: "{{ item }}"
 | 
				
			||||||
 | 
					  loop:
 | 
				
			||||||
 | 
					    - util-gen-admin
 | 
				
			||||||
 | 
					    - drv-non-free
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
- name: servers host setup
 | 
					- name: Setup server base
 | 
				
			||||||
  when: ("servers" in group_names)
 | 
					  when: ("servers" in group_names)
 | 
				
			||||||
  include_role:
 | 
					  include_role:
 | 
				
			||||||
    name: "{{ item }}"
 | 
					    name: "{{ item }}"
 | 
				
			||||||
@@ -11,10 +11,10 @@
 | 
				
			|||||||
    - mon-bot-btrfs
 | 
					    - mon-bot-btrfs
 | 
				
			||||||
    - maint-btrfs-auto-balancer
 | 
					    - maint-btrfs-auto-balancer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- name: "Integrate Docker Server Roles"
 | 
					- name: "Include server roles"
 | 
				
			||||||
  include_tasks: "./tasks/groups/{{ item }}-roles.yml"
 | 
					  include_tasks: "./tasks/groups/{{ item }}-roles.yml"
 | 
				
			||||||
  loop:
 | 
					  loop:
 | 
				
			||||||
    - svc
 | 
					    - web-svc # Services need to run before applications
 | 
				
			||||||
    - web
 | 
					    - web-app
 | 
				
			||||||
  loop_control:
 | 
					  loop_control:
 | 
				
			||||||
    label: "{{ item }}-roles.yml"
 | 
					    label: "{{ item }}-roles.yml"
 | 
				
			||||||
							
								
								
									
										6
									
								
								tasks/stages/03_destructor.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								tasks/stages/03_destructor.yml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					- name: "Load destruction roles"
 | 
				
			||||||
 | 
					  include_tasks: "./tasks/groups/{{ item }}-roles.yml"
 | 
				
			||||||
 | 
					  loop:
 | 
				
			||||||
 | 
					    - cln
 | 
				
			||||||
 | 
					  loop_control:
 | 
				
			||||||
 | 
					    label: "{{ item }}-roles.yml"
 | 
				
			||||||
@@ -39,7 +39,7 @@ class TestApplicationIdConsistency(unittest.TestCase):
 | 
				
			|||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            actual_id = vars_data.get("application_id")
 | 
					            actual_id = vars_data.get("application_id")
 | 
				
			||||||
            if actual_id != expected_id:
 | 
					            if actual_id not in [expected_id, role_name]:
 | 
				
			||||||
                failed_roles.append((
 | 
					                failed_roles.append((
 | 
				
			||||||
                    role_name,
 | 
					                    role_name,
 | 
				
			||||||
                    f"application_id is '{actual_id}', expected '{expected_id}'"
 | 
					                    f"application_id is '{actual_id}', expected '{expected_id}'"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										67
									
								
								tests/integration/test_meta_roles_integration.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								tests/integration/test_meta_roles_integration.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
				
			|||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					import re
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Ensure your project root is on PYTHONPATH so filter_plugins can be imported
 | 
				
			||||||
 | 
					ROOT = Path(__file__).parents[2]
 | 
				
			||||||
 | 
					sys.path.insert(0, str(ROOT))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from filter_plugins.invokable_paths import get_invokable_paths
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					STAGES_DIR = ROOT / "tasks" / "stages"
 | 
				
			||||||
 | 
					GROUPS_DIR = ROOT / "tasks" / "groups"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestMetaRolesIntegration(unittest.TestCase):
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def setUpClass(cls):
 | 
				
			||||||
 | 
					        # Use the filter directly
 | 
				
			||||||
 | 
					        cls.role_files = get_invokable_paths(suffix="-roles.yml")
 | 
				
			||||||
 | 
					        cls.invokable_items = get_invokable_paths()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Read all playbook YAML contents under tasks/stages
 | 
				
			||||||
 | 
					        cls.playbook_contents = {}
 | 
				
			||||||
 | 
					        for path in STAGES_DIR.rglob("*.yml"):
 | 
				
			||||||
 | 
					            cls.playbook_contents[path] = path.read_text(encoding="utf-8")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Regex for include_tasks line with {{ item }}-roles.yml
 | 
				
			||||||
 | 
					        cls.include_pattern = re.compile(
 | 
				
			||||||
 | 
					            r'include_tasks:\s*["\']\./tasks/groups/\{\{\s*item\s*\}\}-roles\.yml["\']'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_all_role_files_exist(self):
 | 
				
			||||||
 | 
					        """Each '-roles.yml' path returned by the filter must exist in the project root."""
 | 
				
			||||||
 | 
					        missing = []
 | 
				
			||||||
 | 
					        for fname in self.role_files:
 | 
				
			||||||
 | 
					            path = GROUPS_DIR / fname
 | 
				
			||||||
 | 
					            if not path.is_file():
 | 
				
			||||||
 | 
					                missing.append(fname)
 | 
				
			||||||
 | 
					        self.assertFalse(
 | 
				
			||||||
 | 
					            missing,
 | 
				
			||||||
 | 
					            f"The following role files are missing at project root: {missing}"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_each_invokable_item_referenced_in_playbooks(self):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Each invokable item (without suffix) must be looped through in at least one playbook
 | 
				
			||||||
 | 
					        and include its corresponding include_tasks entry.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        not_referenced = []
 | 
				
			||||||
 | 
					        for item in self.invokable_items:
 | 
				
			||||||
 | 
					            found = False
 | 
				
			||||||
 | 
					            loop_entry = re.compile(rf"-\s*{re.escape(item)}\b")
 | 
				
			||||||
 | 
					            for content in self.playbook_contents.values():
 | 
				
			||||||
 | 
					                if self.include_pattern.search(content) and loop_entry.search(content):
 | 
				
			||||||
 | 
					                    found = True
 | 
				
			||||||
 | 
					                    break
 | 
				
			||||||
 | 
					            if not found:
 | 
				
			||||||
 | 
					                not_referenced.append(item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertEqual(
 | 
				
			||||||
 | 
					            not_referenced, [],
 | 
				
			||||||
 | 
					            f"The following invokable items are not referenced in any playbook: {not_referenced}"
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					    unittest.main()
 | 
				
			||||||
							
								
								
									
										39
									
								
								tests/integration/test_unique_application_id.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								tests/integration/test_unique_application_id.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					import glob
 | 
				
			||||||
 | 
					import yaml
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def find_application_ids():
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    Scans all roles/*/vars/main.yml files and collects application_id values.
 | 
				
			||||||
 | 
					    Returns a dict mapping application_id to list of file paths where it appears.
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    ids = {}
 | 
				
			||||||
 | 
					    # Wenn der Test unter tests/integration liegt, gehen wir zwei Ebenen hoch zum Projekt-Root
 | 
				
			||||||
 | 
					    base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
 | 
				
			||||||
 | 
					    pattern = os.path.join(base_dir, "roles", "*", "vars", "main.yml")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for file_path in glob.glob(pattern):
 | 
				
			||||||
 | 
					        with open(file_path, 'r') as f:
 | 
				
			||||||
 | 
					            data = yaml.safe_load(f) or {}
 | 
				
			||||||
 | 
					        app_id = data.get('application_id')
 | 
				
			||||||
 | 
					        if app_id is not None:
 | 
				
			||||||
 | 
					            ids.setdefault(app_id, []).append(file_path)
 | 
				
			||||||
 | 
					    return ids
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TestUniqueApplicationId(unittest.TestCase):
 | 
				
			||||||
 | 
					    def test_application_ids_are_unique(self):
 | 
				
			||||||
 | 
					        ids = find_application_ids()
 | 
				
			||||||
 | 
					        duplicates = {app_id: paths for app_id, paths in ids.items() if len(paths) > 1}
 | 
				
			||||||
 | 
					        if duplicates:
 | 
				
			||||||
 | 
					            messages = []
 | 
				
			||||||
 | 
					            for app_id, paths in duplicates.items():
 | 
				
			||||||
 | 
					                file_list = '\n    '.join(paths)
 | 
				
			||||||
 | 
					                messages.append(f"application_id '{app_id}' found in multiple files:\n    {file_list}")
 | 
				
			||||||
 | 
					            self.fail("\n\n".join(messages))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 | 
					    unittest.main(verbosity=2)
 | 
				
			||||||
@@ -8,7 +8,7 @@ import sys
 | 
				
			|||||||
def load_optimizer_module():
 | 
					def load_optimizer_module():
 | 
				
			||||||
    module_path = os.path.abspath(os.path.join(
 | 
					    module_path = os.path.abspath(os.path.join(
 | 
				
			||||||
        os.path.dirname(__file__),
 | 
					        os.path.dirname(__file__),
 | 
				
			||||||
        '..', "..", "..","..",'roles', 'maint-docker-storage-optimizer', 'files', 'maint-docker-storage-optimizer.py'
 | 
					        '..', "..", "..","..",'roles', 'cln-docker-storage-optimizer', 'files', 'cln-docker-storage-optimizer.py'
 | 
				
			||||||
    ))
 | 
					    ))
 | 
				
			||||||
    spec = importlib.util.spec_from_file_location('storage_optimizer', module_path)
 | 
					    spec = importlib.util.spec_from_file_location('storage_optimizer', module_path)
 | 
				
			||||||
    optimizer = importlib.util.module_from_spec(spec)
 | 
					    optimizer = importlib.util.module_from_spec(spec)
 | 
				
			||||||
		Reference in New Issue
	
	Block a user