Add lego certificate service to ansible
This commit is contained in:
		
							parent
							
								
									5246a6b101
								
							
						
					
					
						commit
						068a8e2cd7
					
				
					 13 changed files with 212 additions and 0 deletions
				
			
		
							
								
								
									
										18
									
								
								filter_plugins/acmedns_to_lego.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								filter_plugins/acmedns_to_lego.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					class FilterModule(object):
 | 
				
			||||||
 | 
					    def filters(self):
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            'acmedns_to_lego': self.acmedns_to_lego,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def acmedns_to_lego(self, acmedns_registered):
 | 
				
			||||||
 | 
					        result = {}
 | 
				
			||||||
 | 
					        for (key, value) in acmedns_registered.items():
 | 
				
			||||||
 | 
					            result[key] = {
 | 
				
			||||||
 | 
					                "fulldomain": value["subd"] + "." + value["host"],
 | 
				
			||||||
 | 
					                "subdomain": value["subd"],
 | 
				
			||||||
 | 
					                "username": value["user"],
 | 
				
			||||||
 | 
					                "password": value["pass"],
 | 
				
			||||||
 | 
					                "server_url": "https://" + value["host"]
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return result
 | 
				
			||||||
| 
						 | 
					@ -6,6 +6,8 @@
 | 
				
			||||||
      tags: [always]
 | 
					      tags: [always]
 | 
				
			||||||
    - role: backup
 | 
					    - role: backup
 | 
				
			||||||
      tags: [backup]
 | 
					      tags: [backup]
 | 
				
			||||||
 | 
					    - role: lego
 | 
				
			||||||
 | 
					      tags: [lego, certificates]
 | 
				
			||||||
    - role: caddy
 | 
					    - role: caddy
 | 
				
			||||||
      tags: [caddy, reverse-proxy, webserver]
 | 
					      tags: [caddy, reverse-proxy, webserver]
 | 
				
			||||||
      vars:
 | 
					      vars:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										6
									
								
								roles/lego/files/hook.sh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								roles/lego/files/hook.sh
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,6 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cp -f "$LEGO_CERT_PATH" /certificates
 | 
				
			||||||
 | 
					cp -f "$LEGO_CERT_KEY_PATH" /certificates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exit 33 # special exit code to signal that the certificate has been updated
 | 
				
			||||||
							
								
								
									
										15
									
								
								roles/lego/files/lego.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										15
									
								
								roles/lego/files/lego.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					domain="$1"
 | 
				
			||||||
 | 
					action="${2:-renew}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docker compose run --rm app \
 | 
				
			||||||
 | 
						--domains "$domain" \
 | 
				
			||||||
 | 
						"$action" \
 | 
				
			||||||
 | 
						"--$action-hook" "/config/hook.sh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ "$?" = "33" ] && [ -x "./lego.d/$domain" ];
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
						echo "Running hook for $domain"
 | 
				
			||||||
 | 
						"./lego.d/$domain"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
							
								
								
									
										10
									
								
								roles/lego/files/lego@.timer
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								roles/lego/files/lego@.timer
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					[Unit]
 | 
				
			||||||
 | 
					Description=Renew certificates
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Timer]
 | 
				
			||||||
 | 
					Persistent=true
 | 
				
			||||||
 | 
					OnCalendar=*-*-* 01:15:00
 | 
				
			||||||
 | 
					RandomizedDelaySec=2h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[Install]
 | 
				
			||||||
 | 
					WantedBy=timers.target
 | 
				
			||||||
							
								
								
									
										16
									
								
								roles/lego/files/node002/db.serguzim.me
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								roles/lego/files/node002/db.serguzim.me
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					domain="db.serguzim.me"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docker compose run --rm app "$1" "$domain"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_install() {
 | 
				
			||||||
 | 
					  install --owner=postgres --group=postgres --mode=600 \
 | 
				
			||||||
 | 
						  "/opt/services/_certificates/$domain.$1" \
 | 
				
			||||||
 | 
						  "/var/lib/postgresql/server.$1"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_install crt
 | 
				
			||||||
 | 
					_install key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sudo -u postgres pg_ctl -D /var/lib/postgres/data/ reload
 | 
				
			||||||
							
								
								
									
										17
									
								
								roles/lego/files/node002/registry.serguzim.me
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										17
									
								
								roles/lego/files/node002/registry.serguzim.me
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					domain="registry.serguzim.me"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					docker compose run --rm app "$1" "$domain"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_install() {
 | 
				
			||||||
 | 
					  install --owner=root --group=root --mode=600 \
 | 
				
			||||||
 | 
						  "/opt/services/_certificates/$domain.$1" \
 | 
				
			||||||
 | 
						  "/opt/services/harbor/server.$1"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_install crt
 | 
				
			||||||
 | 
					_install key
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export HARBOR_BUNDLE_DIR=/opt/services/harbor
 | 
				
			||||||
 | 
					$HARBOR_BUNDLE_DIR/data/install.sh
 | 
				
			||||||
							
								
								
									
										19
									
								
								roles/lego/tasks/config.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								roles/lego/tasks/config.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					- name: Set config path
 | 
				
			||||||
 | 
					  ansible.builtin.set_fact:
 | 
				
			||||||
 | 
					    config_path: "{{ (service_path, 'config') | path_join }}"
 | 
				
			||||||
 | 
					- name: Create config directory
 | 
				
			||||||
 | 
					  ansible.builtin.file:
 | 
				
			||||||
 | 
					    path: "{{ config_path }}"
 | 
				
			||||||
 | 
					    state: directory
 | 
				
			||||||
 | 
					    mode: "0755"
 | 
				
			||||||
 | 
					- name: Copy the acme-dns-accounts
 | 
				
			||||||
 | 
					  ansible.builtin.template:
 | 
				
			||||||
 | 
					    src: "json.j2"
 | 
				
			||||||
 | 
					    dest: "{{ (config_path, 'acme-dns-accounts.json') | path_join }}"
 | 
				
			||||||
 | 
					    mode: "0644"
 | 
				
			||||||
 | 
					- name: Copy the hook script
 | 
				
			||||||
 | 
					  ansible.builtin.copy:
 | 
				
			||||||
 | 
					    src: "hook.sh"
 | 
				
			||||||
 | 
					    dest: "{{ (config_path, 'hook.sh') | path_join }}"
 | 
				
			||||||
 | 
					    mode: "0755"
 | 
				
			||||||
							
								
								
									
										16
									
								
								roles/lego/tasks/lego.d.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								roles/lego/tasks/lego.d.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					- name: Set lego.d path
 | 
				
			||||||
 | 
					  ansible.builtin.set_fact:
 | 
				
			||||||
 | 
					    lego_d_path: "{{ (service_path, 'lego.d') | path_join }}"
 | 
				
			||||||
 | 
					- name: Create lego.d directory
 | 
				
			||||||
 | 
					  ansible.builtin.file:
 | 
				
			||||||
 | 
					    path: "{{ lego_d_path }}"
 | 
				
			||||||
 | 
					    state: directory
 | 
				
			||||||
 | 
					    mode: "0755"
 | 
				
			||||||
 | 
					- name: Copy the additional lego scripts
 | 
				
			||||||
 | 
					  ansible.builtin.copy:
 | 
				
			||||||
 | 
					    src: "{{ item }}"
 | 
				
			||||||
 | 
					    dest: "{{ lego_d_path }}"
 | 
				
			||||||
 | 
					    mode: "0755"
 | 
				
			||||||
 | 
					  with_fileglob:
 | 
				
			||||||
 | 
					    - "{{ ansible_facts.hostname }}/*"
 | 
				
			||||||
							
								
								
									
										35
									
								
								roles/lego/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								roles/lego/tasks/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					- name: Set common facts
 | 
				
			||||||
 | 
					  ansible.builtin.import_tasks: tasks/set-default-facts.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- name: Deploy {{ svc.name }}
 | 
				
			||||||
 | 
					  vars:
 | 
				
			||||||
 | 
					    svc: "{{ lego_svc }}"
 | 
				
			||||||
 | 
					    env: "{{ lego_env }}"
 | 
				
			||||||
 | 
					    json: "{{ vault_acmedns_registered | acmedns_to_lego }}"
 | 
				
			||||||
 | 
					    compose: "{{ lego_compose }}"
 | 
				
			||||||
 | 
					  block:
 | 
				
			||||||
 | 
					    - name: Import prepare tasks for common service
 | 
				
			||||||
 | 
					      ansible.builtin.import_tasks: tasks/prepare-common-service.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Create _certificates directory
 | 
				
			||||||
 | 
					      ansible.builtin.file:
 | 
				
			||||||
 | 
					        path: "{{ certificates_path }}"
 | 
				
			||||||
 | 
					        state: directory
 | 
				
			||||||
 | 
					        mode: "0755"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Import tasks specific to the config directory
 | 
				
			||||||
 | 
					      ansible.builtin.import_tasks: config.yml
 | 
				
			||||||
 | 
					    - name: Import tasks specific to lego.d
 | 
				
			||||||
 | 
					      ansible.builtin.import_tasks: lego.d.yml
 | 
				
			||||||
 | 
					    - name: Import tasks specific to systemd
 | 
				
			||||||
 | 
					      ansible.builtin.import_tasks: systemd.yml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Copy the run script
 | 
				
			||||||
 | 
					      ansible.builtin.copy:
 | 
				
			||||||
 | 
					        src: "lego.sh"
 | 
				
			||||||
 | 
					        dest: "{{ (service_path, 'lego.sh') | path_join }}"
 | 
				
			||||||
 | 
					        mode: "0755"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    - name: Import tasks create a service.env file
 | 
				
			||||||
 | 
					      ansible.builtin.import_tasks: tasks/steps/template-service-env.yml
 | 
				
			||||||
							
								
								
									
										23
									
								
								roles/lego/tasks/systemd.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								roles/lego/tasks/systemd.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,23 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					- name: Copy the system service
 | 
				
			||||||
 | 
					  ansible.builtin.template:
 | 
				
			||||||
 | 
					    src: lego@.service.j2
 | 
				
			||||||
 | 
					    dest: /etc/systemd/system/lego@.service
 | 
				
			||||||
 | 
					    mode: "0644"
 | 
				
			||||||
 | 
					  become: true
 | 
				
			||||||
 | 
					- name: Copy the system timer
 | 
				
			||||||
 | 
					  ansible.builtin.copy:
 | 
				
			||||||
 | 
					    src: lego@.timer
 | 
				
			||||||
 | 
					    dest: /etc/systemd/system/lego@.timer
 | 
				
			||||||
 | 
					    mode: "0644"
 | 
				
			||||||
 | 
					  become: true
 | 
				
			||||||
 | 
					- name: Enable the system timer for {{ item }}
 | 
				
			||||||
 | 
					  ansible.builtin.systemd_service:
 | 
				
			||||||
 | 
					    name: lego@{{ item }}.timer
 | 
				
			||||||
 | 
					    state: started
 | 
				
			||||||
 | 
					    enabled: true
 | 
				
			||||||
 | 
					    daemon_reload: true
 | 
				
			||||||
 | 
					  loop:
 | 
				
			||||||
 | 
					    - db.serguzim.me
 | 
				
			||||||
 | 
					    - registry.serguzim.me
 | 
				
			||||||
 | 
					  become: true
 | 
				
			||||||
							
								
								
									
										4
									
								
								roles/lego/templates/lego@.service.j2
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								roles/lego/templates/lego@.service.j2
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,4 @@
 | 
				
			||||||
 | 
					[Service]
 | 
				
			||||||
 | 
					Type=oneshot
 | 
				
			||||||
 | 
					ExecStart={{ service_path }}/lego.sh %i
 | 
				
			||||||
 | 
					WorkingDirectory={{ service_path }}
 | 
				
			||||||
							
								
								
									
										31
									
								
								roles/lego/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								roles/lego/vars/main.yml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					lego_svc:
 | 
				
			||||||
 | 
					  name: lego
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lego_env:
 | 
				
			||||||
 | 
					  ACME_DNS_API_BASE: https://{{ acme_dns.host }}
 | 
				
			||||||
 | 
					  ACME_DNS_STORAGE_PATH: /config/acme-dns-accounts.json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  LEGO_EMAIL: "{{ admin_email }}"
 | 
				
			||||||
 | 
					  LEGO_PATH: /data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lego_compose:
 | 
				
			||||||
 | 
					  watchtower: false
 | 
				
			||||||
 | 
					  network: false
 | 
				
			||||||
 | 
					  image: goacme/lego
 | 
				
			||||||
 | 
					  volumes:
 | 
				
			||||||
 | 
					    - ./config:/config:ro
 | 
				
			||||||
 | 
					    - "{{ certificates_path }}:/certificates"
 | 
				
			||||||
 | 
					    - data:/data
 | 
				
			||||||
 | 
					  file:
 | 
				
			||||||
 | 
					    services:
 | 
				
			||||||
 | 
					      app:
 | 
				
			||||||
 | 
					        restart: never
 | 
				
			||||||
 | 
					        network_mode: "host"
 | 
				
			||||||
 | 
					        entrypoint:
 | 
				
			||||||
 | 
					          - /lego
 | 
				
			||||||
 | 
					          - --accept-tos
 | 
				
			||||||
 | 
					          - --email={{ admin_email }}
 | 
				
			||||||
 | 
					          - --dns=acme-dns
 | 
				
			||||||
 | 
					    volumes:
 | 
				
			||||||
 | 
					      data:
 | 
				
			||||||
		Reference in a new issue