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.

134 lines
6.8 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: false
  19. get_checksum: true
  20. get_mime: false
  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: inventory_hostname in groups['k8s_cluster']
  34. with_items:
  35. - ca.pem
  36. - node-{{ inventory_hostname }}.pem
  37. - node-{{ inventory_hostname }}-key.pem
  38. - name: "Check_certs | Set 'gen_certs' to true if expected certificates are not on the first etcd node(1/2)"
  39. set_fact:
  40. gen_certs: true
  41. when: force_etcd_cert_refresh or not item in etcdcert_master.files | map(attribute='path') | list
  42. run_once: true
  43. with_items: "{{ expected_files }}"
  44. vars:
  45. expected_files: >-
  46. ['{{ etcd_cert_dir }}/ca.pem',
  47. {% set etcd_members = groups['etcd'] %}
  48. {% for host in etcd_members %}
  49. '{{ etcd_cert_dir }}/admin-{{ host }}.pem',
  50. '{{ etcd_cert_dir }}/admin-{{ host }}-key.pem',
  51. '{{ etcd_cert_dir }}/member-{{ host }}.pem',
  52. '{{ etcd_cert_dir }}/member-{{ host }}-key.pem',
  53. {% endfor %}
  54. {% set k8s_nodes = groups['kube_control_plane'] %}
  55. {% for host in k8s_nodes %}
  56. '{{ etcd_cert_dir }}/node-{{ host }}.pem',
  57. '{{ etcd_cert_dir }}/node-{{ host }}-key.pem'
  58. {% if not loop.last %}{{ ',' }}{% endif %}
  59. {% endfor %}]
  60. - name: "Check_certs | Set 'gen_certs' to true if expected certificates are not on the first etcd node(2/2)"
  61. set_fact:
  62. gen_certs: true
  63. run_once: true
  64. with_items: "{{ expected_files }}"
  65. vars:
  66. expected_files: >-
  67. ['{{ etcd_cert_dir }}/ca.pem',
  68. {% set etcd_members = groups['etcd'] %}
  69. {% for host in etcd_members %}
  70. '{{ etcd_cert_dir }}/admin-{{ host }}.pem',
  71. '{{ etcd_cert_dir }}/admin-{{ host }}-key.pem',
  72. '{{ etcd_cert_dir }}/member-{{ host }}.pem',
  73. '{{ etcd_cert_dir }}/member-{{ host }}-key.pem',
  74. {% endfor %}
  75. {% set k8s_nodes = groups['k8s_cluster'] | unique | sort %}
  76. {% for host in k8s_nodes %}
  77. '{{ etcd_cert_dir }}/node-{{ host }}.pem',
  78. '{{ etcd_cert_dir }}/node-{{ host }}-key.pem'
  79. {% if not loop.last %}{{ ',' }}{% endif %}
  80. {% endfor %}]
  81. when:
  82. - kube_network_plugin in ["calico", "flannel", "cilium"] or cilium_deploy_additionally | default(false) | bool
  83. - kube_network_plugin != "calico" or calico_datastore == "etcd"
  84. - force_etcd_cert_refresh or not item in etcdcert_master.files | map(attribute='path') | list
  85. - name: "Check_certs | Set 'gen_*_certs' groups to track which nodes needs to have certs generated on first etcd node"
  86. vars:
  87. existing_certs: etcdcert_master.files | map(attribute='path')
  88. ansible.builtin.group_by:
  89. key: "gen_{{ item.node_type }}_certs_{{ force_etcd_cert_refresh or item.certs is not subset(existing_certs) }}"
  90. loop: "{{ cert_files | dict2items(key_name='node_type', value_name='certs') }}"
  91. - 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"
  92. set_fact:
  93. etcd_member_requires_sync: true
  94. when:
  95. - inventory_hostname in groups['etcd']
  96. - (not etcd_member_certs.results[0].stat.exists | default(false)) or
  97. (not etcd_member_certs.results[1].stat.exists | default(false)) or
  98. (not etcd_member_certs.results[2].stat.exists | default(false)) or
  99. (not etcd_member_certs.results[3].stat.exists | default(false)) or
  100. (not etcd_member_certs.results[4].stat.exists | default(false)) or
  101. (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
  102. (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
  103. (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
  104. (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
  105. (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(''))
  106. - 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"
  107. set_fact:
  108. kubernetes_host_requires_sync: true
  109. when:
  110. - inventory_hostname in groups['k8s_cluster'] and
  111. inventory_hostname not in groups['etcd']
  112. - (not etcd_node_certs.results[0].stat.exists | default(false)) or
  113. (not etcd_node_certs.results[1].stat.exists | default(false)) or
  114. (not etcd_node_certs.results[2].stat.exists | default(false)) or
  115. (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
  116. (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
  117. (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(''))
  118. - name: "Check_certs | Set 'sync_certs' to true"
  119. set_fact:
  120. sync_certs: true
  121. when:
  122. - etcd_member_requires_sync | default(false) or
  123. kubernetes_host_requires_sync | default(false) or
  124. 'gen_master_certs_True' in group_names or
  125. 'gen_node_certs_True' in group_names