main.yml 8.1 KB

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