upgrade.yml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  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: Perform upgrade version checking
  78. hosts: masters[0]
  79. tasks:
  80. - name: Clean yum cache
  81. command: yum clean all
  82. - name: Determine available versions
  83. script: files/versions.sh {{ openshift.common.service_type }} openshift
  84. register: g_versions_result
  85. - set_fact:
  86. g_aos_versions: "{{ g_versions_result.stdout | from_yaml }}"
  87. - set_fact:
  88. 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 }}"
  89. - fail: This playbook requires Origin 1.0.6 or later
  90. when: deployment_type == 'origin' and g_aos_versions.curr_version | version_compare('1.0.6','<')
  91. - fail: This playbook requires Atomic OpenShift 3.0.2 or later
  92. when: deployment_type in ['openshift-enterprise', 'atomic-openshift'] and g_aos_versions.curr_version | version_compare('3.0.2','<')
  93. - name: Upgrade masters
  94. hosts: masters
  95. vars:
  96. openshift_version: "{{ openshift_pkg_version | default('') }}"
  97. tasks:
  98. - name: Upgrade to latest available kernel
  99. yum:
  100. pkg: kernel
  101. state: latest
  102. - name: Upgrade master packages
  103. command: yum update -y {{ openshift.common.service_type }}-master{{ openshift_version }}
  104. - name: Ensure python-yaml present for config upgrade
  105. yum:
  106. pkg: python-yaml
  107. state: installed
  108. - debug: var=hostvars[inventory_hostname].openshift.common.config_base
  109. - name: Upgrade master configuration
  110. openshift_upgrade_config:
  111. from_version: '3.0'
  112. to_version: '3.1'
  113. role: master
  114. config_base: "{{ hostvars[inventory_hostname].openshift.common.config_base }}"
  115. - set_fact:
  116. master_certs_missing: True
  117. master_cert_subdir: master-{{ openshift.common.hostname }}
  118. master_cert_config_dir: "{{ openshift.common.config_base }}/master"
  119. - name: Create temp directory for syncing certs
  120. hosts: localhost
  121. gather_facts: no
  122. tasks:
  123. - name: Create local temp directory for syncing certs
  124. local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX
  125. register: g_master_mktemp
  126. changed_when: False
  127. - name: Generate missing master certificates
  128. hosts: masters[0]
  129. vars:
  130. master_hostnames: "{{ hostvars
  131. | oo_select_keys(groups.masters)
  132. | oo_collect('openshift.common.all_hostnames')
  133. | oo_flatten | unique }}"
  134. master_generated_certs_dir: "{{ openshift.common.config_base }}/generated-configs"
  135. masters_needing_certs: "{{ hostvars
  136. | oo_select_keys(groups.masters)
  137. | difference([groups.masters.0]) }}"
  138. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  139. openshift_deployment_type: "{{ deployment_type }}"
  140. roles:
  141. - openshift_master_certificates
  142. post_tasks:
  143. - name: Remove generated etcd client certs when using external etcd
  144. file:
  145. path: "{{ master_generated_certs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}"
  146. state: absent
  147. when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config
  148. with_nested:
  149. - masters_needing_certs
  150. - - master.etcd-client.crt
  151. - master.etcd-client.key
  152. - name: Create a tarball of the master certs
  153. command: >
  154. tar -czvf {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz
  155. -C {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }} .
  156. args:
  157. creates: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz"
  158. with_items: masters_needing_certs
  159. - name: Retrieve the master cert tarball from the master
  160. fetch:
  161. src: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz"
  162. dest: "{{ sync_tmpdir }}/"
  163. flat: yes
  164. fail_on_missing: yes
  165. validate_checksum: yes
  166. with_items: masters_needing_certs
  167. - name: Sync certs and restart masters post configuration change
  168. hosts: masters
  169. vars:
  170. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  171. tasks:
  172. - name: Unarchive the tarball on the master
  173. unarchive:
  174. src: "{{ sync_tmpdir }}/{{ master_cert_subdir }}.tgz"
  175. dest: "{{ master_cert_config_dir }}"
  176. when: inventory_hostname != groups.masters.0
  177. - name: Restart master services
  178. service: name="{{ openshift.common.service_type}}-master" state=restarted
  179. - name: Delete temporary directory on localhost
  180. hosts: localhost
  181. gather_facts: no
  182. tasks:
  183. - file: name={{ g_master_mktemp.stdout }} state=absent
  184. changed_when: False
  185. - name: Upgrade nodes
  186. hosts: nodes
  187. vars:
  188. openshift_version: "{{ openshift_pkg_version | default('') }}"
  189. roles:
  190. - openshift_facts
  191. tasks:
  192. - name: Upgrade node packages
  193. command: yum update -y {{ openshift.common.service_type }}-node{{ openshift_version }}
  194. - name: Restart node services
  195. service: name="{{ openshift.common.service_type }}-node" state=restarted
  196. - name: Update cluster policy and policy bindings
  197. hosts: masters[0]
  198. vars:
  199. origin_reconcile_bindings: "{{ deployment_type == 'origin' and g_new_version | version_compare('1.0.6', '>') }}"
  200. ent_reconcile_bindings: "{{ deployment_type in ['openshift-enterprise', 'atomic-enterprise'] and g_new_version | version_compare('3.0.2','>') }}"
  201. tasks:
  202. - name: oadm policy reconcile-cluster-roles --confirm
  203. command: >
  204. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  205. policy reconcile-cluster-roles --confirm
  206. - name: oadm policy reconcile-cluster-role-bindings --confirm
  207. command: >
  208. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  209. policy reconcile-cluster-role-bindings
  210. --exclude-groups=system:authenticated
  211. --exclude-groups=system:unauthenticated
  212. --exclude-users=system:anonymous
  213. --additive-only=true --confirm
  214. when: origin_reconcile_bindings | bool or ent_reconcile_bindings | bool
  215. - name: Restart masters post reconcile
  216. hosts: masters
  217. tasks:
  218. - name: Restart master services
  219. service: name="{{ openshift.common.service_type}}-master" state=restarted
  220. - name: Upgrade default router and registry
  221. hosts: masters[0]
  222. vars:
  223. - registry_image: "{{ openshift.master.registry_url | replace( '${component}', 'docker-registry' ) | replace ( '${version}', 'v' + g_new_version ) }}"
  224. - router_image: "{{ openshift.master.registry_url | replace( '${component}', 'haproxy-router' ) | replace ( '${version}', 'v' + g_new_version ) }}"
  225. - oc_cmd: "{{ openshift.common.client_binary }} --config={{ openshift.common.config_base }}/master/admin.kubeconfig"
  226. tasks:
  227. - name: Check for default router
  228. command: >
  229. {{ oc_cmd }} get -n default dc/router
  230. register: _default_router
  231. failed_when: false
  232. changed_when: false
  233. - name: Check for allowHostNetwork and allowHostPorts
  234. when: _default_router.rc == 0
  235. shell: >
  236. {{ oc_cmd }} get -o yaml scc/privileged | /usr/bin/grep -e allowHostPorts -e allowHostNetwork
  237. register: _scc
  238. - name: Grant allowHostNetwork and allowHostPorts
  239. when:
  240. - _default_router.rc == 0
  241. - "'false' in _scc.stdout"
  242. command: >
  243. {{ oc_cmd }} patch scc/privileged -p '{"allowHostPorts":true,"allowHostNetwork":true}' --loglevel=9
  244. - name: Update deployment config to 1.0.4/3.0.1 spec
  245. when: _default_router.rc == 0
  246. command: >
  247. {{ oc_cmd }} patch dc/router -p
  248. '{"spec":{"strategy":{"rollingParams":{"updatePercent":-10},"spec":{"serviceAccount":"router","serviceAccountName":"router"}}}}'
  249. - name: Switch to hostNetwork=true
  250. when: _default_router.rc == 0
  251. command: >
  252. {{ oc_cmd }} patch dc/router -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'
  253. - name: Update router image to current version
  254. when: _default_router.rc == 0
  255. command: >
  256. {{ oc_cmd }} patch dc/router -p
  257. '{"spec":{"template":{"spec":{"containers":[{"name":"router","image":"{{ router_image }}"}]}}}}'
  258. - name: Check for default registry
  259. command: >
  260. {{ oc_cmd }} get -n default dc/docker-registry
  261. register: _default_registry
  262. failed_when: false
  263. changed_when: false
  264. - name: Update registry image to current version
  265. when: _default_registry.rc == 0
  266. command: >
  267. {{ oc_cmd }} patch dc/docker-registry -p
  268. '{"spec":{"template":{"spec":{"containers":[{"name":"registry","image":"{{ registry_image }}"}]}}}}'
  269. - name: Update image streams and templates
  270. hosts: masters[0]
  271. vars:
  272. openshift_examples_import_command: "update"
  273. openshift_deployment_type: "{{ deployment_type }}"
  274. roles:
  275. - openshift_examples