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.

199 lines
7.6 KiB

6 years ago
6 years ago
6 years ago
  1. ---
  2. - name: Install OIDC certificate
  3. copy:
  4. content: "{{ kube_oidc_ca_cert | b64decode }}"
  5. dest: "{{ kube_oidc_ca_file }}"
  6. owner: root
  7. group: root
  8. mode: "0644"
  9. when:
  10. - kube_oidc_auth
  11. - kube_oidc_ca_cert is defined
  12. - name: kubeadm | Check if kubeadm has already run
  13. stat:
  14. path: "/var/lib/kubelet/config.yaml"
  15. get_attributes: no
  16. get_checksum: no
  17. get_mime: no
  18. register: kubeadm_already_run
  19. - name: kubeadm | Backup kubeadm certs / kubeconfig
  20. import_tasks: kubeadm-backup.yml
  21. when:
  22. - kubeadm_already_run.stat.exists
  23. - name: kubeadm | aggregate all SANs
  24. set_fact:
  25. apiserver_sans: "{{ (sans_base + groups['kube_control_plane'] + sans_lb + sans_lb_ip + sans_supp + sans_access_ip + sans_ip + sans_address + sans_override + sans_hostname + sans_fqdn) | unique }}"
  26. vars:
  27. sans_base:
  28. - "kubernetes"
  29. - "kubernetes.default"
  30. - "kubernetes.default.svc"
  31. - "kubernetes.default.svc.{{ dns_domain }}"
  32. - "{{ kube_apiserver_ip }}"
  33. - "localhost"
  34. - "127.0.0.1"
  35. sans_lb: "{{ [apiserver_loadbalancer_domain_name] if apiserver_loadbalancer_domain_name is defined else [] }}"
  36. sans_lb_ip: "{{ [loadbalancer_apiserver.address] if loadbalancer_apiserver is defined and loadbalancer_apiserver.address is defined else [] }}"
  37. sans_supp: "{{ supplementary_addresses_in_ssl_keys if supplementary_addresses_in_ssl_keys is defined else [] }}"
  38. sans_access_ip: "{{ groups['kube_control_plane'] | map('extract', hostvars, 'access_ip') | list | select('defined') | list }}"
  39. sans_ip: "{{ groups['kube_control_plane'] | map('extract', hostvars, 'ip') | list | select('defined') | list }}"
  40. sans_address: "{{ groups['kube_control_plane'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list | select('defined') | list }}"
  41. sans_override: "{{ [kube_override_hostname] if kube_override_hostname else [] }}"
  42. sans_hostname: "{{ groups['kube_control_plane'] | map('extract', hostvars, ['ansible_hostname']) | list | select('defined') | list }}"
  43. sans_fqdn: "{{ groups['kube_control_plane'] | map('extract', hostvars, ['ansible_fqdn']) | list | select('defined') | list }}"
  44. tags: facts
  45. - name: Create audit-policy directory
  46. file:
  47. path: "{{ audit_policy_file | dirname }}"
  48. state: directory
  49. mode: 0640
  50. when: kubernetes_audit|default(false) or kubernetes_audit_webhook|default(false)
  51. - name: Write api audit policy yaml
  52. template:
  53. src: apiserver-audit-policy.yaml.j2
  54. dest: "{{ audit_policy_file }}"
  55. mode: 0640
  56. when: kubernetes_audit|default(false) or kubernetes_audit_webhook|default(false)
  57. - name: Write api audit webhook config yaml
  58. template:
  59. src: apiserver-audit-webhook-config.yaml.j2
  60. dest: "{{ audit_webhook_config_file }}"
  61. mode: 0640
  62. when: kubernetes_audit_webhook|default(false)
  63. # Nginx LB(default), If kubeadm_config_api_fqdn is defined, use other LB by kubeadm controlPlaneEndpoint.
  64. - name: set kubeadm_config_api_fqdn define
  65. set_fact:
  66. kubeadm_config_api_fqdn: "{{ apiserver_loadbalancer_domain_name|default('lb-apiserver.kubernetes.local') }}"
  67. when: loadbalancer_apiserver is defined
  68. - name: Set kubeadm api version to v1beta2
  69. set_fact:
  70. kubeadmConfig_api_version: v1beta2
  71. - name: kubeadm | Create kubeadm config
  72. template:
  73. src: "kubeadm-config.{{ kubeadmConfig_api_version }}.yaml.j2"
  74. dest: "{{ kube_config_dir }}/kubeadm-config.yaml"
  75. mode: 0640
  76. - name: kubeadm | Check if apiserver.crt contains all needed SANs
  77. shell: |
  78. set -o pipefail
  79. for IP in {{ apiserver_ips | join(' ') }}; do
  80. openssl x509 -noout -in "{{ kube_cert_dir }}/apiserver.crt" -checkip $IP | grep -q 'does match certificate' || echo 'NEED-RENEW'
  81. done
  82. for HOST in {{ apiserver_hosts | join(' ') }}; do
  83. openssl x509 -noout -in "{{ kube_cert_dir }}/apiserver.crt" -checkhost $HOST | grep -q 'does match certificate' || echo 'NEED-RENEW'
  84. done
  85. vars:
  86. apiserver_ips: "{{ apiserver_sans|map('ipaddr')|reject('equalto', False)|list }}"
  87. apiserver_hosts: "{{ apiserver_sans|difference(apiserver_ips) }}"
  88. args:
  89. executable: /bin/bash
  90. register: apiserver_sans_check
  91. changed_when: "'NEED-RENEW' in apiserver_sans_check.stdout"
  92. when:
  93. - kubeadm_already_run.stat.exists
  94. - name: kubeadm | regenerate apiserver cert 1/2
  95. file:
  96. state: absent
  97. path: "{{ kube_cert_dir }}/{{ item }}"
  98. with_items:
  99. - apiserver.crt
  100. - apiserver.key
  101. when:
  102. - kubeadm_already_run.stat.exists
  103. - apiserver_sans_check.changed
  104. - name: kubeadm | regenerate apiserver cert 2/2
  105. command: >-
  106. {{ bin_dir }}/kubeadm
  107. init phase certs apiserver
  108. --config={{ kube_config_dir }}/kubeadm-config.yaml
  109. when:
  110. - kubeadm_already_run.stat.exists
  111. - apiserver_sans_check.changed
  112. - name: kubeadm | Initialize first master
  113. command: >-
  114. timeout -k 300s 300s
  115. {{ bin_dir }}/kubeadm init
  116. --config={{ kube_config_dir }}/kubeadm-config.yaml
  117. --ignore-preflight-errors=all
  118. --skip-phases={{ kubeadm_init_phases_skip | join(',') }}
  119. --upload-certs
  120. register: kubeadm_init
  121. # Retry is because upload config sometimes fails
  122. retries: 3
  123. until: kubeadm_init is succeeded or "field is immutable" in kubeadm_init.stderr
  124. when: inventory_hostname == groups['kube_control_plane']|first and not kubeadm_already_run.stat.exists
  125. failed_when: kubeadm_init.rc != 0 and "field is immutable" not in kubeadm_init.stderr
  126. environment:
  127. PATH: "{{ bin_dir }}:{{ ansible_env.PATH }}"
  128. notify: Master | restart kubelet
  129. - name: set kubeadm certificate key
  130. set_fact:
  131. kubeadm_certificate_key: "{{ item | regex_search('--certificate-key ([^ ]+)','\\1') | first }}"
  132. with_items: "{{ hostvars[groups['kube_control_plane'][0]]['kubeadm_init'].stdout_lines | default([]) }}"
  133. when:
  134. - kubeadm_certificate_key is not defined
  135. - (item | trim) is match('.*--certificate-key.*')
  136. - name: Create hardcoded kubeadm token for joining nodes with 24h expiration (if defined)
  137. shell: >-
  138. {{ bin_dir }}/kubeadm --kubeconfig /etc/kubernetes/admin.conf token delete {{ kubeadm_token }} || :;
  139. {{ bin_dir }}/kubeadm --kubeconfig /etc/kubernetes/admin.conf token create {{ kubeadm_token }}
  140. changed_when: false
  141. when:
  142. - inventory_hostname == groups['kube_control_plane']|first
  143. - kubeadm_token is defined
  144. - kubeadm_refresh_token
  145. tags:
  146. - kubeadm_token
  147. - name: Create kubeadm token for joining nodes with 24h expiration (default)
  148. command: "{{ bin_dir }}/kubeadm --kubeconfig /etc/kubernetes/admin.conf token create"
  149. changed_when: false
  150. register: temp_token
  151. retries: 5
  152. delay: 5
  153. until: temp_token is succeeded
  154. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  155. when: kubeadm_token is not defined
  156. tags:
  157. - kubeadm_token
  158. - name: Set kubeadm_token
  159. set_fact:
  160. kubeadm_token: "{{ temp_token.stdout }}"
  161. when: temp_token.stdout is defined
  162. tags:
  163. - kubeadm_token
  164. - name: kubeadm | Join other masters
  165. include_tasks: kubeadm-secondary.yml
  166. - name: kubeadm | upgrade kubernetes cluster
  167. include_tasks: kubeadm-upgrade.yml
  168. when:
  169. - upgrade_cluster_setup
  170. - kubeadm_already_run.stat.exists
  171. # FIXME(mattymo): from docs: If you don't want to taint your control-plane node, set this field to an empty slice, i.e. `taints: {}` in the YAML file.
  172. - name: kubeadm | Remove taint for master with node role
  173. command: "{{ bin_dir }}/kubectl --kubeconfig {{ kube_config_dir }}/admin.conf taint node {{ inventory_hostname }} {{ item }}"
  174. delegate_to: "{{ groups['kube_control_plane'] | first }}"
  175. with_items:
  176. - "node-role.kubernetes.io/master:NoSchedule-"
  177. - "node-role.kubernetes.io/control-plane:NoSchedule-"
  178. when: inventory_hostname in groups['kube_node']
  179. failed_when: false