diff options
Diffstat (limited to 'playbooks/adhoc/upgrades')
| -rwxr-xr-x | playbooks/adhoc/upgrades/library/openshift_upgrade_config.py | 117 | ||||
| -rw-r--r-- | playbooks/adhoc/upgrades/upgrade.yml | 121 | 
2 files changed, 216 insertions, 22 deletions
| diff --git a/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py b/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py new file mode 100755 index 000000000..60f4fd8b8 --- /dev/null +++ b/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py @@ -0,0 +1,117 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# vim: expandtab:tabstop=4:shiftwidth=4 + +"""Ansible module for modifying OpenShift configs during an upgrade""" + +import os +import shutil +import yaml + +from datetime import datetime + +DOCUMENTATION = ''' +--- +module: openshift_upgrade_config +short_description: OpenShift Upgrade Config +author: Jason DeTiberus +requirements: [ ] +''' +EXAMPLES = ''' +''' + +def get_cfg_dir(): +    """Return the correct config directory to use.""" +    cfg_path = '/etc/origin/' +    if not os.path.exists(cfg_path): +        cfg_path = '/etc/openshift/' +    return cfg_path + + +def upgrade_master_3_0_to_3_1(backup): +    """Main upgrade method for 3.0 to 3.1.""" +    changed = False + +    # Facts do not get transferred to the hosts where custom modules run, +    # need to make some assumptions here. +    master_config = os.path.join(get_cfg_dir(), 'master/master-config.yaml') + +    master_cfg_file = open(master_config, 'r') +    config = yaml.safe_load(master_cfg_file.read()) +    master_cfg_file.close() + +    # Remove v1beta3 from apiLevels: +    if 'apiLevels' in config and \ +        'v1beta3' in config['apiLevels']: +        config['apiLevels'].remove('v1beta3') +        changed = True +    if 'apiLevels' in config['kubernetesMasterConfig'] and \ +        'v1beta3' in config['kubernetesMasterConfig']['apiLevels']: +        config['kubernetesMasterConfig']['apiLevels'].remove('v1beta3') +        changed = True + +    # Add the new master proxy client certs: +    # TODO: re-enable this once these certs are generated during upgrade: +#    if 'proxyClientInfo' not in config['kubernetesMasterConfig']: +#        config['kubernetesMasterConfig']['proxyClientInfo'] = { +#            'certFile': 'master.proxy-client.crt', +#            'keyFile': 'master.proxy-client.key' +#       } + +    if changed: +        if backup: +            timestamp = datetime.now().strftime('%Y%m%d%H%M%S') +            basedir = os.path.split(master_config)[0] +            backup_file = os.path.join(basedir, 'master-config.yaml.bak-%s' +                                       % timestamp) +            shutil.copyfile(master_config, backup_file) +        # Write the modified config: +        out_file = open(master_config, 'w') +        out_file.write(yaml.safe_dump(config, default_flow_style=False)) +        out_file.close() + +    return changed + + +def upgrade_master(from_version, to_version, backup): +    """Upgrade entry point.""" +    if from_version == '3.0': +        if to_version == '3.1': +            return upgrade_master_3_0_to_3_1(backup) + + +def main(): +    """ main """ +    # disabling pylint errors for global-variable-undefined and invalid-name +    # for 'global module' usage, since it is required to use ansible_facts +    # pylint: disable=global-variable-undefined, invalid-name +    global module + +    module = AnsibleModule( +        argument_spec=dict( +            from_version=dict(required=True, choices=['3.0']), +            to_version=dict(required=True, choices=['3.1']), +            role=dict(required=True, choices=['master']), +            backup=dict(required=False, default=True, type='bool') +        ), +        supports_check_mode=True, +    ) + +    from_version = module.params['from_version'] +    to_version = module.params['to_version'] +    role = module.params['role'] +    backup = module.params['backup'] + +    changed = False +    if role == 'master': +        changed = upgrade_master(from_version, to_version, backup) + +    return module.exit_json(changed=changed) + +# ignore pylint errors related to the module_utils import +# pylint: disable=redefined-builtin, unused-wildcard-import, wildcard-import +# import module snippets +from ansible.module_utils.basic import * + +if __name__ == '__main__': +    main() diff --git a/playbooks/adhoc/upgrades/upgrade.yml b/playbooks/adhoc/upgrades/upgrade.yml index ae1d0127c..09f991b1d 100644 --- a/playbooks/adhoc/upgrades/upgrade.yml +++ b/playbooks/adhoc/upgrades/upgrade.yml @@ -1,4 +1,57 @@  --- +- name: Update deployment type +  hosts: OSEv3 +  roles: +  - openshift_facts +  post_tasks: # technically tasks are run after roles, but post_tasks is a bit more explicit. +  - openshift_facts: +      role: common +      local_facts: +        deployment_type: "{{ deployment_type }}" + +- name: Verify upgrade can proceed +  hosts: masters +  tasks: +  # Checking the global deployment type rather than host facts, this is about +  # what the user is requesting. +    - fail: msg="Deployment type enterprise not supported for upgrade" +      when: deployment_type == "enterprise" + +- name: Backup etcd +  hosts: masters +  vars: +    embedded_etcd: "{{ openshift.master.embedded_etcd }}" +    timestamp: "{{ lookup('pipe', 'date +%Y%m%d%H%M%S') }}" +  roles: +  - openshift_facts +  tasks: +  - stat: path=/var/lib/openshift +    register: var_lib_openshift +  - name: Create origin symlink if necessary +    file: src=/var/lib/openshift/ dest=/var/lib/origin state=link +    when: var_lib_openshift.stat.exists == True +  - name: Check available disk space for etcd backup +    # We assume to be using the data dir for all backups. +    shell: > +      df --output=avail -k {{ openshift.common.data_dir }} | tail -n 1 +    register: avail_disk + +  - name: Check current embedded etcd disk usage +    shell: > +      du -k {{ openshift.master.etcd_data_dir }} | tail -n 1 | cut -f1 +    register: etcd_disk_usage +    when: embedded_etcd | bool + +  - name: Abort if insufficient disk space for etcd backup +    fail: msg="{{ etcd_disk_usage.stdout }} Kb disk space required for etcd backup, {{ avail_disk.stdout }} Kb available." +    when: (embedded_etcd | bool) and (etcd_disk_usage.stdout|int > avail_disk.stdout|int) +  - name: Install etcd (for etcdctl) +    yum: pkg=etcd state=latest +  - name: Generate etcd backup +    command: etcdctl backup --data-dir={{ openshift.master.etcd_data_dir }} --backup-dir={{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }} +  - name: Display location of etcd backup +    debug: msg="Etcd backup created in {{ openshift.common.data_dir }}/etcd-backup-{{ timestamp }}" +  - name: Upgrade base package on masters    hosts: masters    roles: @@ -9,22 +62,58 @@      - name: Upgrade base package        yum: pkg={{ openshift.common.service_type }}{{ openshift_version  }} state=latest -- name: Re-Run cluster configuration to apply latest configuration changes -  include: ../../common/openshift-cluster/config.yml +- name: Evaluate oo_first_master +  hosts: localhost    vars: -    g_etcd_group: "{{ 'etcd' }}"      g_masters_group: "{{ 'masters' }}" -    g_nodes_group: "{{ 'nodes' }}" -    openshift_cluster_id: "{{ cluster_id | default('default') }}" -    openshift_deployment_type: "{{ deployment_type }}" +  tasks: +    - name: Evaluate oo_first_master +      add_host: +        name: "{{ groups[g_masters_group][0] }}" +        groups: oo_first_master +        ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +        ansible_sudo: "{{ g_sudo | default(omit) }}" +      when: g_masters_group in groups and (groups[g_masters_group] | length) > 0 + +# TODO: ideally we would check the new version, without installing it. (some +# kind of yum repoquery? would need to handle openshift -> atomic-openshift +# package rename) +- name: Perform upgrade version checking +  hosts: oo_first_master +  tasks: +    - name: Determine new version +      command: > +        rpm -q --queryformat '%{version}' {{ openshift.common.service_type }} +      register: _new_version + +- name: Ensure AOS 3.0.2 or Origin 1.0.6 +  hosts: oo_first_master +  tasks: +    fail: This playbook requires Origin 1.0.6 or Atomic OpenShift 3.0.2 or later +    when: _new_version.stdout | version_compare('1.0.6','<') or ( _new_version.stdout | version_compare('3.0','>=' and _new_version.stdout | version_compare('3.0.2','<') ) + +- name: Verify upgrade can proceed +  hosts: oo_first_master +  tasks: +  # Checking the global deployment type rather than host facts, this is about +  # what the user is requesting. +  - fail: msg="Deployment type 'enterprise' must be updated to 'openshift-enterprise' for upgrade to proceed" +    when: deployment_type == "enterprise" and (_new_version.stdout | version_compare('1.0.7', '>=') or _new_version.stdout | version_compare('3.1', '>='))  - name: Upgrade masters    hosts: masters    vars:      openshift_version: "{{ openshift_pkg_version | default('') }}"    tasks: +    - name: Upgrade to latest available kernel +      yum: pkg=kernel state=latest +    - name: display just the deployment_type variable for the current host +      debug: +        var: hostvars[inventory_hostname]      - name: Upgrade master packages -      yum: pkg={{ openshift.common.service_type }}-master{{ openshift_version }} state=latest +      command: yum update -y {{ openshift.common.service_type }}-master{{ openshift_version }} +    - name: Upgrade master configuration. +      openshift_upgrade_config: from_version=3.0 to_version=3.1 role=master      - name: Restart master services        service: name="{{ openshift.common.service_type}}-master" state=restarted @@ -32,26 +121,14 @@    hosts: nodes    vars:      openshift_version: "{{ openshift_pkg_version | default('') }}" +  roles: +  - openshift_facts    tasks:      - name: Upgrade node packages -      yum: pkg={{ openshift.common.service_type }}-node{{ openshift_version }} state=latest +      command: yum update -y {{ openshift.common.service_type }}-node{{ openshift_version }}      - name: Restart node services        service: name="{{ openshift.common.service_type }}-node" state=restarted -- name: Determine new master version -  hosts: oo_first_master -  tasks: -    - name: Determine new version -      command: > -        rpm -q --queryformat '%{version}' {{ openshift.common.service_type }}-master -      register: _new_version - -- name: Ensure AOS 3.0.2 or Origin 1.0.6 -  hosts: oo_first_master -  tasks: -    fail: This playbook requires Origin 1.0.6 or Atomic OpenShift 3.0.2 or later -    when: _new_version.stdout | version_compare('1.0.6','<') or ( _new_version.stdout | version_compare('3.0','>=' and _new_version.stdout | version_compare('3.0.2','<') ) -  - name: Update cluster policy    hosts: oo_first_master    tasks: | 
