upgrade.yml 11 KB

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