You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
7.1 KiB

  1. ---
  2. - name: "Gen_certs | Create kubernetes config directory (on {{groups['kube-master'][0]}})"
  3. file:
  4. path: "{{ kube_config_dir }}"
  5. state: directory
  6. owner: kube
  7. run_once: yes
  8. delegate_to: "{{groups['kube-master'][0]}}"
  9. tags: [kubelet, k8s-secrets, kube-controller-manager, kube-apiserver, bootstrap-os, apps, network, master, node]
  10. when: gen_certs|default(false)
  11. - name: "Gen_certs | Create kubernetes script directory (on {{groups['kube-master'][0]}})"
  12. file:
  13. path: "{{ kube_script_dir }}"
  14. state: directory
  15. owner: kube
  16. run_once: yes
  17. delegate_to: "{{groups['kube-master'][0]}}"
  18. tags: [k8s-secrets, bootstrap-os]
  19. when: gen_certs|default(false)
  20. - name: Gen_certs | write openssl config
  21. template:
  22. src: "openssl.conf.j2"
  23. dest: "{{ kube_config_dir }}/openssl.conf"
  24. run_once: yes
  25. delegate_to: "{{groups['kube-master'][0]}}"
  26. when: gen_certs|default(false)
  27. - name: Gen_certs | copy certs generation script
  28. copy:
  29. src: "make-ssl.sh"
  30. dest: "{{ kube_script_dir }}/make-ssl.sh"
  31. mode: 0700
  32. run_once: yes
  33. delegate_to: "{{groups['kube-master'][0]}}"
  34. when: gen_certs|default(false)
  35. - name: Gen_certs | run cert generation script
  36. command: "{{ kube_script_dir }}/make-ssl.sh -f {{ kube_config_dir }}/openssl.conf -d {{ kube_cert_dir }}"
  37. environment:
  38. - MASTERS: "{% for m in groups['kube-master'] %}
  39. {% if gen_node_certs[m]|default(false) %}
  40. {{ m }}
  41. {% endif %}
  42. {% endfor %}"
  43. - HOSTS: "{% for h in groups['k8s-cluster'] %}
  44. {% if gen_node_certs[h]|default(true) %}
  45. {{ h }}
  46. {% endif %}
  47. {% endfor %}"
  48. run_once: yes
  49. delegate_to: "{{groups['kube-master'][0]}}"
  50. when: gen_certs|default(false)
  51. notify: set secret_changed
  52. - set_fact:
  53. all_master_certs: "['ca-key.pem',
  54. 'apiserver.pem',
  55. 'apiserver-key.pem',
  56. 'kube-scheduler.pem',
  57. 'kube-scheduler-key.pem',
  58. 'kube-controller-manager.pem',
  59. 'kube-controller-manager-key.pem',
  60. {% for node in groups['kube-master'] %}
  61. 'admin-{{ node }}.pem',
  62. 'admin-{{ node }}-key.pem',
  63. {% endfor %}]"
  64. my_master_certs: ['ca-key.pem',
  65. 'admin-{{ inventory_hostname }}.pem',
  66. 'admin-{{ inventory_hostname }}-key.pem',
  67. 'apiserver.pem',
  68. 'apiserver-key.pem',
  69. 'kube-scheduler.pem',
  70. 'kube-scheduler-key.pem',
  71. 'kube-controller-manager.pem',
  72. 'kube-controller-manager-key.pem',
  73. ]
  74. all_node_certs: "['ca.pem',
  75. {% for node in groups['k8s-cluster'] %}
  76. 'node-{{ node }}.pem',
  77. 'node-{{ node }}-key.pem',
  78. 'kube-proxy-{{ node }}.pem',
  79. 'kube-proxy-{{ node }}-key.pem',
  80. {% endfor %}]"
  81. my_node_certs: ['ca.pem',
  82. 'node-{{ inventory_hostname }}.pem',
  83. 'node-{{ inventory_hostname }}-key.pem',
  84. 'kube-proxy-{{ inventory_hostname }}.pem',
  85. 'kube-proxy-{{ inventory_hostname }}-key.pem',
  86. ]
  87. tags: facts
  88. - name: Gen_certs | Gather master certs
  89. shell: "tar cfz - -C {{ kube_cert_dir }} -T /dev/stdin <<< {{ my_master_certs|join(' ') }} {{ all_node_certs|join(' ') }} | base64 --wrap=0"
  90. args:
  91. executable: /bin/bash
  92. no_log: true
  93. register: master_cert_data
  94. check_mode: no
  95. delegate_to: "{{groups['kube-master'][0]}}"
  96. when: inventory_hostname in groups['kube-master'] and sync_certs|default(false) and
  97. inventory_hostname != groups['kube-master'][0]
  98. - name: Gen_certs | Gather node certs
  99. shell: "tar cfz - -C {{ kube_cert_dir }} -T /dev/stdin <<< {{ my_node_certs|join(' ') }} | base64 --wrap=0"
  100. args:
  101. executable: /bin/bash
  102. no_log: true
  103. register: node_cert_data
  104. check_mode: no
  105. delegate_to: "{{groups['kube-master'][0]}}"
  106. when: inventory_hostname in groups['kube-node'] and
  107. sync_certs|default(false) and
  108. inventory_hostname != groups['kube-master'][0]
  109. #NOTE(mattymo): Use temporary file to copy master certs because we have a ~200k
  110. #char limit when using shell command
  111. #FIXME(mattymo): Use tempfile module in ansible 2.3
  112. - name: Gen_certs | Prepare tempfile for unpacking certs
  113. shell: mktemp /tmp/certsXXXXX.tar.gz
  114. register: cert_tempfile
  115. when: inventory_hostname in groups['kube-master'] and sync_certs|default(false) and
  116. inventory_hostname != groups['kube-master'][0]
  117. - name: Gen_certs | Write master certs to tempfile
  118. copy:
  119. content: "{{master_cert_data.stdout}}"
  120. dest: "{{cert_tempfile.stdout}}"
  121. owner: root
  122. mode: "0600"
  123. when: inventory_hostname in groups['kube-master'] and sync_certs|default(false) and
  124. inventory_hostname != groups['kube-master'][0]
  125. - name: Gen_certs | Unpack certs on masters
  126. shell: "base64 -d < {{ cert_tempfile.stdout }} | tar xz -C {{ kube_cert_dir }}"
  127. no_log: true
  128. changed_when: false
  129. check_mode: no
  130. when: inventory_hostname in groups['kube-master'] and sync_certs|default(false) and
  131. inventory_hostname != groups['kube-master'][0]
  132. notify: set secret_changed
  133. - name: Gen_certs | Cleanup tempfile
  134. file:
  135. path: "{{cert_tempfile.stdout}}"
  136. state: absent
  137. when: inventory_hostname in groups['kube-master'] and sync_certs|default(false) and
  138. inventory_hostname != groups['kube-master'][0]
  139. - name: Gen_certs | Copy certs on nodes
  140. shell: "base64 -d <<< '{{node_cert_data.stdout|quote}}' | tar xz -C {{ kube_cert_dir }}"
  141. args:
  142. executable: /bin/bash
  143. no_log: true
  144. changed_when: false
  145. check_mode: no
  146. when: inventory_hostname in groups['kube-node'] and
  147. sync_certs|default(false) and
  148. inventory_hostname != groups['kube-master'][0]
  149. notify: set secret_changed
  150. - name: Gen_certs | check certificate permissions
  151. file:
  152. path: "{{ kube_cert_dir }}"
  153. group: "{{ kube_cert_group }}"
  154. owner: kube
  155. mode: "u=rwX,g-rwx,o-rwx"
  156. recurse: yes
  157. - name: Gen_certs | target ca-certificates path
  158. set_fact:
  159. ca_cert_path: |-
  160. {% if ansible_os_family == "Debian" -%}
  161. /usr/local/share/ca-certificates/kube-ca.crt
  162. {%- elif ansible_os_family == "RedHat" -%}
  163. /etc/pki/ca-trust/source/anchors/kube-ca.crt
  164. {%- elif ansible_os_family in ["CoreOS", "Container Linux by CoreOS"] -%}
  165. /etc/ssl/certs/kube-ca.pem
  166. {%- endif %}
  167. tags: facts
  168. - name: Gen_certs | add CA to trusted CA dir
  169. copy:
  170. src: "{{ kube_cert_dir }}/ca.pem"
  171. dest: "{{ ca_cert_path }}"
  172. remote_src: true
  173. register: kube_ca_cert
  174. - name: Gen_certs | update ca-certificates (Debian/Ubuntu/Container Linux by CoreOS)
  175. command: update-ca-certificates
  176. when: kube_ca_cert.changed and ansible_os_family in ["Debian", "CoreOS", "Container Linux by CoreOS"]
  177. - name: Gen_certs | update ca-certificates (RedHat)
  178. command: update-ca-trust extract
  179. when: kube_ca_cert.changed and ansible_os_family == "RedHat"