upgrade.yml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. ---
  2. ###############################################################################
  3. # Evaluate host groups and gather facts
  4. ###############################################################################
  5. - name: Evaluate host groups
  6. include: ../../evaluate_groups.yml
  7. - name: Load openshift_facts
  8. hosts: oo_masters_to_config:oo_nodes_to_config:oo_etcd_to_config:oo_lb_to_config
  9. roles:
  10. - openshift_facts
  11. - name: Evaluate additional groups for upgrade
  12. hosts: localhost
  13. connection: local
  14. become: no
  15. tasks:
  16. - name: Evaluate etcd_hosts_to_backup
  17. add_host:
  18. name: "{{ item }}"
  19. groups: etcd_hosts_to_backup
  20. with_items: groups.oo_etcd_to_config if groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config | length > 0 else groups.oo_first_master
  21. ###############################################################################
  22. # Pre-upgrade checks
  23. ###############################################################################
  24. - name: Verify upgrade can proceed
  25. hosts: oo_first_master
  26. vars:
  27. openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
  28. gather_facts: no
  29. tasks:
  30. # Pacemaker is currently the only supported upgrade path for multiple masters
  31. - fail:
  32. msg: "openshift_master_cluster_method must be set to 'pacemaker'"
  33. when: openshift_master_ha | bool and ((openshift_master_cluster_method is not defined) or (openshift_master_cluster_method is defined and openshift_master_cluster_method != "pacemaker"))
  34. - fail:
  35. msg: >
  36. This upgrade is only supported for origin and openshift-enterprise
  37. deployment types
  38. when: deployment_type not in ['origin','openshift-enterprise']
  39. - fail:
  40. msg: >
  41. openshift_pkg_version is {{ openshift_pkg_version }} which is not a
  42. valid version for a 3.1 upgrade
  43. when: openshift_pkg_version is defined and openshift_pkg_version.split('-',1).1 | version_compare('3.0.2.900','<')
  44. # If this script errors out ansible will show the default stdout/stderr
  45. # which contains details for the user:
  46. - script: ../files/pre-upgrade-check
  47. - name: Verify upgrade can proceed
  48. hosts: oo_masters_to_config:oo_nodes_to_config
  49. tasks:
  50. - name: Clean yum cache
  51. command: yum clean all
  52. - set_fact:
  53. g_new_service_name: "{{ 'origin' if deployment_type =='origin' else 'atomic-openshift' }}"
  54. - name: Determine available versions
  55. script: ../files/versions.sh {{ g_new_service_name }} openshift
  56. register: g_versions_result
  57. - set_fact:
  58. g_aos_versions: "{{ g_versions_result.stdout | from_yaml }}"
  59. - set_fact:
  60. 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 }}"
  61. - fail:
  62. msg: This playbook requires Origin 1.0.6 or later
  63. when: deployment_type == 'origin' and g_aos_versions.curr_version | version_compare('1.0.6','<')
  64. - fail:
  65. msg: Atomic OpenShift 3.1 packages not found
  66. when: g_aos_versions.curr_version | version_compare('3.0.2.900','<') and (g_aos_versions.avail_version is none or g_aos_versions.avail_version | version_compare('3.0.2.900','<'))
  67. - set_fact:
  68. pre_upgrade_complete: True
  69. ##############################################################################
  70. # Gate on pre-upgrade checks
  71. ##############################################################################
  72. - name: Gate on pre-upgrade checks
  73. hosts: localhost
  74. connection: local
  75. become: no
  76. vars:
  77. pre_upgrade_hosts: "{{ groups.oo_masters_to_config | union(groups.oo_nodes_to_config) }}"
  78. tasks:
  79. - set_fact:
  80. pre_upgrade_completed: "{{ hostvars
  81. | oo_select_keys(pre_upgrade_hosts)
  82. | oo_collect('inventory_hostname', {'pre_upgrade_complete': true}) }}"
  83. - set_fact:
  84. pre_upgrade_failed: "{{ pre_upgrade_hosts | difference(pre_upgrade_completed) }}"
  85. - fail:
  86. msg: "Upgrade cannot continue. The following hosts did not complete pre-upgrade checks: {{ pre_upgrade_failed | join(',') }}"
  87. when: pre_upgrade_failed | length > 0
  88. ###############################################################################
  89. # Backup etcd
  90. ###############################################################################
  91. - name: Backup etcd
  92. hosts: etcd_hosts_to_backup
  93. vars:
  94. embedded_etcd: "{{ openshift.master.embedded_etcd }}"
  95. timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}"
  96. roles:
  97. - openshift_facts
  98. tasks:
  99. # Ensure we persist the etcd role for this host in openshift_facts
  100. - openshift_facts:
  101. role: etcd
  102. local_facts: {}
  103. when: "'etcd' not in openshift"
  104. - stat: path=/var/lib/openshift
  105. register: var_lib_openshift
  106. - stat: path=/var/lib/origin
  107. register: var_lib_origin
  108. - name: Create origin symlink if necessary
  109. file: src=/var/lib/openshift/ dest=/var/lib/origin state=link
  110. when: var_lib_openshift.stat.exists == True and var_lib_origin.stat.exists == False
  111. # TODO: replace shell module with command and update later checks
  112. # We assume to be using the data dir for all backups.
  113. - name: Check available disk space for etcd backup
  114. shell: df --output=avail -k {{ openshift.common.data_dir }} | tail -n 1
  115. register: avail_disk
  116. # TODO: replace shell module with command and update later checks
  117. - name: Check current embedded etcd disk usage
  118. shell: du -k {{ openshift.etcd.etcd_data_dir }} | tail -n 1 | cut -f1
  119. register: etcd_disk_usage
  120. when: embedded_etcd | bool
  121. - name: Abort if insufficient disk space for etcd backup
  122. fail:
  123. msg: >
  124. {{ etcd_disk_usage.stdout }} Kb disk space required for etcd backup,
  125. {{ avail_disk.stdout }} Kb available.
  126. when: (embedded_etcd | bool) and (etcd_disk_usage.stdout|int > avail_disk.stdout|int)
  127. - name: Install etcd (for etcdctl)
  128. yum:
  129. pkg: etcd
  130. state: latest
  131. - name: Generate etcd backup
  132. command: >
  133. etcdctl backup --data-dir={{ openshift.etcd.etcd_data_dir }}
  134. --backup-dir={{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}
  135. - set_fact:
  136. etcd_backup_complete: True
  137. - name: Display location of etcd backup
  138. debug:
  139. msg: "Etcd backup created in {{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}"
  140. ##############################################################################
  141. # Gate on etcd backup
  142. ##############################################################################
  143. - name: Gate on etcd backup
  144. hosts: localhost
  145. connection: local
  146. become: no
  147. tasks:
  148. - set_fact:
  149. etcd_backup_completed: "{{ hostvars
  150. | oo_select_keys(groups.etcd_hosts_to_backup)
  151. | oo_collect('inventory_hostname', {'etcd_backup_complete': true}) }}"
  152. - set_fact:
  153. etcd_backup_failed: "{{ groups.etcd_hosts_to_backup | difference(etcd_backup_completed) }}"
  154. - fail:
  155. msg: "Upgrade cannot continue. The following hosts did not complete etcd backup: {{ etcd_backup_failed | join(',') }}"
  156. when: etcd_backup_failed | length > 0
  157. ###############################################################################
  158. # Upgrade Masters
  159. ###############################################################################
  160. - name: Create temp directory for syncing certs
  161. hosts: localhost
  162. connection: local
  163. become: no
  164. gather_facts: no
  165. tasks:
  166. - name: Create local temp directory for syncing certs
  167. local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX
  168. register: g_master_mktemp
  169. changed_when: False
  170. - name: Update deployment type
  171. hosts: oo_masters_to_config:oo_nodes_to_config:oo_etcd_to_config
  172. roles:
  173. - openshift_facts
  174. post_tasks:
  175. - openshift_facts:
  176. role: common
  177. local_facts:
  178. deployment_type: "{{ deployment_type }}"
  179. - name: Update master facts
  180. hosts: oo_masters_to_config
  181. roles:
  182. - openshift_facts
  183. post_tasks:
  184. - openshift_facts:
  185. role: master
  186. local_facts:
  187. cluster_method: "{{ openshift_master_cluster_method | default(None) }}"
  188. - name: Upgrade master packages and configuration
  189. hosts: oo_masters_to_config
  190. vars:
  191. openshift_version: "{{ openshift_pkg_version | default('') }}"
  192. tasks:
  193. - name: Upgrade to latest available kernel
  194. yum:
  195. pkg: kernel
  196. state: latest
  197. - name: Upgrade master packages
  198. command: yum update -y {{ openshift.common.service_type }}-master{{ openshift_version }}
  199. - name: Ensure python-yaml present for config upgrade
  200. yum:
  201. pkg: PyYAML
  202. state: installed
  203. - name: Upgrade master configuration
  204. openshift_upgrade_config:
  205. from_version: '3.0'
  206. to_version: '3.1'
  207. role: master
  208. config_base: "{{ hostvars[inventory_hostname].openshift.common.config_base }}"
  209. - set_fact:
  210. master_certs_missing: True
  211. master_cert_subdir: master-{{ openshift.common.hostname }}
  212. master_cert_config_dir: "{{ openshift.common.config_base }}/master"
  213. - name: Generate missing master certificates
  214. hosts: oo_first_master
  215. vars:
  216. master_hostnames: "{{ hostvars
  217. | oo_select_keys(groups.oo_masters_to_config)
  218. | oo_collect('openshift.common.all_hostnames')
  219. | oo_flatten | unique }}"
  220. master_generated_certs_dir: "{{ openshift.common.config_base }}/generated-configs"
  221. masters_needing_certs: "{{ hostvars
  222. | oo_select_keys(groups.oo_masters_to_config)
  223. | difference([groups.oo_first_master.0]) }}"
  224. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  225. openshift_deployment_type: "{{ deployment_type }}"
  226. roles:
  227. - openshift_master_certificates
  228. post_tasks:
  229. - name: Remove generated etcd client certs when using external etcd
  230. file:
  231. path: "{{ master_generated_certs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}"
  232. state: absent
  233. when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config
  234. with_nested:
  235. - masters_needing_certs
  236. - - master.etcd-client.crt
  237. - master.etcd-client.key
  238. - name: Create a tarball of the master certs
  239. command: >
  240. tar -czvf {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz
  241. -C {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }} .
  242. with_items: masters_needing_certs
  243. - name: Retrieve the master cert tarball from the master
  244. fetch:
  245. src: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz"
  246. dest: "{{ sync_tmpdir }}/"
  247. flat: yes
  248. fail_on_missing: yes
  249. validate_checksum: yes
  250. with_items: masters_needing_certs
  251. - name: Sync generated certs, update service config and restart master services
  252. hosts: oo_masters_to_config
  253. vars:
  254. sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"
  255. openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
  256. openshift_deployment_type: "{{ deployment_type }}"
  257. tasks:
  258. - name: Unarchive the tarball on the master
  259. unarchive:
  260. src: "{{ sync_tmpdir }}/{{ master_cert_subdir }}.tgz"
  261. dest: "{{ master_cert_config_dir }}"
  262. when: inventory_hostname != groups.oo_first_master.0
  263. - name: Restart master service
  264. service: name="{{ openshift.common.service_type}}-master" state=restarted
  265. when: not openshift_master_ha | bool
  266. - name: Ensure the master service is enabled
  267. service: name="{{ openshift.common.service_type}}-master" state=started enabled=yes
  268. when: not openshift_master_ha | bool
  269. - name: Check for configured cluster
  270. stat:
  271. path: /etc/corosync/corosync.conf
  272. register: corosync_conf
  273. when: openshift_master_ha | bool
  274. - name: Destroy cluster
  275. command: pcs cluster destroy --all
  276. when: openshift_master_ha | bool and corosync_conf.stat.exists == true
  277. run_once: true
  278. - name: Start pcsd
  279. service: name=pcsd enabled=yes state=started
  280. when: openshift_master_ha | bool
  281. - name: Re-create cluster
  282. hosts: oo_first_master
  283. vars:
  284. openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
  285. openshift_deployment_type: "{{ deployment_type }}"
  286. omc_cluster_hosts: "{{ groups.oo_masters_to_config | join(' ') }}"
  287. roles:
  288. - role: openshift_master_cluster
  289. when: openshift_master_ha | bool
  290. - name: Delete temporary directory on localhost
  291. hosts: localhost
  292. connection: local
  293. become: no
  294. gather_facts: no
  295. tasks:
  296. - file: name={{ g_master_mktemp.stdout }} state=absent
  297. changed_when: False
  298. - name: Set master update status to complete
  299. hosts: oo_masters_to_config
  300. tasks:
  301. - set_fact:
  302. master_update_complete: True
  303. ##############################################################################
  304. # Gate on master update complete
  305. ##############################################################################
  306. - name: Gate on master update
  307. hosts: localhost
  308. connection: local
  309. become: no
  310. tasks:
  311. - set_fact:
  312. master_update_completed: "{{ hostvars
  313. | oo_select_keys(groups.oo_masters_to_config)
  314. | oo_collect('inventory_hostname', {'master_update_complete': true}) }}"
  315. - set_fact:
  316. master_update_failed: "{{ groups.oo_masters_to_config | difference(master_update_completed) }}"
  317. - fail:
  318. msg: "Upgrade cannot continue. The following masters did not finish updating: {{ master_update_failed | join(',') }}"
  319. when: master_update_failed | length > 0
  320. ###############################################################################
  321. # Upgrade Nodes
  322. ###############################################################################
  323. - name: Upgrade nodes
  324. hosts: oo_nodes_to_config
  325. vars:
  326. openshift_version: "{{ openshift_pkg_version | default('') }}"
  327. roles:
  328. - openshift_facts
  329. tasks:
  330. - name: Upgrade node packages
  331. command: yum update -y {{ openshift.common.service_type }}-node{{ openshift_version }}
  332. - name: Restart node service
  333. service: name="{{ openshift.common.service_type }}-node" state=restarted
  334. - name: Ensure node service enabled
  335. service: name="{{ openshift.common.service_type }}-node" state=started enabled=yes
  336. - set_fact:
  337. node_update_complete: True
  338. ##############################################################################
  339. # Gate on nodes update
  340. ##############################################################################
  341. - name: Gate on nodes update
  342. hosts: localhost
  343. connection: local
  344. become: no
  345. tasks:
  346. - set_fact:
  347. node_update_completed: "{{ hostvars
  348. | oo_select_keys(groups.oo_nodes_to_config)
  349. | oo_collect('inventory_hostname', {'node_update_complete': true}) }}"
  350. - set_fact:
  351. node_update_failed: "{{ groups.oo_nodes_to_config | difference(node_update_completed) }}"
  352. - fail:
  353. msg: "Upgrade cannot continue. The following nodes did not finish updating: {{ node_update_failed | join(',') }}"
  354. when: node_update_failed | length > 0
  355. ###############################################################################
  356. # Post upgrade - Reconcile Cluster Roles and Cluster Role Bindings
  357. ###############################################################################
  358. - name: Reconcile Cluster Roles and Cluster Role Bindings
  359. hosts: oo_masters_to_config
  360. vars:
  361. origin_reconcile_bindings: "{{ deployment_type == 'origin' and g_new_version | version_compare('1.0.6', '>') }}"
  362. ent_reconcile_bindings: true
  363. openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}"
  364. tasks:
  365. - name: Reconcile Cluster Roles
  366. command: >
  367. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  368. policy reconcile-cluster-roles --confirm
  369. run_once: true
  370. - name: Reconcile Cluster Role Bindings
  371. command: >
  372. {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig
  373. policy reconcile-cluster-role-bindings
  374. --exclude-groups=system:authenticated
  375. --exclude-groups=system:unauthenticated
  376. --exclude-users=system:anonymous
  377. --additive-only=true --confirm
  378. when: origin_reconcile_bindings | bool or ent_reconcile_bindings | bool
  379. run_once: true
  380. - name: Restart master services
  381. service: name="{{ openshift.common.service_type}}-master" state=restarted
  382. when: not openshift_master_ha | bool
  383. - name: Restart master cluster
  384. command: pcs resource restart master
  385. when: openshift_master_ha | bool
  386. run_once: true
  387. - name: Wait for the clustered master service to be available
  388. wait_for:
  389. host: "{{ openshift_master_cluster_vip }}"
  390. port: 8443
  391. state: started
  392. timeout: 180
  393. delay: 90
  394. when: openshift_master_ha | bool
  395. run_once: true
  396. - set_fact:
  397. reconcile_complete: True
  398. ##############################################################################
  399. # Gate on reconcile
  400. ##############################################################################
  401. - name: Gate on reconcile
  402. hosts: localhost
  403. connection: local
  404. become: no
  405. tasks:
  406. - set_fact:
  407. reconcile_completed: "{{ hostvars
  408. | oo_select_keys(groups.oo_masters_to_config)
  409. | oo_collect('inventory_hostname', {'reconcile_complete': true}) }}"
  410. - set_fact:
  411. reconcile_failed: "{{ groups.oo_masters_to_config | difference(reconcile_completed) }}"
  412. - fail:
  413. msg: "Upgrade cannot continue. The following masters did not finish reconciling: {{ reconcile_failed | join(',') }}"
  414. when: reconcile_failed | length > 0
  415. ###############################################################################
  416. # Post upgrade - Upgrade default router, default registry and examples
  417. ###############################################################################
  418. - name: Upgrade default router and default registry
  419. hosts: oo_first_master
  420. vars:
  421. openshift_deployment_type: "{{ deployment_type }}"
  422. registry_image: "{{ openshift.master.registry_url | replace( '${component}', 'docker-registry' ) | replace ( '${version}', 'v' + g_new_version ) }}"
  423. router_image: "{{ openshift.master.registry_url | replace( '${component}', 'haproxy-router' ) | replace ( '${version}', 'v' + g_new_version ) }}"
  424. oc_cmd: "{{ openshift.common.client_binary }} --config={{ openshift.common.config_base }}/master/admin.kubeconfig"
  425. roles:
  426. # Create the new templates shipped in 3.1, existing templates are left
  427. # unmodified. This prevents the subsequent role definition for
  428. # openshift_examples from failing when trying to replace templates that do
  429. # not already exist. We could have potentially done a replace --force to
  430. # create and update in one step.
  431. - openshift_examples
  432. # Update the existing templates
  433. - role: openshift_examples
  434. openshift_examples_import_command: replace
  435. pre_tasks:
  436. - name: Check for default router
  437. command: >
  438. {{ oc_cmd }} get -n default dc/router
  439. register: _default_router
  440. failed_when: false
  441. changed_when: false
  442. - name: Check for allowHostNetwork and allowHostPorts
  443. when: _default_router.rc == 0
  444. shell: >
  445. {{ oc_cmd }} get -o yaml scc/privileged | /usr/bin/grep -e allowHostPorts -e allowHostNetwork
  446. register: _scc
  447. - name: Grant allowHostNetwork and allowHostPorts
  448. when:
  449. - _default_router.rc == 0
  450. - "'false' in _scc.stdout"
  451. command: >
  452. {{ oc_cmd }} patch scc/privileged -p '{"allowHostPorts":true,"allowHostNetwork":true}' --loglevel=9
  453. - name: Update deployment config to 1.0.4/3.0.1 spec
  454. when: _default_router.rc == 0
  455. command: >
  456. {{ oc_cmd }} patch dc/router -p
  457. '{"spec":{"strategy":{"rollingParams":{"updatePercent":-10},"spec":{"serviceAccount":"router","serviceAccountName":"router"}}}}'
  458. - name: Switch to hostNetwork=true
  459. when: _default_router.rc == 0
  460. command: >
  461. {{ oc_cmd }} patch dc/router -p '{"spec":{"template":{"spec":{"hostNetwork":true}}}}'
  462. - name: Update router image to current version
  463. when: _default_router.rc == 0
  464. command: >
  465. {{ oc_cmd }} patch dc/router -p
  466. '{"spec":{"template":{"spec":{"containers":[{"name":"router","image":"{{ router_image }}"}]}}}}'
  467. - name: Check for default registry
  468. command: >
  469. {{ oc_cmd }} get -n default dc/docker-registry
  470. register: _default_registry
  471. failed_when: false
  472. changed_when: false
  473. - name: Update registry image to current version
  474. when: _default_registry.rc == 0
  475. command: >
  476. {{ oc_cmd }} patch dc/docker-registry -p
  477. '{"spec":{"template":{"spec":{"containers":[{"name":"registry","image":"{{ registry_image }}"}]}}}}'