diff --git a/files/certbot-renewal.service b/files/certbot-renewal.service new file mode 100644 index 0000000..a55309e --- /dev/null +++ b/files/certbot-renewal.service @@ -0,0 +1,10 @@ +[Unit] +Description=Runs certbot renew + +[Service] +Type=oneshot +RemainAfterExit=no +ExecStart=/scripts/certbot-renewal.sh + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/files/certbot-renewal.sh b/files/certbot-renewal.sh new file mode 100644 index 0000000..8cdc30e --- /dev/null +++ b/files/certbot-renewal.sh @@ -0,0 +1,27 @@ +#! /bin/bash +dom=`date +%d` +today=`date +%Y%m%d` +for f in `ls /etc/letsencrypt/live/ --ignore "README"` +do + echo Checking $f + #check if cert has already expired or will expire within the next two days and renew if applicable + expires=`echo `openssl x509 -enddate -noout -in /etc/letsencrypt/live/$f/cert.pem` " - 2 day" | grep -Po "(?<=notAfter=).*" | date +%Y%m%d -f -` + if [[ $today > $expires ]] + then + echo Certificate for $f is expired, renewing + certbot renew --cert-name $f --dry-run >> /var/log/certbot-renewal.log + fi + #convert hostname into day of month between 0 and 28 to renew on specific day of month (reduce chance of running out of cert renewals) + hash=$(echo $f| md5sum) + num=$((0x${hash%% *})) + for d in {0..2} + do + rdate=$(((${num#-}+$d)%28+1)) + if [[ $dom -eq $rdate ]] + then + echo Date falls within renewal window for $f, attempting renewal + certbot renew --cert-name $f --dry-run >> /var/log/certbot-renewal.log + break + fi + done +done \ No newline at end of file diff --git a/files/certbot-renewal.timer b/files/certbot-renewal.timer new file mode 100644 index 0000000..0d3c949 --- /dev/null +++ b/files/certbot-renewal.timer @@ -0,0 +1,12 @@ +[Unit] +Description=Runs certbot-renewal once per day + +[Timer] +# Time to wait after booting before we run first time +OnBootSec=10min +# Time between running each consecutive time +OnUnitActiveSec=1d +Unit=certbot-renewal.service + +[Install] +WantedBy=multi-user.target diff --git a/tasks/deploy_renewal.yml b/tasks/deploy_renewal.yml new file mode 100644 index 0000000..c471c80 --- /dev/null +++ b/tasks/deploy_renewal.yml @@ -0,0 +1,26 @@ +# deploy_renewal.yml +--- +- name: deploy certbot renewal script + ansible.builtin.copy: + src: files/certbot-renewal.sh + dest: /scripts/certbot-renewal.sh + mode: '0754' + +- name: deploy certbot renewal service + ansible.builtin.copy: + src: files/certbot-renewal.service + dest: /usr/lib/systemd/system/certbot-renewal.service + mode: '0644' + +- name: deploy certbot renewal timer + ansible.builtin.copy: + src: files/certbot-renewal.timer + dest: /usr/lib/systemd/system/certbot-renewal.timer + mode: '0644' + +- name: ensure certbot renewal script is running + service: + name: certbot-renewal.timer + state: started + daemon_reload: true + enabled: yes diff --git a/tasks/main.yml b/tasks/main.yml index ad4f4f4..c6e063c 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -9,3 +9,5 @@ - include_tasks: generate_cert.yml loop: "{{ domains }}" +# deploy renewal script, service and timer for host +- include_tasks: deploy_renewal.yml