upgrade.yml 11 KB

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