main.yml 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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: "{{ 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 }},DNS:{{ etcd_hostname }}"
  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 }},DNS:{{ etcd_hostname }}"
  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. - name: Create a tarball of the etcd certs
  102. command: >
  103. tar -czvf {{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}.tgz
  104. -C {{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }} .
  105. args:
  106. creates: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}.tgz"
  107. # Disables the following warning:
  108. # Consider using unarchive module rather than running tar
  109. warn: no
  110. when: etcd_server_certs_missing | bool
  111. delegate_to: "{{ etcd_ca_host }}"
  112. - name: Retrieve etcd cert tarball
  113. fetch:
  114. src: "{{ etcd_generated_certs_dir }}/{{ etcd_cert_subdir }}.tgz"
  115. dest: "{{ g_etcd_server_mktemp.stdout }}/"
  116. flat: yes
  117. fail_on_missing: yes
  118. validate_checksum: yes
  119. when: etcd_server_certs_missing | bool
  120. delegate_to: "{{ etcd_ca_host }}"
  121. - name: Ensure certificate directory exists
  122. file:
  123. path: "{{ etcd_cert_config_dir }}"
  124. state: directory
  125. when: etcd_server_certs_missing | bool
  126. - name: Unarchive cert tarball
  127. unarchive:
  128. src: "{{ g_etcd_server_mktemp.stdout }}/{{ etcd_cert_subdir }}.tgz"
  129. dest: "{{ etcd_cert_config_dir }}"
  130. when: etcd_server_certs_missing | bool
  131. - name: Create a tarball of the etcd ca certs
  132. command: >
  133. tar -czvf {{ etcd_generated_certs_dir }}/{{ etcd_ca_name }}.tgz
  134. -C {{ etcd_ca_dir }} .
  135. args:
  136. creates: "{{ etcd_generated_certs_dir }}/{{ etcd_ca_name }}.tgz"
  137. warn: no
  138. when: etcd_server_certs_missing | bool
  139. delegate_to: "{{ etcd_ca_host }}"
  140. - name: Retrieve etcd ca cert tarball
  141. fetch:
  142. src: "{{ etcd_generated_certs_dir }}/{{ etcd_ca_name }}.tgz"
  143. dest: "{{ g_etcd_server_mktemp.stdout }}/"
  144. flat: yes
  145. fail_on_missing: yes
  146. validate_checksum: yes
  147. when: etcd_server_certs_missing | bool
  148. delegate_to: "{{ etcd_ca_host }}"
  149. - name: Ensure ca directory exists
  150. file:
  151. path: "{{ etcd_ca_dir }}"
  152. state: directory
  153. when: etcd_server_certs_missing | bool
  154. - name: Unarchive etcd ca cert tarballs
  155. unarchive:
  156. src: "{{ g_etcd_server_mktemp.stdout }}/{{ etcd_ca_name }}.tgz"
  157. dest: "{{ etcd_ca_dir }}"
  158. when: etcd_server_certs_missing | bool
  159. - name: Delete temporary directory
  160. local_action: file path="{{ g_etcd_server_mktemp.stdout }}" state=absent
  161. become: no
  162. changed_when: False
  163. when: etcd_server_certs_missing | bool
  164. - name: Validate permissions on certificate files
  165. file:
  166. path: "{{ item }}"
  167. mode: 0600
  168. owner: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  169. group: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  170. when: etcd_url_scheme == 'https'
  171. with_items:
  172. - "{{ etcd_ca_file }}"
  173. - "{{ etcd_cert_file }}"
  174. - "{{ etcd_key_file }}"
  175. - name: Validate permissions on peer certificate files
  176. file:
  177. path: "{{ item }}"
  178. mode: 0600
  179. owner: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  180. group: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  181. when: etcd_peer_url_scheme == 'https'
  182. with_items:
  183. - "{{ etcd_peer_ca_file }}"
  184. - "{{ etcd_peer_cert_file }}"
  185. - "{{ etcd_peer_key_file }}"
  186. - name: Validate permissions on the config dir
  187. file:
  188. path: "{{ etcd_conf_dir }}"
  189. state: directory
  190. owner: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  191. group: "{{ 'etcd' if not etcd_is_containerized | bool else omit }}"
  192. mode: 0700