main.yml 7.3 KB

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