upgrade.yml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. ---
  2. - name: Load master facts
  3. hosts: masters
  4. roles:
  5. - openshift_facts
  6. - name: Verify upgrade can proceed
  7. hosts: masters[0]
  8. vars:
  9. openshift_master_ha: "{{ groups['masters'] | length > 1 }}"
  10. gather_facts: no
  11. tasks:
  12. # Pacemaker is currently the only supported upgrade path for multiple masters
  13. - fail:
  14. msg: "openshift_master_cluster_method must be set to 'pacemaker'"
  15. when: openshift_master_ha | bool and ((openshift_master_cluster_method is not defined) or (openshift_master_cluster_method is defined and openshift_master_cluster_method != "pacemaker"))
  16. - name: Run pre-upgrade checks on first master
  17. hosts: masters[0]
  18. tasks:
  19. # If this script errors out ansible will show the default stdout/stderr
  20. # which contains details for the user:
  21. - script: files/pre-upgrade-check
  22. - name: Evaluate etcd_hosts
  23. hosts: localhost
  24. tasks:
  25. - name: Evaluate etcd hosts
  26. add_host:
  27. name: "{{ groups.masters.0 }}"
  28. groups: etcd_hosts
  29. when: hostvars[groups.masters.0].openshift.master.embedded_etcd | bool
  30. - name: Evaluate etcd hosts
  31. add_host:
  32. name: "{{ item }}"
  33. groups: etcd_hosts
  34. with_items: groups.etcd
  35. when: not hostvars[groups.masters.0].openshift.master.embedded_etcd | bool
  36. - name: Backup etcd
  37. hosts: etcd_hosts
  38. vars:
  39. embedded_etcd: "{{ openshift.master.embedded_etcd }}"
  40. timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
  41. roles:
  42. - openshift_facts
  43. tasks:
  44. - stat: path=/var/lib/openshift
  45. register: var_lib_openshift
  46. - stat: path=/var/lib/origin
  47. register: var_lib_origin
  48. - name: Create origin symlink if necessary
  49. file: src=/var/lib/openshift/ dest=/var/lib/origin state=link
  50. when: var_lib_openshift.stat.exists == True and var_lib_origin.stat.exists == False
  51. - name: Check available disk space for etcd backup
  52. # We assume to be using the data dir for all backups.
  53. shell: >
  54. df --output=avail -k {{ openshift.common.data_dir }} | tail -n 1
  55. register: avail_disk
  56. - name: Check current embedded etcd disk usage
  57. shell: >
  58. du -k {{ openshift.master.etcd_data_dir }} | tail -n 1 | cut -f1
  59. register: etcd_disk_usage
  60. when: embedded_etcd | bool
  61. - name: Abort if insufficient disk space for etcd backup
  62. fail:
  63. msg: >
  64. {{ etcd_disk_usage.stdout }} Kb disk space required for etcd backup,
  65. {{ avail_disk.stdout }} Kb available.
  66. when: (embedded_etcd | bool) and (etcd_disk_usage.stdout|int > avail_disk.stdout|int)
  67. - name: Install etcd (for etcdctl)
  68. yum:
  69. pkg: etcd
  70. state: latest
  71. - name: Generate etcd backup
  72. command: >
  73. etcdctl backup --data-dir={{ openshift.master.etcd_data_dir }}
  74. --backup-dir={{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}
  75. - name: Display location of etcd backup
  76. debug:
  77. msg: "Etcd backup created in {{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}"
  78. - name: Update deployment type
  79. hosts: OSEv3
  80. roles:
  81. - openshift_facts
  82. post_tasks:
  83. - openshift_facts:
  84. role: common
  85. local_facts:
  86. deployment_type: "{{ deployment_type }}"
  87. - name: Perform upgrade version checking
  88. hosts: masters[0]
  89. tasks:
  90. - name: Clean yum cache
  91. command: yum clean all
  92. - name: Determine available versions
  93. script: files/versions.sh {{ openshift.common.service_type }} openshift
  94. register: g_versions_result
  95. - set_fact:
  96. g_aos_versions: "{{ g_versions_result.stdout | from_yaml }}"
  97. - set_fact:
  98. g_new_version: "{{ g_aos_versions.curr_version.split('-', 1).0 if g_aos_versions.avail_version is none else g_aos_versions.avail_version.split('-', 1).0 }}"
  99. - fail:
  100. msg: This playbook requires Origin 1.0.6 or later
  101. when: deployment_type == 'origin' and g_aos_versions.curr_version | version_compare('1.0.6','<')
  102. # TODO: This should be specific to the 3.1 upgrade playbook (coming in future refactor), otherwise we are blocking 3.0.1 to 3.0.2 here.
  103. - fail:
  104. msg: Atomic OpenShift 3.1 packages not found
  105. when: deployment_type in ['openshift-enterprise', 'atomic-openshift'] and g_aos_versions.curr_version | version_compare('3.0.2.900','<') and (g_aos_versions.avail_version is none or g_aos_versions.avail_version | version_compare('3.0.2.900','<'))
  106. # Deployment type 'enterprise' is no longer valid if we're upgrading to 3.1 or beyond.
  107. # (still valid for 3.0.x to 3.0.y however) Using the global deployment_type here as
  108. # we're checking what was requested by the upgrade, not the current type on the system.
  109. - fail:
  110. msg: "Deployment type enterprise not supported for upgrade"
  111. when: deployment_type == "enterprise" and g_aos_versions.curr_version | version_compare('3.1', '>=')
  112. - name: Upgrade masters
  113. hosts: masters
  114. vars:
  115. openshift_version: "{{ openshift_pkg_version | default('') }}"
  116. tasks:
  117. - name: Upgrade to latest available kernel
  118. yum:
  119. pkg: kernel
  120. state: latest
  121. - name: Upgrade master packages
  122. command: yum update -y {{ openshift.common.service_type }}-master{{ openshift_version }}
  123. - name: Ensure python-yaml present for config upgrade
  124. yum:
  125. pkg: PyYAML
  126. state: installed
  127. - name: Upgrade master configuration
  128. openshift_upgrade_config:
  129. from_version: '3.0'
  130. to_version: '3.1'
  131. role: master
  132. config_base: "{{ hostvars[inventory_hostname].openshift.common.config_base }}"
  133. when: deployment_type in ['openshift-enterprise', 'atomic-enterprise'] and g_aos_versions.curr_version | version_compare('3.1', '>=')
  134. - set_fact:
  135. master_certs_missing: True
  136. master_cert_subdir: master-{{ openshift.common.hostname }}
  137. master_cert_config_dir: "{{ openshift.common.config_base }}/master"
  138. - name: Create temp directory for syncing certs
  139. hosts: localhost
  140. gather_facts: no
  141. tasks:
  142. - name: Create local temp directory for syncing certs
  143. local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX
  144. register: g_master_mktemp
  145. changed_when: False
  146. - name: Generate missing master certificates
  147. hosts: masters[0]
  148. vars:
  149. master_hostnames: "{{ hostvars
  150. | oo_select_keys(groups.masters)
  151. | oo_collect('openshift.common.all_hostnames')
  152. | oo_flatten | unique }}"
  153. master_generated_certs_dir: "{{ openshift.common.config_base }}/generated-configs"
  154. masters_needing_certs: "{{ hostvars
  155. | oo_select_keys(groups.masters)
  156. | difference([groups.masters.0]) }}"
  157. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  158. openshift_deployment_type: "{{ deployment_type }}"
  159. roles:
  160. - openshift_master_certificates
  161. post_tasks:
  162. - name: Remove generated etcd client certs when using external etcd
  163. file:
  164. path: "{{ master_generated_certs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}"
  165. state: absent
  166. when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config
  167. with_nested:
  168. - masters_needing_certs
  169. - - master.etcd-client.crt
  170. - master.etcd-client.key
  171. - name: Create a tarball of the master certs
  172. command: >
  173. tar -czvf {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz
  174. -C {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }} .
  175. with_items: masters_needing_certs
  176. - name: Retrieve the master cert tarball from the master
  177. fetch:
  178. src: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz"
  179. dest: "{{ sync_tmpdir }}/"
  180. flat: yes
  181. fail_on_missing: yes
  182. validate_checksum: yes
  183. with_items: masters_needing_certs
  184. - name: Sync certs and restart masters post configuration change
  185. hosts: masters
  186. vars:
  187. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  188. openshift_master_ha: "{{ groups['masters'] | length > 1 }}"
  189. tasks:
  190. - name: Unarchive the tarball on the master
  191. unarchive:
  192. src: "{{ sync_tmpdir }}/{{ master_cert_subdir }}.tgz"
  193. dest: "{{ master_cert_config_dir }}"
  194. when: inventory_hostname != groups.masters.0
  195. - name: Restart master services
  196. service: name="{{ openshift.common.service_type}}-master" enabled=yes state=restarted
  197. when: not openshift_master_ha | bool
  198. - name: Destroy cluster
  199. hosts: masters[0]
  200. vars:
  201. openshift_master_ha: "{{ groups['masters'] | length > 1 }}"
  202. openshift_deployment_type: "{{ deployment_type }}"
  203. pre_tasks:
  204. - name: Check for configured cluster
  205. stat:
  206. path: /etc/corosync/corosync.conf
  207. register: corosync_conf
  208. when: openshift_master_ha | bool
  209. - name: Destroy cluster
  210. command: pcs cluster destroy --all
  211. when: openshift_master_ha | bool and corosync_conf.stat.exists == true
  212. - name: Start pcsd on masters
  213. hosts: masters
  214. vars:
  215. openshift_master_ha: "{{ groups['masters'] | length > 1 }}"
  216. tasks:
  217. - name: Start pcsd
  218. service: name=pcsd enabled=yes state=started
  219. when: openshift_master_ha | bool
  220. - name: Re-create cluster
  221. hosts: masters[0]
  222. vars:
  223. openshift_master_ha: "{{ groups['masters'] | length > 1 }}"
  224. openshift_deployment_type: "{{ deployment_type }}"
  225. omc_cluster_hosts: "{{ groups.masters | join(' ') }}"
  226. roles:
  227. - role: openshift_master_cluster
  228. when: openshift_master_ha | bool
  229. - name: Delete temporary directory on localhost
  230. hosts: localhost
  231. gather_facts: no
  232. tasks:
  233. - file: name={{ g_master_mktemp.stdout }} state=absent
  234. changed_when: False
  235. - name: Upgrade nodes
  236. hosts: nodes
  237. vars:
  238. openshift_version: "{{ openshift_pkg_version | default('') }}"
  239. roles:
  240. - openshift_facts
  241. tasks:
  242. - name: Upgrade node packages
  243. command: yum update -y {{ openshift.common.service_type }}-node{{ openshift_version }}
  244. - name: Restart node services
  245. service: name="{{ openshift.common.service_type }}-node" enabled=yes state=restarted
  246. - name: Update cluster policy and policy bindings
  247. hosts: masters[0]
  248. vars:
  249. origin_reconcile_bindings: "{{ deployment_type == 'origin' and g_new_version | version_compare('1.0.6', '>') }}"
  250. ent_reconcile_bindings: "{{ deployment_type in ['openshift-enterprise', 'atomic-enterprise'] and g_new_version | version_compare('3.0.2','>') }}"
  251. tasks:
  252. - name: oadm policy reconcile-cluster-roles --confirm
  253. command: >
  254. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  255. policy reconcile-cluster-roles --confirm
  256. - name: oadm policy reconcile-cluster-role-bindings --confirm
  257. command: >
  258. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  259. policy reconcile-cluster-role-bindings
  260. --exclude-groups=system:authenticated
  261. --exclude-groups=system:unauthenticated
  262. --exclude-users=system:anonymous
  263. --additive-only=true --confirm
  264. when: origin_reconcile_bindings | bool or ent_reconcile_bindings | bool
  265. - name: Restart masters post reconcile
  266. hosts: masters
  267. vars:
  268. openshift_master_ha: "{{ groups['masters'] | length > 1 }}"
  269. tasks:
  270. - name: Restart master services
  271. service: name="{{ openshift.common.service_type}}-master" enabled=yes state=restarted
  272. when: not openshift_master_ha | bool
  273. - name: Restart cluster post reconcile
  274. hosts: masters[0]
  275. vars:
  276. openshift_master_ha: "{{ groups['masters'] | length > 1 }}"
  277. tasks:
  278. - name: Restart master cluster
  279. command: pcs resource restart master
  280. when: openshift_master_ha | bool
  281. - name: Wait for the clustered master service to be available
  282. wait_for:
  283. host: "{{ openshift_master_cluster_vip }}"
  284. port: 8443
  285. state: started
  286. timeout: 180
  287. delay: 90
  288. when: openshift_master_ha | bool
  289. - name: Upgrade default router and registry
  290. hosts: masters[0]
  291. vars:
  292. - registry_image: "{{ openshift.master.registry_url | replace( '${component}', 'docker-registry' ) | replace ( '${version}', 'v' + g_new_version ) }}"
  293. - router_image: "{{ openshift.master.registry_url | replace( '${component}', 'haproxy-router' ) | replace ( '${version}', 'v' + g_new_version ) }}"
  294. - oc_cmd: "{{ openshift.common.client_binary }} --config={{ openshift.common.config_base }}/master/admin.kubeconfig"
  295. tasks:
  296. - name: Check for default router
  297. command: >
  298. {{ oc_cmd }} get -n default dc/router
  299. register: _default_router
  300. failed_when: false
  301. changed_when: false
  302. - name: Check for allowHostNetwork and allowHostPorts
  303. when: _default_router.rc == 0
  304. shell: >
  305. {{ oc_cmd }} get -o yaml scc/privileged | /usr/bin/grep -e allowHostPorts -e allowHostNetwork
  306. register: _scc
  307. - name: Grant allowHostNetwork and allowHostPorts
  308. when:
  309. - _default_router.rc == 0
  310. - "'false' in _scc.stdout"
  311. command: >
  312. {{ oc_cmd }} patch scc/privileged -p '{"allowHostPorts":true,"allowHostNetwork":true}' --loglevel=9
  313. - name: Update deployment config to 1.0.4/3.0.1 spec
  314. when: _default_router.rc == 0
  315. command: >
  316. {{ oc_cmd }} patch dc/router -p
  317. '{"spec":{"strategy":{"rollingParams":{"updatePercent":-10},"spec":{"serviceAccount":"router","serviceAccountName":"router"}}}}'
  318. - name: Switch to hostNetwork=true
  319. when: _default_router.rc == 0
  320. command: >
  321. {{ oc_cmd }} patch dc/router -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'
  322. - name: Update router image to current version
  323. when: _default_router.rc == 0
  324. command: >
  325. {{ oc_cmd }} patch dc/router -p
  326. '{"spec":{"template":{"spec":{"containers":[{"name":"router","image":"{{ router_image }}"}]}}}}'
  327. - name: Check for default registry
  328. command: >
  329. {{ oc_cmd }} get -n default dc/docker-registry
  330. register: _default_registry
  331. failed_when: false
  332. changed_when: false
  333. - name: Update registry image to current version
  334. when: _default_registry.rc == 0
  335. command: >
  336. {{ oc_cmd }} patch dc/docker-registry -p
  337. '{"spec":{"template":{"spec":{"containers":[{"name":"registry","image":"{{ registry_image }}"}]}}}}'
  338. - name: Update image streams and templates
  339. hosts: masters[0]
  340. vars:
  341. openshift_examples_import_command: "update"
  342. openshift_deployment_type: "{{ deployment_type }}"
  343. roles:
  344. - openshift_examples