upgrade.yml 12 KB

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