refactor: move all service roles into a single alpina role

This commit is contained in:
Iurii Tatishchev 2023-04-04 22:56:23 -07:00
parent ec335e5d3c
commit 145c5db29f
Signed by: CaZzzer
GPG Key ID: 9A156B7DA6398968
53 changed files with 109 additions and 100 deletions

5
.idea/alpina.iml generated
View File

@ -23,11 +23,6 @@
<option name="TEMPLATE_CONFIGURATION" value="Jinja2" /> <option name="TEMPLATE_CONFIGURATION" value="Jinja2" />
<option name="TEMPLATE_FOLDERS"> <option name="TEMPLATE_FOLDERS">
<list> <list>
<option value="$MODULE_DIR$/roles/traefik/templates" />
<option value="$MODULE_DIR$/roles/gitea/templates" />
<option value="$MODULE_DIR$/roles/nextcloud/templates" />
<option value="$MODULE_DIR$/roles/arrstack/templates" />
<option value="$MODULE_DIR$/roles/jellyfin/templates" />
<option value="$MODULE_DIR$/roles/docker_host/templates" /> <option value="$MODULE_DIR$/roles/docker_host/templates" />
</list> </list>
</option> </option>

View File

@ -1,39 +0,0 @@
# https://stackoverflow.com/questions/41667864/can-the-templates-module-handle-multiple-templates-directories
- name: Ensure service directory exists
file:
path: "{{ current_svc_path }}"
state: directory
mode: "700"
- name: Ensure directory structure exists
file:
path: "{{ current_svc_path }}/{{ item.path }}"
state: directory
mode: "700"
with_community.general.filetree: "{{ templates_source }}"
when: item.state == "directory"
- name: Include app config variables
include_vars:
file: "{{ role_path }}/vars/app_config.yml"
- name: Generate {{ current_svc_name }} deployment from templates
template:
src: "{{ item.src }}"
dest: "{{ current_svc_path }}/{{ item.path | regex_replace('\\.j2$', '') }}"
mode: "600"
with_community.general.filetree: "{{ templates_source }}"
when: item.state == "file"
- name: Deploy docker-compose for {{ current_svc_name }}
command: docker compose -f "{{ current_svc_path }}/docker-compose.yml" up -d --pull --remove-orphans
register: docker_compose_output
# Not perfect idempotency, but the built-in docker_compose module doesn't support docker-compose v2
# And of course there's an IPv6 bug in docker-compose v1, smh
# https://github.com/docker/compose/issues/7670
changed_when: "'created' in docker_compose_output.stderr.lower()"
- debug:
var: docker_compose_output

View File

@ -1,5 +1,5 @@
--- ---
my_svc_path: ~/services my_svc_path: ~/alpina
base_volume_path: /mnt/dock base_volume_path: /mnt/dock
media_volume_path: /mnt/media media_volume_path: /mnt/media

View File

@ -0,0 +1,18 @@
- name: Ensure {{ collection }} collection directory exists
file:
path: "{{ my_svc_path }}/{{ collection }}"
state: directory
mode: "700"
- name: Deploy docker compose stacks for {{ collection }}
vars:
current_stack_name: "{{ stack }}"
current_stack_dest: "{{ my_svc_path }}/{{ collection }}/{{ stack }}"
current_stack_source: "{{ role_path }}/collections/{{ collection }}/{{ stack }}"
include_tasks: deploy_compose_stack.yml
loop: "{{ stacks }}"
loop_control:
loop_var: stack
- debug:
var: acme_email

View File

@ -0,0 +1,40 @@
# https://stackoverflow.com/questions/41667864/can-the-templates-module-handle-multiple-templates-directories
- name: Ensure stack directory exists
file:
path: "{{ current_stack_dest }}"
state: directory
mode: "700"
- name: Ensure directory structure exists
file:
path: "{{ current_stack_dest }}/{{ item.path }}"
state: directory
mode: "700"
with_community.general.filetree: "{{ current_stack_source }}/templates"
when: item.state == "directory"
# TODO: This is not ideal as it leaks the variables between stacks
# But that's also not really a problem, as they won't conflict if everything is done right
- name: Include variables for stack {{ stack }}
include_vars:
file: "{{ current_stack_source }}/app_config.yml"
- name: Generate {{ current_stack_name }} deployment from templates
template:
src: "{{ item.src }}"
dest: "{{ current_stack_dest }}/{{ item.path | regex_replace('\\.j2$', '') }}"
mode: "600"
with_community.general.filetree: "{{ current_stack_source }}/templates"
when: item.state == "file"
- name: Deploy docker-compose for {{ current_stack_name }}
command: docker compose -f "{{ current_stack_dest }}/docker-compose.yml" up -d --pull --remove-orphans
register: docker_compose_output
# Not perfect idempotency, but the built-in docker_compose module doesn't support docker-compose v2
# And of course there's an IPv6 bug in docker-compose v1, smh
# https://github.com/docker/compose/issues/7670
changed_when: "'created' in docker_compose_output.stderr.lower()"
- debug:
var: docker_compose_output

View File

@ -0,0 +1,23 @@
- name: Ensure alpina directory exists
file:
state: directory
path: "{{ my_svc_path }}"
mode: "700"
- name: Deploy collection services
vars:
collection: services
stacks:
- traefik
- authentik
import_tasks: deploy_collection.yml
- name: Deploy collection apps
vars:
collection: apps
stacks:
- gitea
- nextcloud
- jellyfin
- arrstack
import_tasks: deploy_collection.yml

View File

@ -1,2 +0,0 @@
- name: "Docker compose steps for {{ current_svc_name }}"
import_tasks: "{{ playbook_dir }}/contrib/docker_compose_template_task_list.yml"

View File

@ -1,5 +0,0 @@
---
current_svc_name: arrstack
current_svc_path: "{{ my_svc_path }}/{{ current_svc_name }}"
templates_source: "{{ role_path }}/templates"

View File

@ -1,2 +0,0 @@
- name: "Docker compose steps for {{ current_svc_name }}"
import_tasks: "{{ playbook_dir }}/contrib/docker_compose_template_task_list.yml"

View File

@ -1,5 +0,0 @@
---
current_svc_name: authentik
current_svc_path: "{{ my_svc_path }}/{{ current_svc_name }}"
templates_source: "{{ role_path }}/templates"

View File

@ -1,9 +1,3 @@
- name: Create my service directory
file:
state: directory
path: "{{ my_svc_path }}"
mode: "700"
- name: Get IPv6 subnet for Docker - name: Get IPv6 subnet for Docker
set_fact: set_fact:
docker_ipv6_subnet: "{{ \ docker_ipv6_subnet: "{{ \
@ -35,6 +29,27 @@
state: disabled state: disabled
register: docker0_firewalld register: docker0_firewalld
- name: Get list of running Docker containers
docker_host_info:
containers: yes
register: docker_container_list
when: clean_desired is true
- name: Stop all running Docker containers
docker_container:
name: "{{ item }}"
state: stopped
loop: "{{ docker_container_list.containers | map(attribute='Id') | list }}"
async: 300
poll: 0
when: clean_desired is true and docker_container_list.containers | length > 0
- name: Prune all Docker containers and networks
docker_prune:
containers: yes
networks: yes
when: clean_desired is true
- name: Restart Docker daemon - name: Restart Docker daemon
become: yes become: yes
service: service:

View File

@ -1,2 +0,0 @@
- name: "Docker compose steps for {{ current_svc_name }}"
import_tasks: "{{ playbook_dir }}/contrib/docker_compose_template_task_list.yml"

View File

@ -1,5 +0,0 @@
---
current_svc_name: gitea
current_svc_path: "{{ my_svc_path }}/{{ current_svc_name }}"
templates_source: "{{ role_path }}/templates"

View File

@ -1,2 +0,0 @@
- name: "Docker compose steps for {{ current_svc_name }}"
import_tasks: "{{ playbook_dir }}/contrib/docker_compose_template_task_list.yml"

View File

@ -1,5 +0,0 @@
---
current_svc_name: jellyfin
current_svc_path: "{{ my_svc_path }}/{{ current_svc_name }}"
templates_source: "{{ role_path }}/templates"

View File

@ -1,2 +0,0 @@
- name: "Docker compose steps for {{ current_svc_name }}"
import_tasks: "{{ playbook_dir }}/contrib/docker_compose_template_task_list.yml"

View File

@ -1,6 +0,0 @@
---
# vars file for roles/nextcloud/
current_svc_name: nextcloud
current_svc_path: "{{ my_svc_path }}/{{ current_svc_name }}"
templates_source: "{{ role_path }}/templates"

View File

@ -1,2 +0,0 @@
- name: "Docker compose steps for {{ current_svc_name }}"
import_tasks: "{{ playbook_dir }}/contrib/docker_compose_template_task_list.yml"

View File

@ -1,5 +0,0 @@
---
current_svc_name: traefik
current_svc_path: "{{ my_svc_path }}/{{ current_svc_name }}"
templates_source: "{{ role_path }}/templates"

View File

@ -1,12 +1,7 @@
- hosts: docker_hosts - hosts: docker_hosts
roles: roles:
- docker_host - docker_host
- traefik - alpina
- authentik
- gitea
- nextcloud
- jellyfin
- arrstack
post_tasks: post_tasks:
- name: Docker prune objects - name: Docker prune objects
docker_prune: docker_prune:

View File

@ -1,6 +1,11 @@
- hosts: all - hosts: all
roles: roles:
- common - common
pre_tasks:
- name: Set fact for clean required
set_fact:
clean_desired: true
- name: Install services - name: Install services
import_playbook: services.yml import_playbook: services.yml