r/postgresql-cert: ACME certificates using certbot
This role can be used to get a server certificate for PostgreSQL from an ACME CA using `certbot`. It fetches the initial certificate and copies it to the PostgreSQL configuration directory. It also sets up a post-renewal hook script that copies updated certificates and reload the server.frigate-exporter
parent
9e742dc217
commit
99c309240c
|
@ -0,0 +1,8 @@
|
||||||
|
- name: reload systemd
|
||||||
|
systemd:
|
||||||
|
daemon_reload: true
|
||||||
|
|
||||||
|
- name: restart certbot-renew timer
|
||||||
|
systemd:
|
||||||
|
name: certbot-renew.timer
|
||||||
|
state: restarted
|
|
@ -0,0 +1,114 @@
|
||||||
|
- name: ensure required packages are installed
|
||||||
|
package:
|
||||||
|
name:
|
||||||
|
- certbot
|
||||||
|
- postgresql-server # to get postgres user account
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- install
|
||||||
|
|
||||||
|
- name: ensure http port is allowed in firewall (for acme challenge)
|
||||||
|
firewalld:
|
||||||
|
service: http
|
||||||
|
state: enabled
|
||||||
|
permanent: true
|
||||||
|
immediate: true
|
||||||
|
when: host_uses_firewalld|d(true)
|
||||||
|
tags:
|
||||||
|
- firewalld
|
||||||
|
|
||||||
|
- name: ensure postgresql server certificate exists
|
||||||
|
command:
|
||||||
|
certbot certonly -n
|
||||||
|
--standalone
|
||||||
|
-d {{ postgresql_cert_domain }}
|
||||||
|
--server {{ postgresql_cert_acme_server }}
|
||||||
|
--agree-tos
|
||||||
|
--email {{ postgresql_cert_acme_email }}
|
||||||
|
args:
|
||||||
|
creates: /etc/letsencrypt/live/{{ postgresql_cert_domain }}/fullchain.pem
|
||||||
|
tags:
|
||||||
|
- cert
|
||||||
|
|
||||||
|
- name: ensure certbot deploy renewal hook script is installed
|
||||||
|
template:
|
||||||
|
src: deploy-hook.sh.j2
|
||||||
|
dest: /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: u=rwx,go=rx
|
||||||
|
tags:
|
||||||
|
- deploy-hook
|
||||||
|
|
||||||
|
- name: ensure certbot renewal period is configured for postgresql cert
|
||||||
|
lineinfile:
|
||||||
|
line: renew_before_expiry = 8 hours
|
||||||
|
regexp: '^#?\s*renew_before_expiry\s*='
|
||||||
|
path: /etc/letsencrypt/renewal/{{ postgresql_cert_domain }}.conf
|
||||||
|
state: present
|
||||||
|
tags:
|
||||||
|
- config
|
||||||
|
|
||||||
|
- name: ensure certbot-renew timer unit drop-in directory exists
|
||||||
|
file:
|
||||||
|
path: /etc/systemd/system/certbot-renew.timer.d
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: u=rwx,go=rx
|
||||||
|
state: directory
|
||||||
|
tags:
|
||||||
|
- systemd
|
||||||
|
- name: ensure certbot-renew timer schedule is configured
|
||||||
|
template:
|
||||||
|
src: certbot-renew.timer.j2
|
||||||
|
dest: /etc/systemd/system/certbot-renew.timer.d/schedule.conf
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: u=rw,go=r
|
||||||
|
notify:
|
||||||
|
- reload systemd
|
||||||
|
- restart certbot-renew timer
|
||||||
|
tags:
|
||||||
|
- systemd
|
||||||
|
|
||||||
|
- name: ensure certbot-renew timer is enabled
|
||||||
|
systemd:
|
||||||
|
name: certbot-renew.timer
|
||||||
|
enabled: true
|
||||||
|
tags:
|
||||||
|
- service
|
||||||
|
- name: flush handlers
|
||||||
|
meta: flush_handlers
|
||||||
|
- name: ensure certbot-renew timer is running
|
||||||
|
systemd:
|
||||||
|
name: certbot-renew.timer
|
||||||
|
state: started
|
||||||
|
tags:
|
||||||
|
- service
|
||||||
|
|
||||||
|
- name: ensure postgresql config directory exists
|
||||||
|
file:
|
||||||
|
path: /etc/postgresql
|
||||||
|
state: directory
|
||||||
|
- name: ensure initial copy of postgresql certificate is in place
|
||||||
|
copy:
|
||||||
|
src: /etc/letsencrypt/live/{{ postgresql_cert_domain }}/fullchain.pem
|
||||||
|
dest: /etc/postgresql/server.cer
|
||||||
|
remote_src: true
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: u=rw,go=r
|
||||||
|
force: false
|
||||||
|
tags:
|
||||||
|
- cert
|
||||||
|
- name: ensure initial copy of postgresql private key is in place
|
||||||
|
copy:
|
||||||
|
src: /etc/letsencrypt/live/{{ postgresql_cert_domain }}/privkey.pem
|
||||||
|
dest: /etc/postgresql/server.key
|
||||||
|
remote_src: true
|
||||||
|
owner: root
|
||||||
|
group: postgres
|
||||||
|
mode: u=rw,g=r,o=
|
||||||
|
force: false
|
||||||
|
tags:
|
||||||
|
- cert
|
|
@ -0,0 +1,3 @@
|
||||||
|
[Timer]
|
||||||
|
RandomizedDelaySec=15m
|
||||||
|
OnCalendar=hourly
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# vim: set sw=4 ts=4 sts=4 et :
|
||||||
|
|
||||||
|
POSTGRESQL_DOMAIN="{{ postgresql_cert_domain }}"
|
||||||
|
|
||||||
|
set -- ${FAILED_DOMAINS}
|
||||||
|
for domain; do
|
||||||
|
case ${domain} in
|
||||||
|
${POSTGRESQL_DOMAIN})
|
||||||
|
printf 'Certificate renewal failed for %s, not reloading server\n' \
|
||||||
|
"${domain}" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
set -- ${RENEWED_DOMAINS}
|
||||||
|
for domain; do
|
||||||
|
case ${domain} in
|
||||||
|
${POSTGRESQL_DOMAIN})
|
||||||
|
install -o root -g root -m u=rw,go=r \
|
||||||
|
/etc/letsencrypt/live/${POSTGRESQL_DOMAIN}/fullchain.pem \
|
||||||
|
/etc/postgresql/server.cer
|
||||||
|
install -o root -g postgres -m u=rw,g=r,o= \
|
||||||
|
/etc/letsencrypt/live/${POSTGRESQL_DOMAIN}/privkey.pem \
|
||||||
|
/etc/postgresql/server.key
|
||||||
|
systemctl reload postgresql
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
Loading…
Reference in New Issue