Compare commits

...

6 commits

Author SHA1 Message Date
5787a9d792
add role tag to msmtp role
Some checks failed
/ Ansible Lint (push) Failing after 2m30s
/ Ansible Lint (pull_request) Failing after 2m32s
2026-04-30 23:19:44 +02:00
4f2d0ad75b
add role tag to ansible_pull role 2026-04-30 23:19:44 +02:00
1f339db312
add role tag to infrastructure_authorized_keys role 2026-04-30 23:19:44 +02:00
c5951647cf
add role tag to base_config role 2026-04-30 23:19:44 +02:00
20b24f6df7
add role tag to certbot role 2026-04-30 23:19:44 +02:00
447e87961b
add role tag to docker_compose role 2026-04-30 23:19:44 +02:00
13 changed files with 124 additions and 56 deletions

View file

@ -1,6 +1,9 @@
- name: ensure dependencies are installed ---
- tags: ["ansible_pull"]
name: ensure dependencies are installed
block: block:
- name: ensure apt dependencies are installed - tags: ["ansible_pull"]
name: ensure apt dependencies are installed
ansible.builtin.apt: ansible.builtin.apt:
name: name:
- python3-pip - python3-pip
@ -9,13 +12,15 @@
state: present state: present
become: true become: true
- name: ensure SOPS is installed - tags: ["ansible_pull"]
name: ensure SOPS is installed
ansible.builtin.include_role: ansible.builtin.include_role:
name: community.sops.install name: community.sops.install
# https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-and-upgrading-ansible-with-pip # https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#installing-and-upgrading-ansible-with-pip
# https://www.redhat.com/en/blog/python-venv-ansible # https://www.redhat.com/en/blog/python-venv-ansible
- name: ensure Ansible installation exists - tags: ["ansible_pull"]
name: ensure Ansible installation exists
ansible.builtin.pip: ansible.builtin.pip:
name: name:
- ansible - ansible
@ -24,7 +29,8 @@
virtualenv: /usr/local/lib/ansible_pull_venv virtualenv: /usr/local/lib/ansible_pull_venv
become: true become: true
- name: ensure ansible-pull-failure-notify script installation exists - tags: ["ansible_pull"]
name: ensure ansible-pull-failure-notify script installation exists
ansible.builtin.template: ansible.builtin.template:
src: ansible-pull-failure-notify.sh.j2 src: ansible-pull-failure-notify.sh.j2
dest: /usr/local/sbin/ansible-pull-failure-notify.sh dest: /usr/local/sbin/ansible-pull-failure-notify.sh
@ -33,7 +39,8 @@
mode: "0755" mode: "0755"
become: true become: true
- name: ensure secrets directory exists - tags: ["ansible_pull"]
name: ensure secrets directory exists
ansible.builtin.file: ansible.builtin.file:
path: /etc/ansible_pull_secrets path: /etc/ansible_pull_secrets
state: directory state: directory
@ -42,7 +49,8 @@
group: "{{ ansible_pull__user }}" group: "{{ ansible_pull__user }}"
become: true become: true
- name: ensure age private key is deployed - tags: ["ansible_pull"]
name: ensure age private key is deployed
ansible.builtin.copy: ansible.builtin.copy:
content: "{{ ansible_pull__age_private_key }}" content: "{{ ansible_pull__age_private_key }}"
dest: /etc/ansible_pull_secrets/age_private_key dest: /etc/ansible_pull_secrets/age_private_key
@ -51,7 +59,8 @@
group: "{{ ansible_pull__user }}" group: "{{ ansible_pull__user }}"
become: true become: true
- name: ensure systemd services exists - tags: ["ansible_pull"]
name: ensure systemd services exists
ansible.builtin.template: ansible.builtin.template:
src: "{{ item }}.j2" src: "{{ item }}.j2"
dest: "/etc/systemd/system/{{ item }}" dest: "/etc/systemd/system/{{ item }}"
@ -65,7 +74,8 @@
notify: notify:
- systemd daemon reload - systemd daemon reload
- name: ensure systemd timer exists - tags: ["ansible_pull"]
name: ensure systemd timer exists
ansible.builtin.template: ansible.builtin.template:
src: ansible-pull.timer.j2 src: ansible-pull.timer.j2
dest: /etc/systemd/system/ansible-pull.timer dest: /etc/systemd/system/ansible-pull.timer
@ -76,7 +86,8 @@
notify: notify:
- systemd daemon reload - systemd daemon reload
- name: ensure systemd timer is started and enabled - tags: ["ansible_pull"]
name: ensure systemd timer is started and enabled
ansible.builtin.systemd_service: ansible.builtin.systemd_service:
name: ansible-pull.timer name: ansible-pull.timer
state: started state: started

View file

@ -1,10 +1,12 @@
# Ensure the ssh module is disabled, so a cloud-init config change doesn't regenerate the host keys for no reason. # Ensure the ssh module is disabled, so a cloud-init config change doesn't regenerate the host keys for no reason.
- name: check if cloud-init config file exists - tags: ["base_config"]
name: check if cloud-init config file exists
ansible.builtin.stat: ansible.builtin.stat:
path: /etc/cloud/cloud.cfg path: /etc/cloud/cloud.cfg
register: base_config__stat_cloud_cfg register: base_config__stat_cloud_cfg
- name: ensure the cloud-init ssh module is disabled - tags: ["base_config"]
name: ensure the cloud-init ssh module is disabled
ansible.builtin.replace: ansible.builtin.replace:
path: /etc/cloud/cloud.cfg path: /etc/cloud/cloud.cfg
regexp: " - ssh$" regexp: " - ssh$"
@ -13,7 +15,8 @@
when: base_config__stat_cloud_cfg.stat.exists when: base_config__stat_cloud_cfg.stat.exists
# Ensure a base set of admin tools is installed. # Ensure a base set of admin tools is installed.
- name: ensure a base set of admin tools is installed - tags: ["base_config"]
name: ensure a base set of admin tools is installed
ansible.builtin.apt: ansible.builtin.apt:
name: name:
- vim - vim

View file

@ -1,11 +1,15 @@
- name: ensure certbot installation ---
- tags: ["certbot"]
name: ensure certbot installation
ansible.builtin.import_tasks: ansible.builtin.import_tasks:
file: main/install.yaml file: main/install.yaml
- name: ensure new cert commands - tags: ["certbot"]
name: ensure new cert commands
ansible.builtin.import_tasks: ansible.builtin.import_tasks:
file: main/new_cert_commands.yaml file: main/new_cert_commands.yaml
- name: ensure certificates - tags: ["certbot"]
name: ensure certificates
ansible.builtin.import_tasks: ansible.builtin.import_tasks:
file: main/certs.yaml file: main/certs.yaml

View file

@ -1,11 +1,14 @@
- name: get expiry date before ---
- tags: ["certbot", "certbot-cert"]
name: get expiry date before
ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item.commonName }}/fullchain.pem ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item.commonName }}/fullchain.pem
ignore_errors: true ignore_errors: true
become: true become: true
changed_when: false changed_when: false
register: certbot__cert_expiry_before register: certbot__cert_expiry_before
- name: ensure directory for cert configs exists - tags: ["certbot", "certbot-cert"]
name: ensure directory for cert configs exists
ansible.builtin.file: ansible.builtin.file:
path: "/etc/ansible_certbot/cert_configs/" path: "/etc/ansible_certbot/cert_configs/"
state: directory state: directory
@ -14,7 +17,8 @@
mode: "0750" mode: "0750"
become: true become: true
- name: ensure cert config is stored - tags: ["certbot", "certbot-cert"]
name: ensure cert config is stored
ansible.builtin.copy: ansible.builtin.copy:
content: "{{ cert_config_defaults[item.challengeType] | combine(item, recursive=True) | ansible.builtin.to_nice_json }}" content: "{{ cert_config_defaults[item.challengeType] | combine(item, recursive=True) | ansible.builtin.to_nice_json }}"
dest: "/etc/ansible_certbot/cert_configs/{{ item.commonName }}.json" dest: "/etc/ansible_certbot/cert_configs/{{ item.commonName }}.json"
@ -29,18 +33,21 @@
serverUrl: "https://acmedns.hamburg.ccc.de" serverUrl: "https://acmedns.hamburg.ccc.de"
# # https://eff-certbot.readthedocs.io/en/stable/using.html#manual # # https://eff-certbot.readthedocs.io/en/stable/using.html#manual
- name: obtain the certificate using certbot and the manual auth hook - tags: ["certbot", "certbot-cert"]
name: obtain the certificate using certbot and the manual auth hook
ansible.builtin.command: /usr/bin/certbot certonly --keep-until-expiring --agree-tos --non-interactive --email "{{ certbot__acme_account_email_address }}" --no-eff-email --manual --preferred-challenge dns --manual-auth-hook "/usr/local/lib/ansible_certbot/manual_auth_scripts/{{ item.challengeType }}.sh" -d "{{ item.commonName }}" ansible.builtin.command: /usr/bin/certbot certonly --keep-until-expiring --agree-tos --non-interactive --email "{{ certbot__acme_account_email_address }}" --no-eff-email --manual --preferred-challenge dns --manual-auth-hook "/usr/local/lib/ansible_certbot/manual_auth_scripts/{{ item.challengeType }}.sh" -d "{{ item.commonName }}"
become: true become: true
changed_when: false changed_when: false
- name: get expiry date after - tags: ["certbot", "certbot-cert"]
name: get expiry date after
ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item.commonName }}/fullchain.pem ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item.commonName }}/fullchain.pem
become: true become: true
changed_when: false changed_when: false
register: certbot__cert_expiry_after register: certbot__cert_expiry_after
- name: potentially report changed - tags: ["certbot", "certbot-cert"]
name: potentially report changed
ansible.builtin.debug: ansible.builtin.debug:
msg: "If this reports changed, then the certificate expiry date and therefore the certificate changed." msg: "If this reports changed, then the certificate expiry date and therefore the certificate changed."
changed_when: certbot__cert_expiry_before.stdout != certbot__cert_expiry_after.stdout changed_when: certbot__cert_expiry_before.stdout != certbot__cert_expiry_after.stdout

View file

@ -1,14 +1,18 @@
- name: obtain http-01 challenge certificates ---
- tags: ["certbot", "certbot-cert"]
name: obtain http-01 challenge certificates
loop: "{{ certbot__certificate_domains }}" loop: "{{ certbot__certificate_domains }}"
ansible.builtin.include_tasks: ansible.builtin.include_tasks:
file: main/http_01_cert.yaml file: main/http_01_cert.yaml
- name: validate certs config - tags: ["certbot", "certbot-cert"]
name: validate certs config
loop: "{{ certbot__certs }}" loop: "{{ certbot__certs }}"
ansible.builtin.include_tasks: ansible.builtin.include_tasks:
file: main/validate_cert.yaml file: main/validate_cert.yaml
- name: obtain certs - tags: ["certbot", "certbot-cert"]
name: obtain certs
loop: "{{ certbot__certs }}" loop: "{{ certbot__certs }}"
ansible.builtin.include_tasks: ansible.builtin.include_tasks:
file: main/cert.yaml file: main/cert.yaml

View file

@ -1,16 +1,20 @@
- name: get expiry date before ---
- tags: ["certbot", "certbot-http-01-cert"]
name: get expiry date before
ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item }}/fullchain.pem ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item }}/fullchain.pem
ignore_errors: true ignore_errors: true
become: true become: true
changed_when: false changed_when: false
register: certbot__cert_expiry_before register: certbot__cert_expiry_before
- name: obtain the certificate using certbot - tags: ["certbot", "certbot-http-01-cert"]
name: obtain the certificate using certbot
ansible.builtin.command: /usr/bin/certbot certonly --keep-until-expiring --agree-tos --non-interactive --email "{{ certbot__acme_account_email_address }}" --no-eff-email --standalone --http-01-port "{{ certbot__http_01_port }}" -d "{{ item }}" ansible.builtin.command: /usr/bin/certbot certonly --keep-until-expiring --agree-tos --non-interactive --email "{{ certbot__acme_account_email_address }}" --no-eff-email --standalone --http-01-port "{{ certbot__http_01_port }}" -d "{{ item }}"
become: true become: true
changed_when: false changed_when: false
- name: get expiry date after - tags: ["certbot", "certbot-http-01-cert"]
name: get expiry date after
ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item }}/fullchain.pem ansible.builtin.command: /usr/bin/openssl x509 -enddate -noout -in /etc/letsencrypt/live/{{ item }}/fullchain.pem
become: true become: true
changed_when: false changed_when: false

View file

@ -1,4 +1,6 @@
- name: ensure relevant packages are installed ---
- tags: ["certbot", "certbot-install"]
name: ensure relevant packages are installed
ansible.builtin.apt: ansible.builtin.apt:
name: name:
- openssl - openssl
@ -7,9 +9,11 @@
state: present state: present
become: true become: true
- name: ensure manual auth scripts are deployed - tags: ["certbot", "certbot-install"]
name: ensure manual auth scripts are deployed
block: block:
- name: ensure manual auth scripts directory exists - tags: ["certbot", "certbot-install"]
name: ensure manual auth scripts directory exists
ansible.builtin.file: ansible.builtin.file:
path: "/usr/local/lib/ansible_certbot/manual_auth_scripts" path: "/usr/local/lib/ansible_certbot/manual_auth_scripts"
state: directory state: directory
@ -18,7 +22,8 @@
mode: "0755" mode: "0755"
become: true become: true
- name: ensure manual auth scripts are deployed - tags: ["certbot", "certbot-install"]
name: ensure manual auth scripts are deployed
ansible.builtin.copy: ansible.builtin.copy:
src: "manual_auth_scripts/{{ item }}.sh" src: "manual_auth_scripts/{{ item }}.sh"
dest: "/usr/local/lib/ansible_certbot/manual_auth_scripts/{{ item }}.sh" dest: "/usr/local/lib/ansible_certbot/manual_auth_scripts/{{ item }}.sh"

View file

@ -1,4 +1,6 @@
- name: ensure existence of renewal deploy hooks directory ---
- tags: ["certbot", "certbot-new_cert_commands"]
name: ensure existence of renewal deploy hooks directory
ansible.builtin.file: ansible.builtin.file:
path: /etc/letsencrypt/renewal-hooks/deploy path: /etc/letsencrypt/renewal-hooks/deploy
state: directory state: directory
@ -7,7 +9,8 @@
mode: "0755" mode: "0755"
become: true become: true
- name: ensure renewal deploy hook commands - tags: ["certbot", "certbot-new_cert_commands"]
name: ensure renewal deploy hook commands
ansible.builtin.template: ansible.builtin.template:
src: renewal_deploy_hook_commands.sh.j2 src: renewal_deploy_hook_commands.sh.j2
dest: /etc/letsencrypt/renewal-hooks/deploy/ansible_commands.sh dest: /etc/letsencrypt/renewal-hooks/deploy/ansible_commands.sh

View file

@ -1,11 +1,15 @@
- name: validate dns-01-acme-dns challenge type config ---
- tags: ["certbot", "certbot-validate_cert"]
name: validate dns-01-acme-dns challenge type config
when: item.challengeType == "dns-01-acme-dns" when: item.challengeType == "dns-01-acme-dns"
block: block:
- name: assert dns_01_acme_dns config exists - tags: ["certbot", "certbot-validate_cert"]
name: assert dns_01_acme_dns config exists
ansible.builtin.assert: ansible.builtin.assert:
that: item.dns_01_acme_dns is defined that: item.dns_01_acme_dns is defined
- name: assert dns_01_acme_dns config is valid - tags: ["certbot", "certbot-validate_cert"]
name: assert dns_01_acme_dns config is valid
ansible.builtin.validate_argument_spec: ansible.builtin.validate_argument_spec:
argument_spec: "{{ required_data }}" argument_spec: "{{ required_data }}"
provided_arguments: provided_arguments:

View file

@ -1,10 +1,13 @@
- name: docker compose down ---
- tags: ["docker_compose"]
name: docker compose down
community.docker.docker_compose_v2: community.docker.docker_compose_v2:
project_src: /ansible_docker_compose project_src: /ansible_docker_compose
state: absent state: absent
become: true become: true
- name: docker compose restart - tags: ["docker_compose"]
name: docker compose restart
community.docker.docker_compose_v2: community.docker.docker_compose_v2:
project_src: /ansible_docker_compose project_src: /ansible_docker_compose
state: restarted state: restarted

View file

@ -1,4 +1,6 @@
- name: make sure the `/ansible_docker_compose` directory exists ---
- tags: ["docker_compose"]
name: make sure the `/ansible_docker_compose` directory exists
ansible.builtin.file: ansible.builtin.file:
path: /ansible_docker_compose path: /ansible_docker_compose
state: directory state: directory
@ -7,7 +9,8 @@
group: root group: root
become: true become: true
- name: deploy the Compose file - tags: ["docker_compose"]
name: deploy the Compose file
ansible.builtin.copy: ansible.builtin.copy:
content: "{{ docker_compose__compose_file_content }}" content: "{{ docker_compose__compose_file_content }}"
dest: /ansible_docker_compose/compose.yaml dest: /ansible_docker_compose/compose.yaml
@ -17,7 +20,8 @@
become: true become: true
notify: docker compose down notify: docker compose down
- name: deploy the .env file - tags: ["docker_compose"]
name: deploy the .env file
ansible.builtin.copy: ansible.builtin.copy:
content: "{{ docker_compose__env_file_content }}" content: "{{ docker_compose__env_file_content }}"
dest: /ansible_docker_compose/.env dest: /ansible_docker_compose/.env
@ -28,7 +32,8 @@
when: docker_compose__env_file_content is defined when: docker_compose__env_file_content is defined
notify: docker compose down notify: docker compose down
- name: make sure the `/ansible_docker_compose/configs` directory exists - tags: ["docker_compose"]
name: make sure the `/ansible_docker_compose/configs` directory exists
ansible.builtin.file: ansible.builtin.file:
path: /ansible_docker_compose/configs path: /ansible_docker_compose/configs
state: directory state: directory
@ -37,25 +42,29 @@
group: root group: root
become: true become: true
- name: set `docker_compose__config_files_to_exist` fact initially to an empty list - tags: ["docker_compose"]
name: set `docker_compose__config_files_to_exist` fact initially to an empty list
ansible.builtin.set_fact: ansible.builtin.set_fact:
docker_compose__config_files_to_exist: [ ] docker_compose__config_files_to_exist: [ ]
- name: add names from `docker_compose__configuration_files` to `docker_compose__config_files_to_exist` fact - tags: ["docker_compose"]
name: add names from `docker_compose__configuration_files` to `docker_compose__config_files_to_exist` fact
ansible.builtin.set_fact: ansible.builtin.set_fact:
docker_compose__config_files_to_exist: "{{ docker_compose__config_files_to_exist + [ item.name ] }}" # noqa: jinja[spacing] docker_compose__config_files_to_exist: "{{ docker_compose__config_files_to_exist + [ item.name ] }}" # noqa: jinja[spacing]
loop: "{{ docker_compose__configuration_files }}" loop: "{{ docker_compose__configuration_files }}"
loop_control: loop_control:
label: "{{ item.name }}" label: "{{ item.name }}"
- name: find configuration files to remove - tags: ["docker_compose"]
name: find configuration files to remove
ansible.builtin.find: ansible.builtin.find:
paths: /ansible_docker_compose/configs/ paths: /ansible_docker_compose/configs/
recurse: false recurse: false
excludes: "{{ docker_compose__config_files_to_exist }}" excludes: "{{ docker_compose__config_files_to_exist }}"
register: docker_compose__config_files_to_remove register: docker_compose__config_files_to_remove
- name: remove all configuration files, which should be removed - tags: ["docker_compose"]
name: remove all configuration files, which should be removed
ansible.builtin.file: ansible.builtin.file:
path: "{{ item.path }}" path: "{{ item.path }}"
state: absent state: absent
@ -63,7 +72,8 @@
loop: "{{ docker_compose__config_files_to_remove.files }}" loop: "{{ docker_compose__config_files_to_remove.files }}"
notify: docker compose restart notify: docker compose restart
- name: make sure all given configuration files are deployed - tags: ["docker_compose"]
name: make sure all given configuration files are deployed
ansible.builtin.copy: ansible.builtin.copy:
content: "{{ item.content }}" content: "{{ item.content }}"
dest: "/ansible_docker_compose/configs/{{ item.name }}" dest: "/ansible_docker_compose/configs/{{ item.name }}"
@ -76,7 +86,8 @@
label: "{{ item.name }}" label: "{{ item.name }}"
notify: docker compose restart notify: docker compose restart
- name: Sync files - tags: ["docker_compose"]
name: Sync files
ansible.posix.synchronize: ansible.posix.synchronize:
src: "{{ docker_compose__files }}/" src: "{{ docker_compose__files }}/"
dest: "/ansible_docker_compose/files" dest: "/ansible_docker_compose/files"
@ -87,10 +98,12 @@
notify: docker compose restart notify: docker compose restart
when: docker_compose__files != "" when: docker_compose__files != ""
- name: Flush handlers to make "docker compose down" and "docker compose restart" handlers run now - tags: ["docker_compose"]
name: Flush handlers to make "docker compose down" and "docker compose restart" handlers run now
ansible.builtin.meta: flush_handlers ansible.builtin.meta: flush_handlers
- name: docker compose up - tags: ["docker_compose"]
name: docker compose up
community.docker.docker_compose_v2: community.docker.docker_compose_v2:
project_src: /ansible_docker_compose project_src: /ansible_docker_compose
state: present state: present
@ -99,13 +112,15 @@
remove_orphans: true remove_orphans: true
become: true become: true
- name: Make sure anacron is installed - tags: ["docker_compose"]
name: Make sure anacron is installed
become: true become: true
ansible.builtin.package: ansible.builtin.package:
name: anacron name: anacron
state: present state: present
- name: ensure automatic update cron job is present - tags: ["docker_compose"]
name: ensure automatic update cron job is present
become: true become: true
ansible.builtin.cron: ansible.builtin.cron:
name: 'ansible docker compose auto update' name: 'ansible docker compose auto update'

View file

@ -1,4 +1,6 @@
- name: deploy infrastructure authorized keys ---
- tags: ["infrastructure_authorized_keys"]
name: deploy infrastructure authorized keys
ansible.posix.authorized_key: ansible.posix.authorized_key:
state: present state: present
user: chaos user: chaos

View file

@ -1,10 +1,13 @@
- name: ensure msmtp is installed ---
- tags: ["msmtp"]
name: ensure msmtp is installed
ansible.builtin.apt: ansible.builtin.apt:
name: msmtp name: msmtp
state: present state: present
become: true become: true
- name: ensure msmtp config for root user - tags: ["msmtp"]
name: ensure msmtp config for root user
ansible.builtin.template: ansible.builtin.template:
src: msmtprc.j2 src: msmtprc.j2
dest: /root/.msmtprc dest: /root/.msmtprc