test(dependencies): add ssl certs dependencies so nginx does not fail
[arvados-formula.git] / test / salt / states / examples / single_host / snakeoil_certs.sls
1 {%- set curr_tpldir = tpldir %}
2 {%- set tpldir = 'arvados' %}
3 {%- from "arvados/map.jinja" import arvados with context %}
4 {%- set tpldir = curr_tpldir %}
5
6 include:
7   - nginx.passenger
8   - nginx.config
9   - nginx.service
10
11 {%- set arvados_ca_cert_file = '/etc/ssl/certs/arvados-snakeoil-ca.pem' %}
12 {%- set arvados_ca_key_file = '/etc/ssl/private/arvados-snakeoil-ca.key' %}
13 {%- set arvados_cert_file = '/etc/ssl/certs/arvados-snakeoil-cert.pem' %}
14 {%- set arvados_csr_file = '/etc/ssl/private/arvados-snakeoil-cert.csr' %}
15 {%- set arvados_key_file = '/etc/ssl/private/arvados-snakeoil-cert.key' %}
16
17 {%- if grains.get('os_family') == 'Debian' %}
18   {%- set arvados_ca_cert_dest = '/usr/local/share/ca-certificates/arvados-snakeoil-ca.crt' %}
19   {%- set update_ca_cert = '/usr/sbin/update-ca-certificates' %}
20   {%- set openssl_conf = '/etc/ssl/openssl.cnf' %}
21 {%- else %}
22   {%- set arvados_ca_cert_dest = '/etc/pki/ca-trust/source/anchors/arvados-snakeoil-ca.pem' %}
23   {%- set update_ca_cert = '/usr/bin/update-ca-trust' %}
24   {%- set openssl_conf = '/etc/pki/tls/openssl.cnf' %}
25 {%- endif %}
26
27 arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed:
28   pkg.installed:
29     - pkgs:
30       - openssl
31       - ca-certificates
32
33 arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_ca_cmd_run:
34   # Taken from https://github.com/arvados/arvados/blob/master/tools/arvbox/lib/arvbox/docker/service/certificate/run
35   cmd.run:
36     - name: |
37         # These dirs are not to CentOS-ish, but this is a helper script
38         # and they should be enough
39         mkdir -p /etc/ssl/certs/ /etc/ssl/private/ && \
40         openssl req \
41           -new \
42           -nodes \
43           -sha256 \
44           -x509 \
45           -subj "/C=CC/ST=Some State/O=Arvados Formula/OU=arvados-formula/CN=snakeoil-ca-{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}" \
46           -extensions x509_ext \
47           -config <(cat {{ openssl_conf }} \
48                   <(printf "\n[x509_ext]\nbasicConstraints=critical,CA:true,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign")) \
49           -out {{ arvados_ca_cert_file }} \
50           -keyout {{ arvados_ca_key_file }} \
51           -days 365 && \
52         cp {{ arvados_ca_cert_file }} {{ arvados_ca_cert_dest }} && \
53         {{ update_ca_cert }}
54     - unless:
55       - test -f {{ arvados_ca_cert_file }}
56       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_ca_cert_file }}
57     - require:
58       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed
59
60 arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_cert_cmd_run:
61   cmd.run:
62     - name: |
63         cat > /tmp/openssl.cnf <<-CNF
64         [req]
65         default_bits = 2048
66         prompt = no
67         default_md = sha256
68         req_extensions = rext
69         distinguished_name = dn
70         [dn]
71         C   = CC
72         ST  = Some State
73         L   = Some Location
74         O   = Arvados Formula
75         OU  = arvados-formula
76         CN  = {{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
77         emailAddress = admin@{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
78         [rext]
79         subjectAltName = @alt_names
80         [alt_names]
81         {%- for entry in grains.get('ipv4') %}
82         IP.{{ loop.index }} = {{ entry }}
83         {%- endfor %}
84         {%- for entry in [
85             'keep',
86             'collections',
87             'download',
88             'ws',
89             'workbench',
90             'workbench2',
91           ]
92         %}
93         DNS.{{ loop.index }} = {{ entry }}.{{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
94         {%- endfor %}
95         DNS.7 = {{ arvados.cluster.name }}.{{ arvados.cluster.domain }}
96         CNF
97
98         # The req
99         openssl req \
100           -config /tmp/openssl.cnf \
101           -new \
102           -nodes \
103           -sha256 \
104           -out {{ arvados_csr_file }} \
105           -keyout {{ arvados_key_file }} > /tmp/snake_oil_certs.output 2>&1 && \
106         # The cert
107         openssl x509 \
108           -req \
109           -days 365 \
110           -in {{ arvados_csr_file }} \
111           -out {{ arvados_cert_file }} \
112           -extfile /tmp/openssl.cnf \
113           -extensions rext \
114           -CA {{ arvados_ca_cert_file }} \
115           -CAkey {{ arvados_ca_key_file }} \
116           -set_serial $(date +%s) && \
117         chmod 0644 {{ arvados_cert_file }} && \
118         chmod 0640 {{ arvados_key_file }}
119     - unless:
120       - test -f {{ arvados_key_file }}
121       - openssl verify -CAfile {{ arvados_ca_cert_file }} {{ arvados_cert_file }}
122     - require:
123       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_dependencies_pkg_installed
124       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_ca_cmd_run
125
126 {%- if grains.get('os_family') == 'Debian' %}
127 arvados_test_salt_states_examples_single_host_snakeoil_certs_ssl_cert_pkg_installed:
128   pkg.installed:
129     - name: ssl-cert
130     - require_in:
131       - sls: postgres
132
133 arvados_test_salt_states_examples_single_host_snakeoil_certs_certs_permissions_cmd_run:
134   cmd.run:
135     - name: |
136         chown root:ssl-cert {{ arvados_key_file }}
137     - require:
138       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_arvados_snake_oil_cert_cmd_run
139       - pkg: arvados_test_salt_states_examples_single_host_snakeoil_certs_ssl_cert_pkg_installed
140 {%- endif %}
141
142 arvados_test_salt_states_examples_single_host_snakeoil_certs_nginx_snakeoil_file_managed:
143   file.managed:
144     - name: /etc/nginx/snippets/arvados-snakeoil.conf
145     - contents: |
146         ssl_certificate {{ arvados_cert_file }};
147         ssl_certificate_key {{ arvados_key_file }};
148     - watch_in:
149       - service: nginx_service
150     - require:
151       - pkg: passenger_install
152       - cmd: arvados_test_salt_states_examples_single_host_snakeoil_certs_certs_permissions_cmd_run
153     - require_in:
154       - file: nginx_config