upgrade.yml 13 KB

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