summaryrefslogtreecommitdiff
path: root/roles/apache_server
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-05-12 20:28:44 +0300
committerLars Wirzenius <liw@liw.fi>2018-05-12 20:28:44 +0300
commita0b4020cbca74ab6c833b542840a9e2cdfda8abc (patch)
treeef00583c29f780d85aab3bdef1a09a6215b5a68a /roles/apache_server
parent9443898ed15a4fa7b8d2712a073b1bd2b011fa0a (diff)
downloaddebian-ansible-a0b4020cbca74ab6c833b542840a9e2cdfda8abc.tar.gz
Add: support optional Let's Encrypt TLS certs for static web sites
Diffstat (limited to 'roles/apache_server')
-rw-r--r--roles/apache_server/defaults/main.yml4
-rw-r--r--roles/apache_server/tasks/main.yml47
-rw-r--r--roles/apache_server/templates/deploy_static_site_certs27
-rw-r--r--roles/apache_server/templates/virtualhost.conf.tmpl35
4 files changed, 109 insertions, 4 deletions
diff --git a/roles/apache_server/defaults/main.yml b/roles/apache_server/defaults/main.yml
index cfa797c..f130e35 100644
--- a/roles/apache_server/defaults/main.yml
+++ b/roles/apache_server/defaults/main.yml
@@ -15,3 +15,7 @@
# ownermail: liw@liw.fi
static_sites: []
+
+
+# Enable letsencrypt?
+letsencrypt: yes
diff --git a/roles/apache_server/tasks/main.yml b/roles/apache_server/tasks/main.yml
index 0f59f67..a66f85e 100644
--- a/roles/apache_server/tasks/main.yml
+++ b/roles/apache_server/tasks/main.yml
@@ -1,9 +1,48 @@
-- name: install rsync (so one can publish files via server)
+- name: install apache and related packages
apt:
- name: rsync
+ name: "{{ item }}"
+ with_items:
+ - rsync
+ - apache2
-- name: install apache2
- apt: name=apache2
+- name: enable apache modules for ssl
+ apache2_module:
+ state: present
+ name: "{{ item }}"
+ with_items:
+ - ssl
+ - rewrite
+
+- name: install certbot
+ apt:
+ name: certbot
+ default_release: stretch-backports
+ when: letsencrypt
+
+- name: "empty list of domains for Let's Encrypt"
+ shell: rm -f /etc/letsencrypt/static_sites/*
+
+- name: "create list of domains for static sites to get Let's Encrypt certs for"
+ shell: |
+ if [ "{{ item.letsencrypt|default(false) }}" = True ]
+ then
+ listdir="/etc/letsencrypt/static_sites"
+ mkdir -p "$listdir"
+ touch "$listdir/{{ item.domain }}"
+ fi
+ with_items: "{{ static_sites }}"
+
+- name: install script to run certbot
+ template:
+ src: deploy_static_site_certs
+ dest: /usr/local/sbin/deploy_static_site_certs
+ owner: root
+ group: root
+ mode: 755
+ when: letsencrypt
+
+- name: "get initial certificate from Let's Encrypt"
+ shell: /usr/local/sbin/deploy_static_site_certs
- name: create dirs for static site contents
file:
diff --git a/roles/apache_server/templates/deploy_static_site_certs b/roles/apache_server/templates/deploy_static_site_certs
new file mode 100644
index 0000000..32ace4e
--- /dev/null
+++ b/roles/apache_server/templates/deploy_static_site_certs
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+set -eu
+
+
+domains()
+{
+ cd /etc/letsencrypt/static_sites
+ ls
+}
+
+
+opts()
+{
+ for domain in $(domains)
+ do
+ echo -w "/srv/http/$domain" -d "$domain"
+ done
+}
+
+
+certbot certonly \
+ --noninteractive \
+ --email "{{ letsencrypt_email }}" \
+ --agree-tos \
+ --expand \
+ --webroot $(opts)
diff --git a/roles/apache_server/templates/virtualhost.conf.tmpl b/roles/apache_server/templates/virtualhost.conf.tmpl
index 1fa060a..5d06f0e 100644
--- a/roles/apache_server/templates/virtualhost.conf.tmpl
+++ b/roles/apache_server/templates/virtualhost.conf.tmpl
@@ -7,6 +7,36 @@
DocumentRoot /srv/http/{{ item.domain }}
ErrorLog /var/log/apache2/{{ item.domain }}/error.log
CustomLog /var/log/apache2/{{ item.domain }}/access.log combined
+{% if item.letsencrypt|default(false) %}
+ Redirect permanent / "https://{{ item.domain }}/"
+{% else %}
+ <Directory /srv/http/{{ item.domain }}>
+
+ Options +SymlinksIfOwnerMatch +Indexes +MultiViews
+{% if item.htpasswd is defined %}
+ AuthType Basic
+ AuthName "{{ item.htpasswd_name }}"
+ AuthUserFile "/srv/http/{{ item.domain }}.htpasswd"
+ Require valid-user
+{% else %}
+ AllowOverride AuthConfig
+ Require all granted
+{% endif %}
+ </Directory>
+{% endif %}
+</VirtualHost>
+
+
+{% if item.letsencrypt|default(false) %}
+<VirtualHost _default_:443>
+ ServerName {{ item.domain }}
+{% if item.alias is defined %}
+ ServerAlias {{ item.alias }}
+{% endif %}
+ ServerAdmin {{ item.ownermail }}
+ DocumentRoot /srv/http/{{ item.domain }}
+ ErrorLog /var/log/apache2/{{ item.domain }}/error.log
+ CustomLog /var/log/apache2/{{ item.domain }}/access.log combined
<Directory /srv/http/{{ item.domain }}>
Options +SymlinksIfOwnerMatch +Indexes +MultiViews
{% if item.htpasswd is defined %}
@@ -19,4 +49,9 @@
Require all granted
{% endif %}
</Directory>
+
+ SSLEngine on
+ SSLCertificateFile "/etc/letsencrypt/live/{{ letsencrypt_main_domain }}/fullchain.pem"
+ SSLCertificateKeyFile "/etc/letsencrypt/live/{{ letsencrypt_main_domain }}/privkey.pem"
</VirtualHost>
+{% endif %}