fetch_server_certificates_from_ca.yml 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. ---
  2. - name: Install etcd
  3. package:
  4. name: "etcd{{ '-' + etcd_version if etcd_version is defined else '' }}"
  5. state: present
  6. when: not etcd_is_containerized | bool
  7. - name: Check status of etcd certificates
  8. stat:
  9. path: "{{ item }}"
  10. with_items:
  11. - "{{ etcd_cert_config_dir }}/{{ etcd_cert_prefix }}server.crt"
  12. - "{{ etcd_cert_config_dir }}/{{ etcd_cert_prefix }}peer.crt"
  13. - "{{ etcd_cert_config_dir }}/{{ etcd_cert_prefix }}ca.crt"
  14. - "{{ etcd_system_container_cert_config_dir }}/{{ etcd_cert_prefix }}server.crt"
  15. - "{{ etcd_system_container_cert_config_dir }}/{{ etcd_cert_prefix }}peer.crt"
  16. - "{{ etcd_system_container_cert_config_dir }}/{{ etcd_cert_prefix }}ca.crt"
  17. register: g_etcd_server_cert_stat_result
  18. when: not etcd_certificates_redeploy | default(false) | bool
  19. - set_fact:
  20. etcd_server_certs_missing: "{{ true if etcd_certificates_redeploy | default(false) | bool
  21. else (False in (g_etcd_server_cert_stat_result.results
  22. | default({})
  23. | oo_collect(attribute='stat.exists')
  24. | list)) }}"
  25. - name: Ensure generated_certs directory present
  26. file:
  27. path: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}"
  28. state: directory
  29. mode: 0700
  30. when: etcd_server_certs_missing | bool
  31. delegate_to: "{{ etcd_ca_host }}"
  32. - name: Create the server csr
  33. command: >
  34. openssl req -new -keyout {{ etcd_cert_prefix }}server.key
  35. -config {{ etcd_openssl_conf }}
  36. -out {{ etcd_cert_prefix }}server.csr
  37. -reqexts {{ etcd_req_ext }} -batch -nodes
  38. -subj /CN={{ etcd_hostname }}
  39. args:
  40. chdir: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}"
  41. creates: "{{ etcd_generated_certs_dir ~ '/' ~ etcd_cert_subdir ~ '/'
  42. ~ etcd_cert_prefix ~ 'server.csr' }}"
  43. environment:
  44. SAN: "IP:{{ etcd_ip }},DNS:{{ etcd_hostname }}"
  45. when: etcd_server_certs_missing | bool
  46. delegate_to: "{{ etcd_ca_host }}"
  47. # Certificates must be signed serially in order to avoid competing
  48. # for the serial file.
  49. - name: Sign and create the server crt
  50. delegated_serial_command:
  51. command: >
  52. openssl ca -name {{ etcd_ca_name }} -config {{ etcd_openssl_conf }}
  53. -out {{ etcd_cert_prefix }}server.crt
  54. -in {{ etcd_cert_prefix }}server.csr
  55. -extensions {{ etcd_ca_exts_server }} -batch
  56. chdir: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}"
  57. creates: "{{ etcd_generated_certs_dir ~ '/' ~ etcd_cert_subdir ~ '/'
  58. ~ etcd_cert_prefix ~ 'server.crt' }}"
  59. environment:
  60. SAN: "IP:{{ etcd_ip }}"
  61. when: etcd_server_certs_missing | bool
  62. delegate_to: "{{ etcd_ca_host }}"
  63. - name: Create the peer csr
  64. command: >
  65. openssl req -new -keyout {{ etcd_cert_prefix }}peer.key
  66. -config {{ etcd_openssl_conf }}
  67. -out {{ etcd_cert_prefix }}peer.csr
  68. -reqexts {{ etcd_req_ext }} -batch -nodes
  69. -subj /CN={{ etcd_hostname }}
  70. args:
  71. chdir: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}"
  72. creates: "{{ etcd_generated_certs_dir ~ '/' ~ etcd_cert_subdir ~ '/'
  73. ~ etcd_cert_prefix ~ 'peer.csr' }}"
  74. environment:
  75. SAN: "IP:{{ etcd_ip }},DNS:{{ etcd_hostname }}"
  76. when: etcd_server_certs_missing | bool
  77. delegate_to: "{{ etcd_ca_host }}"
  78. # Certificates must be signed serially in order to avoid competing
  79. # for the serial file.
  80. - name: Sign and create the peer crt
  81. delegated_serial_command:
  82. command: >
  83. openssl ca -name {{ etcd_ca_name }} -config {{ etcd_openssl_conf }}
  84. -out {{ etcd_cert_prefix }}peer.crt
  85. -in {{ etcd_cert_prefix }}peer.csr
  86. -extensions {{ etcd_ca_exts_peer }} -batch
  87. chdir: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}"
  88. creates: "{{ etcd_generated_certs_dir ~ '/' ~ etcd_cert_subdir ~ '/'
  89. ~ etcd_cert_prefix ~ 'peer.crt' }}"
  90. environment:
  91. SAN: "IP:{{ etcd_ip }}"
  92. when: etcd_server_certs_missing | bool
  93. delegate_to: "{{ etcd_ca_host }}"
  94. - file:
  95. src: "{{ etcd_ca_cert }}"
  96. dest: "{{ etcd_generated_certs_dir}}/{{ etcd_cert_subdir }}/{{ etcd_cert_prefix }}ca.crt"
  97. state: hard
  98. when: etcd_server_certs_missing | bool
  99. delegate_to: "{{ etcd_ca_host }}"
  100. - name: Create local temp directory for syncing certs
  101. local_action: command mktemp -d /tmp/etcd_certificates-XXXXXXX
  102. become: no
  103. register: g_etcd_server_mktemp
  104. changed_when: False
  105. when: etcd_server_certs_missing | bool
  106. - name: Create a tarball of the etcd certs
  107. command: >
  108. tar -czvf {{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}.tgz
  109. -C {{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }} .
  110. args:
  111. creates: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}.tgz"
  112. # Disables the following warning:
  113. # Consider using unarchive module rather than running tar
  114. warn: no
  115. when: etcd_server_certs_missing | bool
  116. delegate_to: "{{ etcd_ca_host }}"
  117. - name: Retrieve etcd cert tarball
  118. fetch:
  119. src: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}.tgz"
  120. dest: "{{ g_etcd_server_mktemp.stdout }}/"
  121. flat: yes
  122. fail_on_missing: yes
  123. validate_checksum: yes
  124. when: etcd_server_certs_missing | bool
  125. delegate_to: "{{ etcd_ca_host }}"
  126. - name: Ensure certificate directory exists
  127. file:
  128. path: "{{ item }}"
  129. state: directory
  130. with_items:
  131. - "{{ etcd_cert_config_dir }}"
  132. - "{{ etcd_system_container_cert_config_dir }}"
  133. when: etcd_server_certs_missing | bool
  134. - name: Unarchive cert tarball
  135. unarchive:
  136. src: "{{ g_etcd_server_mktemp.stdout }}/{{ etcd_cert_subdir }}.tgz"
  137. dest: "{{ etcd_cert_config_dir }}"
  138. when: etcd_server_certs_missing | bool
  139. - name: Create a tarball of the etcd ca certs
  140. command: >
  141. tar -czvf {{ etcd_generated_certs_dir }}/{{ etcd_ca_name }}.tgz
  142. -C {{ etcd_ca_dir }} .
  143. args:
  144. creates: "{{ etcd_generated_certs_dir }}/{{ etcd_ca_name }}.tgz"
  145. warn: no
  146. when: etcd_server_certs_missing | bool
  147. delegate_to: "{{ etcd_ca_host }}"
  148. - name: Retrieve etcd ca cert tarball
  149. fetch:
  150. src: "{{ etcd_generated_certs_dir }}/{{ etcd_ca_name }}.tgz"
  151. dest: "{{ g_etcd_server_mktemp.stdout }}/"
  152. flat: yes
  153. fail_on_missing: yes
  154. validate_checksum: yes
  155. when: etcd_server_certs_missing | bool
  156. delegate_to: "{{ etcd_ca_host }}"
  157. - name: Ensure ca directory exists
  158. file:
  159. path: "{{ item }}"
  160. state: directory
  161. with_items:
  162. - "{{ etcd_ca_dir }}"
  163. - "{{ etcd_system_container_cert_config_dir }}/ca"
  164. when: etcd_server_certs_missing | bool
  165. - name: Unarchive cert tarball for the system container
  166. unarchive:
  167. src: "{{ g_etcd_server_mktemp.stdout }}/{{ etcd_cert_subdir }}.tgz"
  168. dest: "{{ etcd_system_container_cert_config_dir }}"
  169. when:
  170. - etcd_server_certs_missing | bool
  171. - r_etcd_common_etcd_runtime == 'runc'
  172. - name: Unarchive etcd ca cert tarballs for the system container
  173. unarchive:
  174. src: "{{ g_etcd_server_mktemp.stdout }}/{{ etcd_ca_name }}.tgz"
  175. dest: "{{ etcd_system_container_cert_config_dir }}/ca"
  176. when:
  177. - etcd_server_certs_missing | bool
  178. - r_etcd_common_etcd_runtime == 'runc'
  179. - name: Delete temporary directory
  180. local_action: file path="{{ g_etcd_server_mktemp.stdout }}" state=absent
  181. become: no
  182. changed_when: False
  183. when: etcd_server_certs_missing | bool
  184. - name: Validate permissions on certificate files
  185. file:
  186. path: "{{ item }}"
  187. mode: 0600
  188. owner: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  189. group: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  190. when: etcd_url_scheme == 'https'
  191. with_items:
  192. - "{{ etcd_ca_file }}"
  193. - "{{ etcd_cert_file }}"
  194. - "{{ etcd_key_file }}"
  195. - name: Validate permissions on peer certificate files
  196. file:
  197. path: "{{ item }}"
  198. mode: 0600
  199. owner: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  200. group: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  201. when: etcd_peer_url_scheme == 'https'
  202. with_items:
  203. - "{{ etcd_peer_ca_file }}"
  204. - "{{ etcd_peer_cert_file }}"
  205. - "{{ etcd_peer_key_file }}"
  206. - name: Validate permissions on the config dir
  207. file:
  208. path: "{{ etcd_conf_dir }}"
  209. state: directory
  210. owner: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  211. group: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  212. mode: 0700