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.

145 lines
7.2 KiB

  1. ---
  2. - name: "Check_certs | Register certs that have already been generated on first etcd node"
  3. find:
  4. paths: "{{ etcd_cert_dir }}"
  5. patterns: "ca.pem,node*.pem,member*.pem,admin*.pem"
  6. get_checksum: true
  7. delegate_to: "{{ groups['etcd'][0] }}"
  8. register: etcdcert_master
  9. run_once: true
  10. - name: "Check_certs | Set default value for 'sync_certs', 'gen_certs' and 'etcd_secret_changed' to false"
  11. set_fact:
  12. sync_certs: false
  13. gen_certs: false
  14. etcd_secret_changed: false
  15. - name: "Check certs | Register ca and etcd admin/member certs on etcd hosts"
  16. stat:
  17. path: "{{ etcd_cert_dir }}/{{ item }}"
  18. get_attributes: no
  19. get_checksum: yes
  20. get_mime: no
  21. register: etcd_member_certs
  22. when: inventory_hostname in groups['etcd']
  23. with_items:
  24. - ca.pem
  25. - member-{{ inventory_hostname }}.pem
  26. - member-{{ inventory_hostname }}-key.pem
  27. - admin-{{ inventory_hostname }}.pem
  28. - admin-{{ inventory_hostname }}-key.pem
  29. - name: "Check certs | Register ca and etcd node certs on kubernetes hosts"
  30. stat:
  31. path: "{{ etcd_cert_dir }}/{{ item }}"
  32. register: etcd_node_certs
  33. when: (('calico-rr' in groups and inventory_hostname in groups['calico-rr']) or
  34. inventory_hostname in groups['k8s-cluster'])
  35. with_items:
  36. - ca.pem
  37. - node-{{ inventory_hostname }}.pem
  38. - node-{{ inventory_hostname }}-key.pem
  39. - name: "Check_certs | Set 'gen_certs' to true if expected certificates are not on the first etcd node"
  40. set_fact:
  41. gen_certs: true
  42. when: force_etcd_cert_refresh or not item in etcdcert_master.files|map(attribute='path') | list
  43. run_once: true
  44. with_items: "{{ expected_files }}"
  45. vars:
  46. expected_files: >-
  47. ['{{ etcd_cert_dir }}/ca.pem',
  48. {% set etcd_members = groups['etcd'] %}
  49. {% for host in etcd_members %}
  50. '{{ etcd_cert_dir }}/admin-{{ host }}.pem',
  51. '{{ etcd_cert_dir }}/admin-{{ host }}-key.pem',
  52. '{{ etcd_cert_dir }}/member-{{ host }}.pem',
  53. '{{ etcd_cert_dir }}/member-{{ host }}-key.pem',
  54. {% endfor %}
  55. {% set k8s_nodes = groups['k8s-cluster']|union(groups['calico-rr']|default([]))|unique|sort %}
  56. {% for host in k8s_nodes %}
  57. '{{ etcd_cert_dir }}/node-{{ host }}.pem',
  58. '{{ etcd_cert_dir }}/node-{{ host }}-key.pem'
  59. {% if not loop.last %}{{','}}{% endif %}
  60. {% endfor %}]
  61. - name: "Check_certs | Set 'gen_master_certs' object to track whether member and admin certs exist on first etcd node"
  62. set_fact:
  63. gen_master_certs: |-
  64. {
  65. {% set etcd_members = groups['etcd'] -%}
  66. {% set existing_certs = etcdcert_master.files|map(attribute='path')|list|sort %}
  67. {% for host in etcd_members -%}
  68. {% set member_cert = "%s/member-%s.pem"|format(etcd_cert_dir, host) %}
  69. {% set member_key = "%s/member-%s-key.pem"|format(etcd_cert_dir, host) %}
  70. {% set admin_cert = "%s/admin-%s.pem"|format(etcd_cert_dir, host) %}
  71. {% set admin_key = "%s/admin-%s-key.pem"|format(etcd_cert_dir, host) %}
  72. {% if force_etcd_cert_refresh -%}
  73. "{{ host }}": True,
  74. {% elif member_cert in existing_certs and member_key in existing_certs and admin_cert in existing_certs and admin_key in existing_certs -%}
  75. "{{ host }}": False,
  76. {% else -%}
  77. "{{ host }}": True,
  78. {% endif -%}
  79. {% endfor %}
  80. }
  81. run_once: true
  82. - name: "Check_certs | Set 'gen_node_certs' object to track whether node certs exist on first etcd node"
  83. set_fact:
  84. gen_node_certs: |-
  85. {
  86. {% set k8s_nodes = groups['k8s-cluster']|union(groups['calico-rr']|default([]))|unique|sort -%}
  87. {% set existing_certs = etcdcert_master.files|map(attribute='path')|list|sort %}
  88. {% for host in k8s_nodes -%}
  89. {% set host_cert = "%s/node-%s.pem"|format(etcd_cert_dir, host) %}
  90. {% set host_key = "%s/node-%s-key.pem"|format(etcd_cert_dir, host) %}
  91. {% if force_etcd_cert_refresh -%}
  92. "{{ host }}": True,
  93. {% elif host_cert in existing_certs and host_key in existing_certs -%}
  94. "{{ host }}": False,
  95. {% else -%}
  96. "{{ host }}": True,
  97. {% endif -%}
  98. {% endfor %}
  99. }
  100. run_once: true
  101. - name: "Check_certs | Set 'etcd_member_requires_sync' to true if ca or member/admin cert and key don't exist on etcd member or checksum doesn't match"
  102. set_fact:
  103. etcd_member_requires_sync: true
  104. when:
  105. - inventory_hostname in groups['etcd']
  106. - (not etcd_member_certs.results[0].stat.exists|default(false)) or
  107. (not etcd_member_certs.results[1].stat.exists|default(false)) or
  108. (not etcd_member_certs.results[2].stat.exists|default(false)) or
  109. (not etcd_member_certs.results[3].stat.exists|default(false)) or
  110. (not etcd_member_certs.results[4].stat.exists|default(false)) or
  111. (etcd_member_certs.results[0].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_member_certs.results[0].stat.path)|map(attribute="checksum")|first|default('')) or
  112. (etcd_member_certs.results[1].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_member_certs.results[1].stat.path)|map(attribute="checksum")|first|default('')) or
  113. (etcd_member_certs.results[2].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_member_certs.results[2].stat.path)|map(attribute="checksum")|first|default('')) or
  114. (etcd_member_certs.results[3].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_member_certs.results[3].stat.path)|map(attribute="checksum")|first|default('')) or
  115. (etcd_member_certs.results[4].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_member_certs.results[4].stat.path)|map(attribute="checksum")|first|default(''))
  116. - name: "Check_certs | Set 'kubernetes_host_requires_sync' to true if ca or node cert and key don't exist on kubernetes host or checksum doesn't match"
  117. set_fact:
  118. kubernetes_host_requires_sync: true
  119. when:
  120. - (('calico-rr' in groups and inventory_hostname in groups['calico-rr']) or
  121. inventory_hostname in groups['k8s-cluster']) and
  122. inventory_hostname not in groups['etcd']
  123. - (not etcd_node_certs.results[0].stat.exists|default(false)) or
  124. (not etcd_node_certs.results[1].stat.exists|default(false)) or
  125. (not etcd_node_certs.results[2].stat.exists|default(false)) or
  126. (etcd_node_certs.results[0].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_node_certs.results[0].stat.path)|map(attribute="checksum")|first|default('')) or
  127. (etcd_node_certs.results[1].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_node_certs.results[1].stat.path)|map(attribute="checksum")|first|default('')) or
  128. (etcd_node_certs.results[2].stat.checksum|default('') != etcdcert_master.files|selectattr("path", "equalto", etcd_node_certs.results[2].stat.path)|map(attribute="checksum")|first|default(''))
  129. - name: "Check_certs | Set 'sync_certs' to true"
  130. set_fact:
  131. sync_certs: true
  132. when:
  133. - etcd_member_requires_sync|default(false) or
  134. kubernetes_host_requires_sync|default(false) or
  135. (inventory_hostname in gen_master_certs and gen_master_certs[inventory_hostname]) or
  136. (inventory_hostname in gen_node_certs and gen_node_certs[inventory_hostname])