upgrade.yml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. ---
  2. - name: Verify upgrade can proceed
  3. hosts: masters[0]
  4. gather_facts: no
  5. tasks:
  6. # Checking the global deployment type rather than host facts, this is about
  7. # what the user is requesting.
  8. - fail: msg="Deployment type enterprise not supported for upgrade"
  9. when: deployment_type == "enterprise"
  10. # TODO: etcd is only guaranteed to be run on the master if embedded etcd is
  11. # used, we should have a task to create a new group consisting of the single
  12. # master running embedded etcd or an external etcd cluster specified by the
  13. # etcd group in the inventory (which could also be the masters)
  14. - name: Backup etcd
  15. hosts: masters
  16. vars:
  17. embedded_etcd: "{{ openshift.master.embedded_etcd }}"
  18. timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
  19. roles:
  20. - openshift_facts
  21. tasks:
  22. - stat: path=/var/lib/openshift
  23. register: var_lib_openshift
  24. - name: Create origin symlink if necessary
  25. file: src=/var/lib/openshift/ dest=/var/lib/origin state=link
  26. when: var_lib_openshift.stat.exists == True
  27. - name: Check available disk space for etcd backup
  28. # We assume to be using the data dir for all backups.
  29. shell: >
  30. df --output=avail -k {{ openshift.common.data_dir }} | tail -n 1
  31. register: avail_disk
  32. - name: Check current embedded etcd disk usage
  33. shell: >
  34. du -k {{ openshift.master.etcd_data_dir }} | tail -n 1 | cut -f1
  35. register: etcd_disk_usage
  36. when: embedded_etcd | bool
  37. - name: Abort if insufficient disk space for etcd backup
  38. fail:
  39. msg: >
  40. {{ etcd_disk_usage.stdout }} Kb disk space required for etcd backup,
  41. {{ avail_disk.stdout }} Kb available.
  42. when: (embedded_etcd | bool) and (etcd_disk_usage.stdout|int > avail_disk.stdout|int)
  43. - name: Install etcd (for etcdctl)
  44. yum:
  45. pkg: etcd
  46. state: latest
  47. - name: Generate etcd backup
  48. command: >
  49. etcdctl backup --data-dir={{ openshift.master.etcd_data_dir }}
  50. --backup-dir={{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}
  51. - name: Display location of etcd backup
  52. debug:
  53. msg: "Etcd backup created in {{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}"
  54. - name: Update deployment type
  55. hosts: OSEv3
  56. roles:
  57. - openshift_facts
  58. post_tasks:
  59. - openshift_facts:
  60. role: common
  61. local_facts:
  62. deployment_type: "{{ deployment_type }}"
  63. - name: Upgrade base package on masters
  64. hosts: masters
  65. roles:
  66. - openshift_facts
  67. vars:
  68. openshift_version: "{{ openshift_pkg_version | default('') }}"
  69. tasks:
  70. - name: Upgrade base package
  71. yum:
  72. pkg: "{{ openshift.common.service_type }}{{ openshift_version }}"
  73. state: latest
  74. # TODO: ideally we would check the new version, without installing it. (some
  75. # kind of yum repoquery? would need to handle openshift -> atomic-openshift
  76. # package rename)
  77. - name: Perform upgrade version checking
  78. hosts: masters[0]
  79. tasks:
  80. - name: Determine available version
  81. shell: >
  82. yum list available {{ openshift.common.service_type }} | tail -n 1 | cut -f 2 -d " " | cut -f 1 -d "-"
  83. register: _new_version
  84. - debug: var=_new_version
  85. # The above check will return nothing if the package is already installed,
  86. # and we may be re-running upgrade due to a failure.
  87. - name: Determine installed version
  88. command: >
  89. rpm -q --queryformat '%{version}' {{ openshift.common.service_type }}
  90. register: _new_version
  91. when: _new_version.stdout == ""
  92. # Fail if we still don't know:
  93. - debug: var=_new_version
  94. - name: Verify upgrade version
  95. fail: Unable to determine upgrade version for {{ openshift.common.service_type }}
  96. when: _new_version.stdout == ""
  97. - fail:
  98. msg: This playbook requires Atomic OpenShift 3.0.2 or later
  99. when: deployment_type in ['openshift_enterprise', 'atomic-enterprise'] and g_new_version.stdout | version_compare('3.0','>=') and g_new_version.stdout | version_compare('3.0.2','<')
  100. - fail:
  101. msg: This playbook requires Origin 1.0.6 or later
  102. when: deployment_type == 'origin'
  103. - name: Upgrade masters
  104. hosts: masters
  105. vars:
  106. openshift_version: "{{ openshift_pkg_version | default('') }}"
  107. tasks:
  108. - name: Upgrade to latest available kernel
  109. yum:
  110. pkg: kernel
  111. state: latest
  112. - name: display just the deployment_type variable for the current host
  113. debug:
  114. var: hostvars[inventory_hostname].openshift.common.deployment_type
  115. - name: Upgrade master packages
  116. command: yum update -y {{ openshift.common.service_type }}-master{{ openshift_version }}
  117. - name: Ensure python-yaml present for config upgrade
  118. yum:
  119. pkg: python-yaml
  120. state: installed
  121. - name: Upgrade master configuration
  122. openshift_upgrade_config:
  123. from_version: '3.0'
  124. to_version: '3.1'
  125. role: master
  126. - set_fact:
  127. master_certs_missing: True
  128. master_cert_subdir: master-{{ openshift.common.hostname }}
  129. master_cert_config_dir: "{{ openshift.common.config_base }}/master"
  130. - name: Create temp directory for syncing certs
  131. hosts: localhost
  132. gather_facts: no
  133. tasks:
  134. - name: Create local temp directory for syncing certs
  135. local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX
  136. register: g_master_mktemp
  137. changed_when: False
  138. - name: Generate missing master certificates
  139. hosts: masters[0]
  140. vars:
  141. master_generated_certs_dir: "{{ openshift.common.config_base }}/generated-configs"
  142. masters_needing_certs: "{{ hostvars
  143. | oo_select_keys(groups.masters)
  144. | difference([groups.masters.0]) }}"
  145. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  146. openshift_deployment_type: "{{ deployment_type }}"
  147. roles:
  148. - openshift_master_certificates
  149. post_tasks:
  150. - name: Remove generated etcd client certs when using external etcd
  151. file:
  152. path: "{{ master_generated_certs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}"
  153. state: absent
  154. when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config
  155. with_nested:
  156. - masters_needing_certs
  157. - - master.etcd-client.crt
  158. - master.etcd-client.key
  159. - name: Create a tarball of the master certs
  160. command: >
  161. tar -czvf {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz
  162. -C {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }} .
  163. args:
  164. creates: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz"
  165. with_items: masters_needing_certs
  166. - name: Retrieve the master cert tarball from the master
  167. fetch:
  168. src: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz"
  169. dest: "{{ sync_tmpdir }}/"
  170. flat: yes
  171. fail_on_missing: yes
  172. validate_checksum: yes
  173. with_items: masters_needing_certs
  174. - name: Sync certs and restart masters post configuration change
  175. hosts: masters
  176. vars:
  177. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  178. tasks:
  179. - name: Unarchive the tarball on the master
  180. unarchive:
  181. src: "{{ sync_tmpdir }}/{{ master_cert_subdir }}.tgz"
  182. dest: "{{ master_cert_config_dir }}"
  183. when: inventory_hostname != groups.masters.0
  184. - name: Restart master services
  185. service: name="{{ openshift.common.service_type}}-master" state=restarted
  186. - name: Delete temporary directory on localhost
  187. hosts: localhost
  188. gather_facts: no
  189. tasks:
  190. - file: name={{ g_master_mktemp.stdout }} state=absent
  191. changed_when: False
  192. - name: Upgrade nodes
  193. hosts: nodes
  194. vars:
  195. openshift_version: "{{ openshift_pkg_version | default('') }}"
  196. roles:
  197. - openshift_facts
  198. tasks:
  199. - name: Upgrade node packages
  200. command: yum update -y {{ openshift.common.service_type }}-node{{ openshift_version }}
  201. - name: Restart node services
  202. service: name="{{ openshift.common.service_type }}-node" state=restarted
  203. - name: Update cluster policy and policy bindings
  204. hosts: masters[0]
  205. vars:
  206. origin_reconcile_bindings: "{{ deployment_type == 'origin' and g_new_version.stdout | version_compare('1.0.6', '>') }}"
  207. ent_reconcile_bindings: "{{ deployment_type in ['openshift-enterprise', 'atomic-enterprise'] and g_new_version.stdout | version_compare('3.0.2','>') }}"
  208. tasks:
  209. - name: oadm policy reconcile-cluster-roles --confirm
  210. command: >
  211. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  212. policy reconcile-cluster-roles --confirm
  213. - name: oadm policy reconcile-cluster-role-bindings --confirm
  214. command: >
  215. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  216. policy reconcile-cluster-role-bindings
  217. --exclude-groups=system:authenticated
  218. --exclude-groups=system:unauthenticated
  219. --exclude-users=system:anonymous
  220. --additive-only=true --confirm
  221. when: origin_reconcile_bindings | bool or ent_reconcile_bindings | bool
  222. - name: Restart masters post reconcile
  223. hosts: masters
  224. tasks:
  225. - name: Restart master services
  226. service: name="{{ openshift.common.service_type}}-master" state=restarted
  227. - name: Upgrade default router and registry
  228. hosts: masters[0]
  229. vars:
  230. - registry_image: "{{ openshift.master.registry_url | replace( '${component}', 'docker-registry' ) | replace ( '${version}', 'v' + _new_version.stdout ) }}"
  231. - router_image: "{{ openshift.master.registry_url | replace( '${component}', 'haproxy-router' ) | replace ( '${version}', 'v' + _new_version.stdout ) }}"
  232. - oc_cmd: "{{ openshift.common.client_binary }} --config={{ openshift.common.config_base }}/master/admin.kubeconfig"
  233. tasks:
  234. - name: Check for default router
  235. command: >
  236. {{ oc_cmd }} get -n default dc/router
  237. register: _default_router
  238. failed_when: false
  239. changed_when: false
  240. - name: Check for allowHostNetwork and allowHostPorts
  241. when: _default_router.rc == 0
  242. shell: >
  243. {{ oc_cmd }} get -o yaml scc/privileged | /usr/bin/grep -e allowHostPorts -e allowHostNetwork
  244. register: _scc
  245. - name: Grant allowHostNetwork and allowHostPorts
  246. when:
  247. - _default_router.rc == 0
  248. - "'false' in _scc.stdout"
  249. command: >
  250. {{ oc_cmd }} patch scc/privileged -p '{"allowHostPorts":true,"allowHostNetwork":true}' --loglevel=9
  251. - name: Update deployment config to 1.0.4/3.0.1 spec
  252. when: _default_router.rc == 0
  253. command: >
  254. {{ oc_cmd }} patch dc/router -p
  255. '{"spec":{"strategy":{"rollingParams":{"updatePercent":-10},"spec":{"serviceAccount":"router","serviceAccountName":"router"}}}}'
  256. - name: Switch to hostNetwork=true
  257. when: _default_router.rc == 0
  258. command: >
  259. {{ oc_cmd }} patch dc/router -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'
  260. - name: Update router image to current version
  261. when: _default_router.rc == 0
  262. command: >
  263. {{ oc_cmd }} patch dc/router -p
  264. '{"spec":{"template":{"spec":{"containers":[{"name":"router","image":"{{ router_image }}"}]}}}}'
  265. - name: Check for default registry
  266. command: >
  267. {{ oc_cmd }} get -n default dc/docker-registry
  268. register: _default_registry
  269. failed_when: false
  270. changed_when: false
  271. - name: Update registry image to current version
  272. when: _default_registry.rc == 0
  273. command: >
  274. {{ oc_cmd }} patch dc/docker-registry -p
  275. '{"spec":{"template":{"spec":{"containers":[{"name":"registry","image":"{{ registry_image }}"}]}}}}'
  276. - name: Update image streams and templates
  277. hosts: masters[0]
  278. vars:
  279. openshift_examples_import_command: "update"
  280. openshift_deployment_type: "{{ deployment_type }}"
  281. roles:
  282. - openshift_examples