upgrade_control_plane.yml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. ---
  2. ###############################################################################
  3. # Upgrade Masters
  4. ###############################################################################
  5. # If facts cache were for some reason deleted, this fact may not be set, and if not set
  6. # it will always default to true. This causes problems for the etcd data dir fact detection
  7. # so we must first make sure this is set correctly before attempting the backup.
  8. - name: Set master embedded_etcd fact
  9. hosts: oo_masters_to_config
  10. roles:
  11. - openshift_facts
  12. tasks:
  13. - openshift_facts:
  14. role: master
  15. local_facts:
  16. embedded_etcd: "{{ groups.oo_etcd_to_config | default([]) | length == 0 }}"
  17. debug_level: "{{ openshift_master_debug_level | default(openshift.common.debug_level | default(2)) }}"
  18. - name: Upgrade and backup etcd
  19. include: ./etcd/main.yml
  20. # Create service signer cert when missing. Service signer certificate
  21. # is added to master config in the master_config_upgrade hook.
  22. - name: Determine if service signer cert must be created
  23. hosts: oo_first_master
  24. tasks:
  25. - name: Determine if service signer certificate must be created
  26. stat:
  27. path: "{{ openshift.common.config_base }}/master/service-signer.crt"
  28. register: service_signer_cert_stat
  29. changed_when: false
  30. - include: create_service_signer_cert.yml
  31. # Set openshift_master_facts separately. In order to reconcile
  32. # admission_config's, we currently must run openshift_master_facts and
  33. # then run openshift_facts.
  34. - name: Set OpenShift master facts
  35. hosts: oo_masters_to_config
  36. roles:
  37. - openshift_master_facts
  38. # The main master upgrade play. Should handle all changes to the system in one pass, with
  39. # support for optional hooks to be defined.
  40. - name: Upgrade master
  41. hosts: oo_masters_to_config
  42. vars:
  43. openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
  44. serial: 1
  45. handlers:
  46. - include: ../../../../roles/openshift_master/handlers/main.yml
  47. static: yes
  48. roles:
  49. - openshift_facts
  50. - lib_utils
  51. post_tasks:
  52. # Run the pre-upgrade hook if defined:
  53. - debug: msg="Running master pre-upgrade hook {{ openshift_master_upgrade_pre_hook }}"
  54. when: openshift_master_upgrade_pre_hook is defined
  55. - include: "{{ openshift_master_upgrade_pre_hook }}"
  56. when: openshift_master_upgrade_pre_hook is defined
  57. - include: rpm_upgrade.yml component=master
  58. when: not openshift.common.is_containerized | bool
  59. - include_vars: ../../../../roles/openshift_master_facts/vars/main.yml
  60. - include: upgrade_scheduler.yml
  61. - include: "{{ master_config_hook }}"
  62. when: master_config_hook is defined
  63. - include_vars: ../../../../roles/openshift_master/vars/main.yml
  64. - name: Update systemd units
  65. include: ../../../../roles/openshift_master/tasks/systemd_units.yml
  66. - name: Check for ca-bundle.crt
  67. stat:
  68. path: "{{ openshift.common.config_base }}/master/ca-bundle.crt"
  69. register: ca_bundle_stat
  70. failed_when: false
  71. - name: Check for ca.crt
  72. stat:
  73. path: "{{ openshift.common.config_base }}/master/ca.crt"
  74. register: ca_crt_stat
  75. failed_when: false
  76. - name: Migrate ca.crt to ca-bundle.crt
  77. command: mv ca.crt ca-bundle.crt
  78. args:
  79. chdir: "{{ openshift.common.config_base }}/master"
  80. when: ca_crt_stat.stat.isreg and not ca_bundle_stat.stat.exists
  81. - name: Link ca.crt to ca-bundle.crt
  82. file:
  83. src: "{{ openshift.common.config_base }}/master/ca-bundle.crt"
  84. path: "{{ openshift.common.config_base }}/master/ca.crt"
  85. state: link
  86. when: ca_crt_stat.stat.isreg and not ca_bundle_stat.stat.exists
  87. - name: Update oreg value
  88. yedit:
  89. src: "{{ openshift.common.config_base }}/master/master-config.yaml"
  90. key: 'imageConfig.format'
  91. value: "{{ oreg_url }}"
  92. when: oreg_url is defined
  93. # Run the upgrade hook prior to restarting services/system if defined:
  94. - debug: msg="Running master upgrade hook {{ openshift_master_upgrade_hook }}"
  95. when: openshift_master_upgrade_hook is defined
  96. - include: "{{ openshift_master_upgrade_hook }}"
  97. when: openshift_master_upgrade_hook is defined
  98. - include: ../../openshift-master/restart_hosts.yml
  99. when: openshift.common.rolling_restart_mode == 'system'
  100. - include: ../../openshift-master/restart_services.yml
  101. when: openshift.common.rolling_restart_mode == 'services'
  102. # Run the post-upgrade hook if defined:
  103. - debug: msg="Running master post-upgrade hook {{ openshift_master_upgrade_post_hook }}"
  104. when: openshift_master_upgrade_post_hook is defined
  105. - include: "{{ openshift_master_upgrade_post_hook }}"
  106. when: openshift_master_upgrade_post_hook is defined
  107. - set_fact:
  108. master_update_complete: True
  109. ##############################################################################
  110. # Gate on master update complete
  111. ##############################################################################
  112. - name: Gate on master update
  113. hosts: localhost
  114. connection: local
  115. become: no
  116. tasks:
  117. - set_fact:
  118. master_update_completed: "{{ hostvars
  119. | oo_select_keys(groups.oo_masters_to_config)
  120. | oo_collect('inventory_hostname', {'master_update_complete': true}) }}"
  121. - set_fact:
  122. master_update_failed: "{{ groups.oo_masters_to_config | difference(master_update_completed) }}"
  123. - fail:
  124. msg: "Upgrade cannot continue. The following masters did not finish updating: {{ master_update_failed | join(',') }}"
  125. when: master_update_failed | length > 0
  126. ###############################################################################
  127. # Reconcile Cluster Roles, Cluster Role Bindings and Security Context Constraints
  128. ###############################################################################
  129. - name: Reconcile Cluster Roles and Cluster Role Bindings and Security Context Constraints
  130. hosts: oo_masters_to_config
  131. roles:
  132. - { role: openshift_cli }
  133. vars:
  134. origin_reconcile_bindings: "{{ deployment_type == 'origin' and openshift_version | version_compare('1.0.6', '>') }}"
  135. ent_reconcile_bindings: true
  136. openshift_docker_hosted_registry_network: "{{ hostvars[groups.oo_first_master.0].openshift.common.portal_net }}"
  137. # Another spot where we assume docker is running and do not want to accidentally trigger an unsafe
  138. # restart.
  139. skip_docker_role: True
  140. tasks:
  141. - name: Reconcile Cluster Roles
  142. command: >
  143. {{ openshift.common.client_binary }} adm --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  144. policy reconcile-cluster-roles --additive-only=true --confirm -o name
  145. register: reconcile_cluster_role_result
  146. changed_when:
  147. - reconcile_cluster_role_result.stdout != ''
  148. - reconcile_cluster_role_result.rc == 0
  149. run_once: true
  150. - name: Reconcile Cluster Role Bindings
  151. command: >
  152. {{ openshift.common.client_binary }} adm --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  153. policy reconcile-cluster-role-bindings
  154. --exclude-groups=system:authenticated
  155. --exclude-groups=system:authenticated:oauth
  156. --exclude-groups=system:unauthenticated
  157. --exclude-users=system:anonymous
  158. --additive-only=true --confirm -o name
  159. when: origin_reconcile_bindings | bool or ent_reconcile_bindings | bool
  160. register: reconcile_bindings_result
  161. changed_when:
  162. - reconcile_bindings_result.stdout != ''
  163. - reconcile_bindings_result.rc == 0
  164. run_once: true
  165. - name: Reconcile Jenkins Pipeline Role Bindings
  166. command: >
  167. {{ openshift.common.client_binary }} adm --config={{ openshift.common.config_base }}/master/admin.kubeconfig policy reconcile-cluster-role-bindings system:build-strategy-jenkinspipeline --confirm -o name
  168. run_once: true
  169. register: reconcile_jenkins_role_binding_result
  170. changed_when:
  171. - reconcile_jenkins_role_binding_result.stdout != ''
  172. - reconcile_jenkins_role_binding_result.rc == 0
  173. when: openshift.common.version_gte_3_4_or_1_4 | bool
  174. - name: Reconcile Security Context Constraints
  175. command: >
  176. {{ openshift.common.client_binary }} adm policy reconcile-sccs --confirm --additive-only=true -o name
  177. register: reconcile_scc_result
  178. changed_when:
  179. - reconcile_scc_result.stdout != ''
  180. - reconcile_scc_result.rc == 0
  181. run_once: true
  182. - set_fact:
  183. reconcile_complete: True
  184. ##############################################################################
  185. # Gate on reconcile
  186. ##############################################################################
  187. - name: Gate on reconcile
  188. hosts: localhost
  189. connection: local
  190. become: no
  191. tasks:
  192. - set_fact:
  193. reconcile_completed: "{{ hostvars
  194. | oo_select_keys(groups.oo_masters_to_config)
  195. | oo_collect('inventory_hostname', {'reconcile_complete': true}) }}"
  196. - set_fact:
  197. reconcile_failed: "{{ groups.oo_masters_to_config | difference(reconcile_completed) }}"
  198. - fail:
  199. msg: "Upgrade cannot continue. The following masters did not finish reconciling: {{ reconcile_failed | join(',') }}"
  200. when: reconcile_failed | length > 0
  201. - name: Upgrade Docker on dedicated containerized etcd hosts
  202. hosts: oo_etcd_to_config:!oo_nodes_to_upgrade
  203. serial: 1
  204. any_errors_fatal: true
  205. roles:
  206. - openshift_facts
  207. tasks:
  208. - include: docker/upgrade.yml
  209. when: l_docker_upgrade is defined and l_docker_upgrade | bool and not openshift.common.is_atomic | bool
  210. - name: Drain and upgrade master nodes
  211. hosts: oo_masters_to_config:&oo_nodes_to_upgrade
  212. # This var must be set with -e on invocation, as it is not a per-host inventory var
  213. # and is evaluated early. Values such as "20%" can also be used.
  214. serial: "{{ openshift_upgrade_nodes_serial | default(1) }}"
  215. any_errors_fatal: true
  216. pre_tasks:
  217. - name: Load lib_openshift modules
  218. include_role:
  219. name: lib_openshift
  220. # TODO: To better handle re-trying failed upgrades, it would be nice to check if the node
  221. # or docker actually needs an upgrade before proceeding. Perhaps best to save this until
  222. # we merge upgrade functionality into the base roles and a normal config.yml playbook run.
  223. - name: Mark node unschedulable
  224. oc_adm_manage_node:
  225. node: "{{ openshift.node.nodename | lower }}"
  226. schedulable: False
  227. delegate_to: "{{ groups.oo_first_master.0 }}"
  228. retries: 10
  229. delay: 5
  230. register: node_unschedulable
  231. until: node_unschedulable|succeeded
  232. - name: Drain Node for Kubelet upgrade
  233. command: >
  234. {{ hostvars[groups.oo_first_master.0].openshift.common.admin_binary }} drain {{ openshift.node.nodename | lower }} --force --delete-local-data --ignore-daemonsets
  235. delegate_to: "{{ groups.oo_first_master.0 }}"
  236. roles:
  237. - lib_openshift
  238. - openshift_facts
  239. - docker
  240. - openshift_node_upgrade
  241. post_tasks:
  242. - name: Set node schedulability
  243. oc_adm_manage_node:
  244. node: "{{ openshift.node.nodename | lower }}"
  245. schedulable: True
  246. delegate_to: "{{ groups.oo_first_master.0 }}"
  247. retries: 10
  248. delay: 5
  249. register: node_schedulable
  250. until: node_schedulable|succeeded
  251. when: node_unschedulable|changed