25 changed files with 408 additions and 35 deletions
Split View
Diff Options
-
5roles/download/defaults/main.yml
-
6roles/etcd/defaults/main.yml
-
80roles/etcd/files/make-ssl-etcd.sh
-
7roles/etcd/handlers/main.yml
-
36roles/etcd/tasks/check_certs.yml
-
111roles/etcd/tasks/gen_certs.yml
-
2roles/etcd/tasks/main.yml
-
34roles/etcd/tasks/pre_upgrade.yml
-
3roles/etcd/templates/deb-etcd-docker.initd.j2
-
3roles/etcd/templates/etcd-docker.service.j2
-
13roles/etcd/templates/etcd.j2
-
39roles/etcd/templates/openssl.conf.j2
-
6roles/kubernetes-apps/ansible/templates/calico-policy-controller.yml.j2
-
6roles/kubernetes/master/defaults/main.yml
-
10roles/kubernetes/master/templates/manifests/kube-apiserver.manifest.j2
-
3roles/kubernetes/node/templates/cni-calico.conf.j2
-
10roles/kubernetes/preinstall/tasks/set_facts.yml
-
3roles/network_plugin/calico/defaults/main.yml
-
26roles/network_plugin/calico/tasks/main.yml
-
4roles/network_plugin/calico/templates/calicoctl-container.j2
-
3roles/network_plugin/calico/templates/network-environment.j2
-
12roles/network_plugin/flannel/tasks/main.yml
-
18roles/network_plugin/flannel/templates/flannel-pod.yml
-
1roles/network_plugin/flannel/templates/network.json
-
2roles/uploads/defaults/main.yml
@ -1,2 +1,8 @@ |
|||
--- |
|||
etcd_bin_dir: "{{ local_release_dir }}/etcd/etcd-{{ etcd_version }}-linux-amd64/" |
|||
|
|||
etcd_config_dir: /etc/ssl/etcd |
|||
etcd_cert_dir: "{{ etcd_config_dir }}/ssl" |
|||
etcd_cert_group: root |
|||
|
|||
etcd_script_dir: "{{ bin_dir }}/etcd-scripts" |
@ -0,0 +1,80 @@ |
|||
#!/bin/bash |
|||
|
|||
# Author: Smana smainklh@gmail.com |
|||
# |
|||
# Licensed under the Apache License, Version 2.0 (the "License"); |
|||
# you may not use this file except in compliance with the License. |
|||
# You may obtain a copy of the License at |
|||
# |
|||
# http://www.apache.org/licenses/LICENSE-2.0 |
|||
# |
|||
# Unless required by applicable law or agreed to in writing, software |
|||
# distributed under the License is distributed on an "AS IS" BASIS, |
|||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
# See the License for the specific language governing permissions and |
|||
# limitations under the License. |
|||
|
|||
set -o errexit |
|||
set -o pipefail |
|||
|
|||
usage() |
|||
{ |
|||
cat << EOF |
|||
Create self signed certificates |
|||
|
|||
Usage : $(basename $0) -f <config> [-d <ssldir>] |
|||
-h | --help : Show this message |
|||
-f | --config : Openssl configuration file |
|||
-d | --ssldir : Directory where the certificates will be installed |
|||
|
|||
ex : |
|||
$(basename $0) -f openssl.conf -d /srv/ssl |
|||
EOF |
|||
} |
|||
|
|||
# Options parsing |
|||
while (($#)); do |
|||
case "$1" in |
|||
-h | --help) usage; exit 0;; |
|||
-f | --config) CONFIG=${2}; shift 2;; |
|||
-d | --ssldir) SSLDIR="${2}"; shift 2;; |
|||
*) |
|||
usage |
|||
echo "ERROR : Unknown option" |
|||
exit 3 |
|||
;; |
|||
esac |
|||
done |
|||
|
|||
if [ -z ${CONFIG} ]; then |
|||
echo "ERROR: the openssl configuration file is missing. option -f" |
|||
exit 1 |
|||
fi |
|||
if [ -z ${SSLDIR} ]; then |
|||
SSLDIR="/etc/ssl/etcd" |
|||
fi |
|||
|
|||
tmpdir=$(mktemp -d /tmp/etcd_cacert.XXXXXX) |
|||
trap 'rm -rf "${tmpdir}"' EXIT |
|||
cd "${tmpdir}" |
|||
|
|||
mkdir -p "${SSLDIR}" |
|||
|
|||
# Root CA |
|||
openssl genrsa -out ca-key.pem 2048 > /dev/null 2>&1 |
|||
openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem -subj "/CN=etcd-ca" > /dev/null 2>&1 |
|||
|
|||
# ETCD member |
|||
openssl genrsa -out member-key.pem 2048 > /dev/null 2>&1 |
|||
openssl req -new -key member-key.pem -out member.csr -subj "/CN=etcd-member" -config ${CONFIG} > /dev/null 2>&1 |
|||
openssl x509 -req -in member.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out member.pem -days 365 -extensions ssl_client -extfile ${CONFIG} > /dev/null 2>&1 |
|||
|
|||
# Nodes and Admin |
|||
for i in node admin; do |
|||
openssl genrsa -out ${i}-key.pem 2048 > /dev/null 2>&1 |
|||
openssl req -new -key ${i}-key.pem -out ${i}.csr -subj "/CN=kube-${i}" > /dev/null 2>&1 |
|||
openssl x509 -req -in ${i}.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out ${i}.pem -days 365 -extensions ssl_client -extfile ${CONFIG} > /dev/null 2>&1 |
|||
done |
|||
|
|||
# Install certs |
|||
mv *.pem ${SSLDIR}/ |
@ -0,0 +1,36 @@ |
|||
--- |
|||
- name: "Check_certs | check if the certs have already been generated on first master" |
|||
stat: |
|||
path: "{{ etcd_cert_dir }}/ca.pem" |
|||
delegate_to: "{{groups['etcd'][0]}}" |
|||
register: etcdcert_master |
|||
run_once: true |
|||
|
|||
- name: "Check_certs | Set default value for 'sync_certs' and 'gen_certs' to false" |
|||
set_fact: |
|||
sync_certs: false |
|||
gen_certs: false |
|||
|
|||
- name: "Check_certs | Set 'sync_certs' and 'gen_certs' to true" |
|||
set_fact: |
|||
gen_certs: true |
|||
when: not etcdcert_master.stat.exists |
|||
run_once: true |
|||
|
|||
- name: "Check certs | check if a cert already exists" |
|||
stat: |
|||
path: "{{ etcd_cert_dir }}/ca.pem" |
|||
register: etcdcert |
|||
|
|||
- name: "Check_certs | Set 'sync_certs' to true" |
|||
set_fact: |
|||
sync_certs: true |
|||
when: >- |
|||
{%- set certs = {'sync': False} -%} |
|||
{%- for server in play_hosts |
|||
if (not hostvars[server].etcdcert.stat.exists|default(False)) or |
|||
(hostvars[server].etcdcert.stat.checksum|default('') != etcdcert_master.stat.checksum|default('')) -%} |
|||
{%- set _ = certs.update({'sync': True}) -%} |
|||
{%- endfor -%} |
|||
{{ certs.sync }} |
|||
run_once: true |
@ -0,0 +1,111 @@ |
|||
--- |
|||
|
|||
- name: Gen_certs | create etcd script dir |
|||
file: |
|||
path: "{{ etcd_script_dir }}" |
|||
state: directory |
|||
owner: root |
|||
when: inventory_hostname == groups['etcd'][0] |
|||
|
|||
- name: Gen_certs | create etcd cert dir |
|||
file: |
|||
path={{ etcd_cert_dir }} |
|||
group={{ etcd_cert_group }} |
|||
state=directory |
|||
owner=root |
|||
recurse=yes |
|||
|
|||
- name: Gen_certs | write openssl config |
|||
template: |
|||
src: "openssl.conf.j2" |
|||
dest: "{{ etcd_config_dir }}/openssl.conf" |
|||
run_once: yes |
|||
delegate_to: "{{groups['etcd'][0]}}" |
|||
when: gen_certs|default(false) |
|||
|
|||
- name: Gen_certs | copy certs generation script |
|||
copy: |
|||
src: "make-ssl-etcd.sh" |
|||
dest: "{{ etcd_script_dir }}/make-ssl-etcd.sh" |
|||
mode: 0700 |
|||
run_once: yes |
|||
delegate_to: "{{groups['etcd'][0]}}" |
|||
when: gen_certs|default(false) |
|||
|
|||
- name: Gen_certs | run cert generation script |
|||
command: "{{ etcd_script_dir }}/make-ssl-etcd.sh -f {{ etcd_config_dir }}/openssl.conf -d {{ etcd_cert_dir }}" |
|||
run_once: yes |
|||
delegate_to: "{{groups['etcd'][0]}}" |
|||
when: gen_certs|default(false) |
|||
notify: set etcd_secret_changed |
|||
|
|||
- set_fact: |
|||
master_certs: ['ca-key.pem', 'admin.pem', 'admin-key.pem', 'member.pem', 'member-key.pem'] |
|||
node_certs: ['ca.pem', 'node.pem', 'node-key.pem'] |
|||
|
|||
- name: Gen_certs | Gather etcd master certs |
|||
shell: "tar cfz - -C {{ etcd_cert_dir }} {{ master_certs|join(' ') }} {{ node_certs|join(' ') }}| base64 --wrap=0" |
|||
register: etcd_master_cert_data |
|||
delegate_to: "{{groups['etcd'][0]}}" |
|||
run_once: true |
|||
when: sync_certs|default(false) |
|||
notify: set etcd_secret_changed |
|||
|
|||
- name: Gen_certs | Gather etcd node certs |
|||
shell: "tar cfz - -C {{ etcd_cert_dir }} {{ node_certs|join(' ') }} | base64 --wrap=0" |
|||
register: etcd_node_cert_data |
|||
delegate_to: "{{groups['etcd'][0]}}" |
|||
run_once: true |
|||
when: sync_certs|default(false) |
|||
notify: set etcd_secret_changed |
|||
|
|||
- name: Gen_certs | Copy certs on masters |
|||
shell: "echo '{{etcd_master_cert_data.stdout|quote}}' | base64 -d | tar xz -C {{ etcd_cert_dir }}" |
|||
changed_when: false |
|||
when: inventory_hostname in groups['etcd'] and sync_certs|default(false) and |
|||
inventory_hostname != groups['etcd'][0] |
|||
|
|||
- name: Gen_certs | Copy certs on nodes |
|||
shell: "echo '{{etcd_node_cert_data.stdout|quote}}' | base64 -d | tar xz -C {{ etcd_cert_dir }}" |
|||
changed_when: false |
|||
when: inventory_hostname in groups['k8s-cluster'] and sync_certs|default(false) and |
|||
inventory_hostname not in groups['etcd'] |
|||
|
|||
- name: Gen_certs | check certificate permissions |
|||
file: |
|||
path={{ etcd_cert_dir }} |
|||
group={{ etcd_cert_group }} |
|||
state=directory |
|||
owner=kube |
|||
recurse=yes |
|||
|
|||
- name: Gen_certs | set permissions on keys |
|||
shell: chmod 0600 {{ etcd_cert_dir}}/*key.pem |
|||
when: inventory_hostname in groups['etcd'] |
|||
changed_when: false |
|||
|
|||
- name: Gen_certs | target ca-certificates directory |
|||
set_fact: |
|||
ca_cert_dir: |- |
|||
{% if ansible_os_family == "Debian" -%} |
|||
/usr/local/share/ca-certificates |
|||
{%- elif ansible_os_family == "RedHat" -%} |
|||
/etc/pki/ca-trust/source/anchors |
|||
{%- elif ansible_os_family == "CoreOS" -%} |
|||
/etc/ssl/certs |
|||
{%- endif %} |
|||
|
|||
- name: Gen_certs | add CA to trusted CA dir |
|||
copy: |
|||
src: "{{ etcd_cert_dir }}/ca.pem" |
|||
dest: "{{ ca_cert_dir }}/etcd-ca.crt" |
|||
remote_src: true |
|||
register: etcd_ca_cert |
|||
|
|||
- name: Gen_certs | update ca-certificates (Debian/Ubuntu/CoreOS) |
|||
command: update-ca-certificates |
|||
when: etcd_ca_cert.changed and ansible_os_family in ["Debian", "CoreOS"] |
|||
|
|||
- name: Gen_certs | update ca-certificatesa (RedHat) |
|||
command: update-ca-trust extract |
|||
when: etcd_ca_cert.changed and ansible_os_family == "RedHat" |
@ -0,0 +1,34 @@ |
|||
- name: "Pre-upgrade | check for etcd-proxy unit file" |
|||
stat: |
|||
path: /etc/systemd/system/etcd-proxy.service |
|||
register: kube_apiserver_service_file |
|||
|
|||
- name: "Pre-upgrade | check for etcd-proxy init script" |
|||
stat: |
|||
path: /etc/init.d/etcd-proxy |
|||
register: kube_apiserver_init_script |
|||
|
|||
- name: "Pre-upgrade | stop etcd-proxy if service defined" |
|||
service: |
|||
name: etcd-proxy |
|||
state: stopped |
|||
when: (kube_apiserver_service_file.stat.exists|default(False) or kube_apiserver_init_script.stat.exists|default(False)) |
|||
|
|||
- name: "Pre-upgrade | remove etcd-proxy service definition" |
|||
file: |
|||
path: "{{ item }}" |
|||
state: absent |
|||
when: (kube_apiserver_service_file.stat.exists|default(False) or kube_apiserver_init_script.stat.exists|default(False)) |
|||
with_items: |
|||
- /etc/systemd/system/etcd-proxy.service |
|||
- /etc/init.d/etcd-proxy |
|||
|
|||
- name: "Pre-upgrade | find etcd-proxy container" |
|||
command: docker ps -aq --filter "name=etcd-proxy*" |
|||
register: etcd_proxy_container |
|||
ignore_errors: true |
|||
|
|||
- name: "Pre-upgrade | remove etcd-proxy if it exists" |
|||
command: "docker rm -f {{item}}" |
|||
with_items: "{{etcd_proxy_container.stdout_lines}}" |
|||
|
@ -0,0 +1,39 @@ |
|||
[req] |
|||
req_extensions = v3_req |
|||
distinguished_name = req_distinguished_name |
|||
|
|||
[req_distinguished_name] |
|||
|
|||
[ v3_req ] |
|||
basicConstraints = CA:FALSE |
|||
keyUsage = nonRepudiation, digitalSignature, keyEncipherment |
|||
subjectAltName = @alt_names |
|||
|
|||
[ ssl_client ] |
|||
extendedKeyUsage = clientAuth, serverAuth |
|||
basicConstraints = CA:FALSE |
|||
subjectKeyIdentifier=hash |
|||
authorityKeyIdentifier=keyid,issuer |
|||
subjectAltName = @alt_names |
|||
|
|||
[ v3_ca ] |
|||
basicConstraints = CA:TRUE |
|||
keyUsage = nonRepudiation, digitalSignature, keyEncipherment |
|||
subjectAltName = @alt_names |
|||
authorityKeyIdentifier=keyid:always,issuer |
|||
|
|||
[alt_names] |
|||
DNS.1 = localhost |
|||
{% for host in groups['etcd'] %} |
|||
DNS.{{ 1 + loop.index }} = {{ host }} |
|||
{% endfor %} |
|||
{% if loadbalancer_apiserver is defined and apiserver_loadbalancer_domain_name is defined %} |
|||
{% set idx = groups['etcd'] | length | int + 1 %} |
|||
DNS.{{ idx | string }} = {{ apiserver_loadbalancer_domain_name }} |
|||
{% endif %} |
|||
{% for host in groups['etcd'] %} |
|||
IP.{{ 2 * loop.index - 1 }} = {{ hostvars[host]['access_ip'] | default(hostvars[host]['ansible_default_ipv4']['address']) }} |
|||
IP.{{ 2 * loop.index }} = {{ hostvars[host]['ip'] | default(hostvars[host]['ansible_default_ipv4']['address']) }} |
|||
{% endfor %} |
|||
{% set idx = groups['etcd'] | length | int * 2 + 1 %} |
|||
IP.{{ idx }} = 127.0.0.1 |
@ -1 +0,0 @@ |
|||
{ "Network": "{{ kube_pods_subnet }}", "SubnetLen": {{ kube_network_node_prefix }}, "Backend": { "Type": "{{ flannel_backend_type }}" } } |
Write
Preview
Loading…
Cancel
Save