diff options
Diffstat (limited to 'playbooks')
23 files changed, 914 insertions, 129 deletions
| diff --git a/playbooks/adhoc/docker_loopback_to_lvm/ops-docker-loopback-to-direct-lvm.yml b/playbooks/adhoc/docker_loopback_to_lvm/ops-docker-loopback-to-direct-lvm.yml index 614b2537a..72fcd77b3 100755 --- a/playbooks/adhoc/docker_loopback_to_lvm/ops-docker-loopback-to-direct-lvm.yml +++ b/playbooks/adhoc/docker_loopback_to_lvm/ops-docker-loopback-to-direct-lvm.yml @@ -97,8 +97,19 @@    - debug: var=setup_output +  - name: extend the vg +    command: lvextend -l 90%VG /dev/docker_vg/docker-pool +    register: extend_output + +  - debug: var=extend_output +    - name: start docker -    command: systemctl start docker.service -    register: dockerstart +    service: +      name: docker +      state: restarted + +  - name: docker info +    command: docker info +    register: dockerinfo -  - debug: var=dockerstart +  - debug: var=dockerinfo diff --git a/playbooks/adhoc/uninstall.yml b/playbooks/adhoc/uninstall.yml index 40db668da..e05ab43f8 100644 --- a/playbooks/adhoc/uninstall.yml +++ b/playbooks/adhoc/uninstall.yml @@ -1,6 +1,6 @@  # This deletes *ALL* Origin, Atomic Enterprise Platform and OpenShift  # Enterprise content installed by ansible.  This includes: -#  +#  #    configuration  #    containers  #    example templates and imagestreams @@ -13,6 +13,20 @@    sudo: yes    tasks: +    - name: Detecting Operating System +      shell: ls /run/ostree-booted +      ignore_errors: yes +      failed_when: false +      register: ostree_output + +    - set_fact: +        is_atomic: "{{ ostree_output.rc == 0 }}" + +    - name: Remove br0 interface +      shell: ovs-vsctl del-br br0 +      changed_when: False +      failed_when: False +      - service: name={{ item }} state=stopped        with_items:          - atomic-enterprise-master @@ -31,8 +45,10 @@          - origin-master-api          - origin-master-controllers          - origin-node +        - pcsd      - yum: name={{ item }} state=absent +      when: not is_atomic | bool        with_items:          - atomic-enterprise          - atomic-enterprise-master @@ -44,6 +60,7 @@          - atomic-openshift-node          - atomic-openshift-sdn-ovs          - etcd +        - corosync          - openshift          - openshift-master          - openshift-node @@ -54,11 +71,22 @@          - origin-master          - origin-node          - origin-sdn-ovs +        - pacemaker +        - pcs          - tuned-profiles-atomic-enterprise-node          - tuned-profiles-atomic-openshift-node          - tuned-profiles-openshift-node          - tuned-profiles-origin-node +    - name: Remove linux interfaces +      shell: ip link del "{{ item }}" +      changed_when: False +      failed_when: False +      with_items: +        - lbr0 +        - vlinuxbr +        - vovsbr +      - shell: systemctl reset-failed        changed_when: False @@ -112,8 +140,10 @@      - file: path={{ item }} state=absent        with_items: +        - "~{{ ansible_ssh_user }}/.kube"          - /etc/ansible/facts.d/openshift.fact          - /etc/atomic-enterprise +        - /etc/corosync          - /etc/etcd          - /etc/openshift          - /etc/openshift-sdn @@ -127,8 +157,13 @@          - /etc/sysconfig/origin-master          - /etc/sysconfig/origin-node          - /root/.kube +        - /run/openshift-sdn          - /usr/share/openshift/examples          - /var/lib/atomic-enterprise          - /var/lib/etcd          - /var/lib/openshift          - /var/lib/origin +        - /var/lib/pacemaker + +    - name: restart docker +      service: name=docker state=restarted diff --git a/playbooks/adhoc/upgrades/files/pre-upgrade-check b/playbooks/adhoc/upgrades/files/pre-upgrade-check new file mode 100644 index 000000000..ed4ab6d1b --- /dev/null +++ b/playbooks/adhoc/upgrades/files/pre-upgrade-check @@ -0,0 +1,188 @@ +#!/usr/bin/env python +""" +Pre-upgrade checks that must be run on a master before proceeding with upgrade. +""" +# This is a script not a python module: +# pylint: disable=invalid-name + +# NOTE: This script should not require any python libs other than what is +# in the standard library. + +__license__ = "ASL 2.0" + +import json +import os +import subprocess +import re + +# The maximum length of container.ports.name +ALLOWED_LENGTH = 15 +# The valid structure of container.ports.name +ALLOWED_CHARS = re.compile('^[a-z0-9][a-z0-9\\-]*[a-z0-9]$') +AT_LEAST_ONE_LETTER = re.compile('[a-z]') +# look at OS_PATH for the full path. Default ot 'oc' +OC_PATH = os.getenv('OC_PATH', 'oc') + + +def validate(value): +    """ +    validate verifies that value matches required conventions + +    Rules of container.ports.name validation: + +    * must be less that 16 chars +    * at least one letter +    * only a-z0-9- +    * hyphens can not be leading or trailing or next to each other + +    :Parameters: +       - `value`: Value to validate +    """ +    if len(value) > ALLOWED_LENGTH: +        return False + +    if '--' in value: +        return False + +    # We search since it can be anywhere +    if not AT_LEAST_ONE_LETTER.search(value): +        return False + +    # We match because it must start at the beginning +    if not ALLOWED_CHARS.match(value): +        return False +    return True + + +def list_items(kind): +    """ +    list_items returns a list of items from the api + +    :Parameters: +       - `kind`: Kind of item to access +    """ +    response = subprocess.check_output([OC_PATH, 'get', '--all-namespaces', '-o', 'json', kind]) +    items = json.loads(response) +    return items.get("items", []) + + +def get(obj, *paths): +    """ +    Gets an object + +    :Parameters: +       - `obj`: A dictionary structure +       - `path`: All other non-keyword arguments +    """ +    ret_obj = obj +    for path in paths: +        if ret_obj.get(path, None) is None: +            return [] +        ret_obj = ret_obj[path] +    return ret_obj + + +# pylint: disable=too-many-arguments +def pretty_print_errors(namespace, kind, item_name, container_name, port_name, valid): +    """ +    Prints out results in human friendly way. + +    :Parameters: +       - `namespace`: Namespace of the resource +       - `kind`: Kind of the resource +       - `item_name`: Name of the resource +       - `container_name`: Name of the container. May be "" when kind=Service. +       - `port_name`: Name of the port +       - `valid`: True if the port is valid +    """ +    if not valid: +        if len(container_name) > 0: +            print('%s/%s -n %s (Container="%s" Port="%s")' % ( +                kind, item_name, namespace, container_name, port_name)) +        else: +            print('%s/%s -n %s (Port="%s")' % ( +                kind, item_name, namespace, port_name)) + + +def print_validation_header(): +    """ +    Prints the error header. Should run on the first error to avoid +    overwhelming the user. +    """ +    print """\ +At least one port name does not validate. Valid port names: + +    * must be less that 16 chars +    * have at least one letter +    * only a-z0-9- +    * do not start or end with - +    * Dashes may not be next to eachother ('--') +""" + + +def main(): +    """ +    main is the main entry point to this script +    """ +    try: +        # the comma at the end suppresses the newline +        print "Checking for oc ...", +        subprocess.check_output([OC_PATH, 'whoami']) +        print "found" +    except: +        print( +            'Unable to run "%s whoami"\n' +            'Please ensure OpenShift is running, and "oc" is on your system ' +            'path.\n' +            'You can override the path with the OC_PATH environment variable.' +            % OC_PATH) +        raise SystemExit(1) + +    # Where the magic happens +    first_error = True +    for kind, path in [ +            ('replicationcontrollers', ("spec", "template", "spec", "containers")), +            ('pods', ("spec", "containers")), +            ('deploymentconfigs', ("spec", "template", "spec", "containers"))]: +        for item in list_items(kind): +            namespace = item["metadata"]["namespace"] +            item_name = item["metadata"]["name"] +            for container in get(item, *path): +                container_name = container["name"] +                for port in get(container, "ports"): +                    port_name = port.get("name", None) +                    if not port_name: +                        # Unnamed ports are OK +                        continue +                    valid = validate(port_name) +                    if not valid and first_error: +                        first_error = False +                        print_validation_header() +                    pretty_print_errors( +                        namespace, kind, item_name, +                        container_name, port_name, valid) + +    # Services follow a different flow +    for item in list_items('services'): +        namespace = item["metadata"]["namespace"] +        item_name = item["metadata"]["name"] +        for port in get(item, "spec", "ports"): +            port_name = port.get("targetPort", None) +            if isinstance(port_name, int) or port_name is None: +                # Integer only or unnamed ports are OK +                continue +            valid = validate(port_name) +            if not valid and first_error: +                first_error = False +                print_validation_header() +            pretty_print_errors( +                namespace, "services", item_name, "", port_name, valid) + +    # If we had at least 1 error then exit with 1 +    if not first_error: +        raise SystemExit(1) + + +if __name__ == '__main__': +    main() + diff --git a/playbooks/adhoc/upgrades/files/versions.sh b/playbooks/adhoc/upgrades/files/versions.sh new file mode 100644 index 000000000..f90719cab --- /dev/null +++ b/playbooks/adhoc/upgrades/files/versions.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +yum_installed=$(yum list installed "$@" 2>&1 | tail -n +2 | grep -v 'Installed Packages' | grep -v 'Red Hat Subscription Management' | grep -v 'Error:' | awk '{ print $2 }' | tr '\n' ' ') + +yum_available=$(yum list available "$@" 2>&1 | tail -n +2 | grep -v 'Available Packages' | grep -v 'Red Hat Subscription Management' | grep -v 'el7ose' | grep -v 'Error:' | awk '{ print $2 }' | tr '\n' ' ') + + +echo "---" +echo "curr_version: ${yum_installed}"  +echo "avail_version: ${yum_available}" 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..a6721bb92 --- /dev/null +++ b/playbooks/adhoc/upgrades/library/openshift_upgrade_config.py @@ -0,0 +1,154 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# vim: expandtab:tabstop=4:shiftwidth=4 + +"""Ansible module for modifying OpenShift configs during an upgrade""" + +import os +import yaml + +DOCUMENTATION = ''' +--- +module: openshift_upgrade_config +short_description: OpenShift Upgrade Config +author: Jason DeTiberus +requirements: [ ] +''' +EXAMPLES = ''' +''' + +def modify_api_levels(level_list, remove, ensure, msg_prepend='', +                      msg_append=''): +    """ modify_api_levels """ +    changed = False +    changes = [] + +    if not isinstance(remove, list): +        remove = [] + +    if not isinstance(ensure, list): +        ensure = [] + +    if not isinstance(level_list, list): +        new_list = [] +        changed = True +        changes.append("%s created missing %s" % (msg_prepend, msg_append)) +    else: +        new_list = level_list +        for level in remove: +            if level in new_list: +                new_list.remove(level) +                changed = True +                changes.append("%s removed %s %s" % (msg_prepend, level, msg_append)) + +    for level in ensure: +        if level not in new_list: +            new_list.append(level) +            changed = True +            changes.append("%s added %s %s" % (msg_prepend, level, msg_append)) + +    return {'new_list': new_list, 'changed': changed, 'changes': changes} + + +def upgrade_master_3_0_to_3_1(ansible_module, config_base, backup): +    """Main upgrade method for 3.0 to 3.1.""" +    changes = [] + +    # Facts do not get transferred to the hosts where custom modules run, +    # need to make some assumptions here. +    master_config = os.path.join(config_base, 'master/master-config.yaml') + +    master_cfg_file = open(master_config, 'r') +    config = yaml.safe_load(master_cfg_file.read()) +    master_cfg_file.close() + + +    # Remove unsupported api versions and ensure supported api versions from +    # master config +    unsupported_levels = ['v1beta1', 'v1beta2', 'v1beta3'] +    supported_levels = ['v1'] + +    result = modify_api_levels(config.get('apiLevels'), unsupported_levels, +                               supported_levels, 'master-config.yaml:', 'from apiLevels') +    if result['changed']: +        config['apiLevels'] = result['new_list'] +        changes.append(result['changes']) + +    if 'kubernetesMasterConfig' in config and 'apiLevels' in config['kubernetesMasterConfig']: +        config['kubernetesMasterConfig'].pop('apiLevels') +        changes.append('master-config.yaml: removed kubernetesMasterConfig.apiLevels') + +    # Add proxyClientInfo to master-config +    if 'proxyClientInfo' not in config['kubernetesMasterConfig']: +        config['kubernetesMasterConfig']['proxyClientInfo'] = { +            'certFile': 'master.proxy-client.crt', +            'keyFile': 'master.proxy-client.key' +        } +        changes.append("master-config.yaml: added proxyClientInfo") + +    if len(changes) > 0: +        if backup: +            # TODO: Check success: +            ansible_module.backup_local(master_config) + +        # 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 changes + + +def upgrade_master(ansible_module, config_base, 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(ansible_module, config_base, 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, +    # redefined-outer-name +    global module + +    module = AnsibleModule( +        argument_spec=dict( +            config_base=dict(required=True), +            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'] +    config_base = module.params['config_base'] + +    try: +        changes = [] +        if role == 'master': +            changes = upgrade_master(module, config_base, from_version, +                                     to_version, backup) + +        changed = len(changes) > 0 +        return module.exit_json(changed=changed, changes=changes) + +    # ignore broad-except error to avoid stack trace to ansible user +    # pylint: disable=broad-except +    except Exception, e: +        return module.fail_json(msg=str(e)) + +# 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..1b6b5757c 100644 --- a/playbooks/adhoc/upgrades/upgrade.yml +++ b/playbooks/adhoc/upgrades/upgrade.yml @@ -1,68 +1,302 @@  --- -- name: Upgrade base package on masters +- name: Load master facts    hosts: masters    roles:    - openshift_facts + +- name: Verify upgrade can proceed +  hosts: masters[0]    vars: -    openshift_version: "{{ openshift_pkg_version | default('') }}" +    openshift_master_ha: "{{ groups['masters'] | length > 1 }}" +  gather_facts: no +  tasks: +    # Pacemaker is currently the only supported upgrade path for multiple masters +    - fail: +        msg: "openshift_master_cluster_method must be set to 'pacemaker'" +      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")) + +- name: Run pre-upgrade checks on first master +  hosts: masters[0] +  tasks: +  # If this script errors out ansible will show the default stdout/stderr +  # which contains details for the user: +  - script: files/pre-upgrade-check + +- name: Evaluate etcd_hosts +  hosts: localhost    tasks: -    - name: Upgrade base package -      yum: pkg={{ openshift.common.service_type }}{{ openshift_version  }} state=latest +  - name: Evaluate etcd hosts +    add_host: +      name: "{{ groups.masters.0 }}" +      groups: etcd_hosts +    when: hostvars[groups.masters.0].openshift.master.embedded_etcd | bool +  - name: Evaluate etcd hosts +    add_host: +      name: "{{ item }}" +      groups: etcd_hosts +    with_items: groups.etcd +    when: not hostvars[groups.masters.0].openshift.master.embedded_etcd | bool -- name: Re-Run cluster configuration to apply latest configuration changes -  include: ../../common/openshift-cluster/config.yml +- name: Backup etcd +  hosts: etcd_hosts    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 }}" +    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 + +  - stat: path=/var/lib/origin +    register: var_lib_origin + +  - name: Create origin symlink if necessary +    file: src=/var/lib/openshift/ dest=/var/lib/origin state=link +    when: var_lib_openshift.stat.exists == True and var_lib_origin.stat.exists == False + +  - 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: Update deployment type +  hosts: OSEv3 +  roles: +  - openshift_facts +  post_tasks: +  - openshift_facts: +      role: common +      local_facts: +        deployment_type: "{{ deployment_type }}" + + +- name: Perform upgrade version checking +  hosts: masters[0] +  tasks: +  - name: Clean yum cache +    command: yum clean all + +  - name: Determine available versions +    script: files/versions.sh {{ openshift.common.service_type }} openshift +    register: g_versions_result + +  - set_fact: +      g_aos_versions: "{{ g_versions_result.stdout | from_yaml }}" + +  - set_fact: +      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 }}" + +  - fail: +      msg: This playbook requires Origin 1.0.6 or later +    when: deployment_type == 'origin' and g_aos_versions.curr_version | version_compare('1.0.6','<') + +  - fail: +      msg: This playbook requires Atomic OpenShift 3.0.2 or later +    when: deployment_type in ['openshift-enterprise', 'atomic-openshift'] and g_aos_versions.curr_version | version_compare('3.0.2','<') + +  - fail: +      msg: Atomic OpenShift 3.1 packages not found +    when: deployment_type in ['openshift-enterprise', 'atomic-openshift'] and 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','<')) +  # Deployment type 'enterprise' is no longer valid if we're upgrading to 3.1 or beyond. +  # (still valid for 3.0.x to 3.0.y however) Using the global deployment_type here as +  # we're checking what was requested by the upgrade, not the current type on the system. +  - fail: +      msg: "Deployment type enterprise not supported for upgrade" +    when: deployment_type == "enterprise" and  g_aos_versions.curr_version | 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: Upgrade master packages -      yum: pkg={{ openshift.common.service_type }}-master{{ openshift_version }} state=latest -    - name: Restart master services -      service: name="{{ openshift.common.service_type}}-master" state=restarted +      command: yum update -y {{ openshift.common.service_type }}-master{{ openshift_version }} + +    - name: Ensure python-yaml present for config upgrade +      yum: +        pkg: python-yaml +        state: installed + +    - name: Upgrade master configuration +      openshift_upgrade_config: +        from_version: '3.0' +        to_version: '3.1' +        role: master +        config_base: "{{ hostvars[inventory_hostname].openshift.common.config_base }}" +      when: deployment_type in ['openshift-enterprise', 'atomic-enterprise'] and g_aos_versions.curr_version | version_compare('3.1', '>=') + +    - set_fact: +        master_certs_missing: True +        master_cert_subdir: master-{{ openshift.common.hostname }} +        master_cert_config_dir: "{{ openshift.common.config_base }}/master" + +- name: Create temp directory for syncing certs +  hosts: localhost +  gather_facts: no +  tasks: +  - name: Create local temp directory for syncing certs +    local_action: command mktemp -d /tmp/openshift-ansible-XXXXXXX +    register: g_master_mktemp +    changed_when: False + +- name: Generate missing master certificates +  hosts: masters[0] +  vars: +    master_hostnames: "{{ hostvars +                          | oo_select_keys(groups.masters) +                          | oo_collect('openshift.common.all_hostnames') +                          | oo_flatten | unique }}" +    master_generated_certs_dir: "{{ openshift.common.config_base }}/generated-configs" +    masters_needing_certs: "{{ hostvars +                               | oo_select_keys(groups.masters) +                               | difference([groups.masters.0]) }}" +    sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}" +    openshift_deployment_type: "{{ deployment_type }}" +  roles: +  - openshift_master_certificates +  post_tasks: +  - name: Remove generated etcd client certs when using external etcd +    file: +      path: "{{ master_generated_certs_dir }}/{{ item.0.master_cert_subdir }}/{{ item.1 }}" +      state: absent +    when: groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config +    with_nested: +    - masters_needing_certs +    - - master.etcd-client.crt +      - master.etcd-client.key + +  - name: Create a tarball of the master certs +    command: > +      tar -czvf {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz +        -C {{ master_generated_certs_dir }}/{{ item.master_cert_subdir }} . +    with_items: masters_needing_certs + +  - name: Retrieve the master cert tarball from the master +    fetch: +      src: "{{ master_generated_certs_dir }}/{{ item.master_cert_subdir }}.tgz" +      dest: "{{ sync_tmpdir }}/" +      flat: yes +      fail_on_missing: yes +      validate_checksum: yes +    with_items: masters_needing_certs + +- name: Sync certs and restart masters post configuration change +  hosts: masters +  vars: +    sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}" +    openshift_master_ha: "{{ groups['masters'] | length > 1 }}" +  tasks: +  - name: Unarchive the tarball on the master +    unarchive: +      src: "{{ sync_tmpdir }}/{{ master_cert_subdir }}.tgz" +      dest: "{{ master_cert_config_dir }}" +    when: inventory_hostname != groups.masters.0 + +  - name: Restart master services +    service: name="{{ openshift.common.service_type}}-master" state=restarted +    when: not openshift_master_ha | bool + +- name: Destroy cluster +  hosts: masters[0] +  vars: +    openshift_master_ha: "{{ groups['masters'] | length > 1 }}" +    openshift_deployment_type: "{{ deployment_type }}" +  pre_tasks: +  - name: Check for configured cluster +    stat: +      path: /etc/corosync/corosync.conf +    register: corosync_conf +    when: openshift_master_ha | bool +  - name: Destroy cluster +    command: pcs cluster destroy --all +    when: openshift_master_ha | bool and corosync_conf.stat.exists == true + +- name: Start pcsd on masters +  hosts: masters +  vars: +    openshift_master_ha: "{{ groups['masters'] | length > 1 }}" +  tasks: +  - name: Start pcsd +    service: name=pcsd state=started +    when: openshift_master_ha | bool + +- name: Re-create cluster +  hosts: masters[0] +  vars: +    openshift_master_ha: "{{ groups['masters'] | length > 1 }}" +    openshift_deployment_type: "{{ deployment_type }}" +    omc_cluster_hosts: "{{ groups.masters | join(' ') }}" +  roles: +  - role: openshift_master_cluster +    when: openshift_master_ha | bool + +- name: Delete temporary directory on localhost +  hosts: localhost +  gather_facts: no +  tasks: +  - file: name={{ g_master_mktemp.stdout }} state=absent +    changed_when: False +  - name: Upgrade nodes    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 +- name: Update cluster policy and policy bindings +  hosts: masters[0] +  vars: +    origin_reconcile_bindings: "{{ deployment_type == 'origin' and g_new_version | version_compare('1.0.6', '>') }}" +    ent_reconcile_bindings: "{{ deployment_type in ['openshift-enterprise', 'atomic-enterprise'] and g_new_version | version_compare('3.0.2','>') }}"    tasks:      - name: oadm policy reconcile-cluster-roles --confirm        command: >          {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig          policy reconcile-cluster-roles --confirm -- name: Update cluster policy bindings -  hosts: oo_first_master -  tasks:      - name: oadm policy reconcile-cluster-role-bindings --confirm        command: >          {{ openshift.common.admin_binary}} --config={{ openshift.common.config_base }}/master/admin.kubeconfig @@ -71,12 +305,40 @@          --exclude-groups=system:unauthenticated          --exclude-users=system:anonymous          --additive-only=true --confirm -      when: ( _new_version.stdout | version_compare('1.0.6', '>') and _new_version.stdout | version_compare('3.0','<') ) or _new_version.stdout | version_compare('3.0.2','>') +      when: origin_reconcile_bindings | bool or ent_reconcile_bindings | bool + -- name: Upgrade default router -  hosts: oo_first_master +- name: Restart masters post reconcile +  hosts: masters    vars: -    - router_image: "{{ openshift.master.registry_url | replace( '${component}', 'haproxy-router' ) | replace ( '${version}', 'v' + _new_version.stdout ) }}" +    openshift_master_ha: "{{ groups['masters'] | length > 1 }}" +  tasks: +    - name: Restart master services +      service: name="{{ openshift.common.service_type}}-master" state=restarted +      when: not openshift_master_ha | bool + +- name: Restart cluster post reconcile +  hosts: masters[0] +  vars: +    openshift_master_ha: "{{ groups['masters'] | length > 1 }}" +  tasks: +    - name: Restart master cluster +      command: pcs resource restart master +      when: openshift_master_ha | bool +    - name: Wait for the clustered master service to be available +      wait_for: +        host: "{{ openshift_master_cluster_vip }}" +        port: 8443 +        state: started +        timeout: 180 +        delay: 90 +      when: openshift_master_ha | bool + +- name: Upgrade default router and registry +  hosts: masters[0] +  vars: +    - registry_image: "{{  openshift.master.registry_url | replace( '${component}', 'docker-registry' )  | replace ( '${version}', 'v' + g_new_version  ) }}" +    - router_image: "{{ openshift.master.registry_url | replace( '${component}', 'haproxy-router' ) | replace ( '${version}', 'v' + g_new_version ) }}"      - oc_cmd: "{{ openshift.common.client_binary }} --config={{ openshift.common.config_base }}/master/admin.kubeconfig"    tasks:      - name: Check for default router @@ -111,12 +373,6 @@          {{ oc_cmd }} patch dc/router -p          '{"spec":{"template":{"spec":{"containers":[{"name":"router","image":"{{ router_image }}"}]}}}}' -- name: Upgrade default -  hosts: oo_first_master -  vars: -    - registry_image: "{{  openshift.master.registry_url | replace( '${component}', 'docker-registry' )  | replace ( '${version}', 'v' + _new_version.stdout  ) }}" -    - oc_cmd: "{{ openshift.common.client_binary }} --config={{ openshift.common.config_base }}/master/admin.kubeconfig" -  tasks:      - name: Check for default registry        command: >            {{ oc_cmd }} get -n default dc/docker-registry @@ -130,7 +386,7 @@          '{"spec":{"template":{"spec":{"containers":[{"name":"registry","image":"{{ registry_image }}"}]}}}}'  - name: Update image streams and templates -  hosts: oo_first_master +  hosts: masters[0]    vars:      openshift_examples_import_command: "update"      openshift_deployment_type: "{{ deployment_type }}" diff --git a/playbooks/aws/openshift-cluster/config.yml b/playbooks/aws/openshift-cluster/config.yml index a8e3e27bb..5aa6b0f9b 100644 --- a/playbooks/aws/openshift-cluster/config.yml +++ b/playbooks/aws/openshift-cluster/config.yml @@ -11,6 +11,7 @@  - include: ../../common/openshift-cluster/config.yml    vars:      g_etcd_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-etcd' }}" +    g_lb_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-lb' }}"      g_masters_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-master' }}"      g_nodes_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-node' }}"      g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}" diff --git a/playbooks/aws/openshift-cluster/launch.yml b/playbooks/aws/openshift-cluster/launch.yml index 786918929..09bf34666 100644 --- a/playbooks/aws/openshift-cluster/launch.yml +++ b/playbooks/aws/openshift-cluster/launch.yml @@ -11,7 +11,7 @@        msg: Deployment type not supported for aws provider yet      when: deployment_type == 'enterprise' -  - include: ../../common/openshift-cluster/set_etcd_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_etcd_launch_facts.yml    - include: tasks/launch_instances.yml      vars:        instances: "{{ etcd_names }}" @@ -19,7 +19,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "default" -  - include: ../../common/openshift-cluster/set_master_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_master_launch_facts.yml    - include: tasks/launch_instances.yml      vars:        instances: "{{ master_names }}" @@ -27,7 +27,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "default" -  - include: ../../common/openshift-cluster/set_node_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_node_launch_facts.yml      vars:        type: "compute"        count: "{{ num_nodes }}" @@ -38,7 +38,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "{{ sub_host_type }}" -  - include: ../../common/openshift-cluster/set_node_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_node_launch_facts.yml      vars:        type: "infra"        count: "{{ num_infra }}" diff --git a/playbooks/byo/openshift-cluster/config.yml b/playbooks/byo/openshift-cluster/config.yml index 9e50a4a18..411c7e660 100644 --- a/playbooks/byo/openshift-cluster/config.yml +++ b/playbooks/byo/openshift-cluster/config.yml @@ -4,6 +4,7 @@      g_etcd_group: "{{ 'etcd' }}"      g_masters_group: "{{ 'masters' }}"      g_nodes_group: "{{ 'nodes' }}" +    g_lb_group: "{{ 'lb' }}"      openshift_cluster_id: "{{ cluster_id | default('default') }}"      openshift_debug_level: 2      openshift_deployment_type: "{{ deployment_type }}" diff --git a/playbooks/common/openshift-cluster/config.yml b/playbooks/common/openshift-cluster/config.yml index 4c74f96db..a8bd634d3 100644 --- a/playbooks/common/openshift-cluster/config.yml +++ b/playbooks/common/openshift-cluster/config.yml @@ -1,68 +1,5 @@  --- -- name: Populate config host groups -  hosts: localhost -  gather_facts: no -  tasks: -  - fail: -      msg: This playbook rquires g_etcd_group to be set -    when: g_etcd_group is not defined - -  - fail: -      msg: This playbook rquires g_masters_group to be set -    when: g_masters_group is not defined - -  - fail: -      msg: This playbook rquires g_nodes_group to be set -    when: g_nodes_group is not defined - -  - name: Evaluate oo_etcd_to_config -    add_host: -      name: "{{ item }}" -      groups: oo_etcd_to_config -      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" -      ansible_sudo: "{{ g_sudo | default(omit) }}" -    with_items: groups[g_etcd_group] | default([]) - -  - name: Evaluate oo_masters_to_config -    add_host: -      name: "{{ item }}" -      groups: oo_masters_to_config -      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" -      ansible_sudo: "{{ g_sudo | default(omit) }}" -    with_items: groups[g_masters_group] | default([]) - -  - name: Evaluate oo_nodes_to_config -    add_host: -      name: "{{ item }}" -      groups: oo_nodes_to_config -      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" -      ansible_sudo: "{{ g_sudo | default(omit) }}" -    with_items: groups[g_nodes_group] | default([]) - -  - name: Evaluate oo_nodes_to_config -    add_host: -      name: "{{ item }}" -      groups: oo_nodes_to_config -      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" -      ansible_sudo: "{{ g_sudo | default(omit) }}" -    with_items: groups[g_masters_group] | default([]) -    when: g_nodeonmaster is defined and g_nodeonmaster == true - -  - name: Evaluate oo_first_etcd -    add_host: -      name: "{{ groups[g_etcd_group][0] }}" -      groups: oo_first_etcd -      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" -      ansible_sudo: "{{ g_sudo | default(omit) }}" -    when: g_etcd_group in groups and (groups[g_etcd_group] | length) > 0 - -  - 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 +- include: evaluate_groups.yml  - include: ../openshift-etcd/config.yml @@ -71,4 +8,4 @@  - include: ../openshift-node/config.yml    vars:      osn_cluster_dns_domain: "{{ hostvars[groups.oo_first_master.0].openshift.dns.domain }}" -    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}" +    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].cluster_dns_ip }}" diff --git a/playbooks/common/openshift-cluster/evaluate_groups.yml b/playbooks/common/openshift-cluster/evaluate_groups.yml new file mode 100644 index 000000000..2bb69614f --- /dev/null +++ b/playbooks/common/openshift-cluster/evaluate_groups.yml @@ -0,0 +1,76 @@ +--- +- name: Populate config host groups +  hosts: localhost +  gather_facts: no +  tasks: +  - fail: +      msg: This playbook requires g_etcd_group to be set +    when: g_etcd_group is not defined + +  - fail: +      msg: This playbook requires g_masters_group to be set +    when: g_masters_group is not defined + +  - fail: +      msg: This playbook requires g_nodes_group to be set +    when: g_nodes_group is not defined + +  - fail: +      msg: This playbook requires g_lb_group to be set +    when: g_lb_group is not defined + +  - name: Evaluate oo_etcd_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_etcd_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_sudo: "{{ g_sudo | default(omit) }}" +    with_items: groups[g_etcd_group] | default([]) + +  - name: Evaluate oo_masters_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_masters_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_sudo: "{{ g_sudo | default(omit) }}" +    with_items: groups[g_masters_group] | default([]) + +  - name: Evaluate oo_nodes_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_nodes_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_sudo: "{{ g_sudo | default(omit) }}" +    with_items: groups[g_nodes_group] | default([]) + +  - name: Evaluate oo_nodes_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_nodes_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_sudo: "{{ g_sudo | default(omit) }}" +    with_items: groups[g_masters_group] | default([]) +    when: g_nodeonmaster is defined and g_nodeonmaster == true + +  - name: Evaluate oo_first_etcd +    add_host: +      name: "{{ groups[g_etcd_group][0] }}" +      groups: oo_first_etcd +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +    when: g_etcd_group in groups and (groups[g_etcd_group] | length) > 0 + +  - 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 + +  - name: Evaluate oo_lb_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_lb_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_sudo: "{{ g_sudo | default(omit) }}" +    with_items: groups[g_lb_group] | default([]) diff --git a/playbooks/common/openshift-cluster/scaleup.yml b/playbooks/common/openshift-cluster/scaleup.yml new file mode 100644 index 000000000..6d2777732 --- /dev/null +++ b/playbooks/common/openshift-cluster/scaleup.yml @@ -0,0 +1,16 @@ +--- +- include: evaluate_groups.yml +  vars: +    g_etcd_group: "{{ 'etcd' }}" +    g_masters_group: "{{ 'masters' }}" +    g_nodes_group: "{{ 'nodes' }}" +    g_lb_group: "{{ 'lb' }}" +    openshift_cluster_id: "{{ cluster_id | default('default') }}" +    openshift_debug_level: 2 +    openshift_deployment_type: "{{ deployment_type }}" + +- include: ../openshift-node/config.yml +  vars: +    osn_cluster_dns_domain: "{{ hostvars[groups.oo_first_master.0].openshift.dns.domain }}" +    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}" +    openshift_deployment_type: "{{ deployment_type }}" diff --git a/playbooks/common/openshift-cluster/set_etcd_launch_facts_tasks.yml b/playbooks/common/openshift-cluster/tasks/set_etcd_launch_facts.yml index 1a6580795..1a6580795 100644 --- a/playbooks/common/openshift-cluster/set_etcd_launch_facts_tasks.yml +++ b/playbooks/common/openshift-cluster/tasks/set_etcd_launch_facts.yml diff --git a/playbooks/common/openshift-cluster/set_master_launch_facts_tasks.yml b/playbooks/common/openshift-cluster/tasks/set_master_launch_facts.yml index 36d7b7870..36d7b7870 100644 --- a/playbooks/common/openshift-cluster/set_master_launch_facts_tasks.yml +++ b/playbooks/common/openshift-cluster/tasks/set_master_launch_facts.yml diff --git a/playbooks/common/openshift-cluster/set_node_launch_facts_tasks.yml b/playbooks/common/openshift-cluster/tasks/set_node_launch_facts.yml index 278942f8b..278942f8b 100644 --- a/playbooks/common/openshift-cluster/set_node_launch_facts_tasks.yml +++ b/playbooks/common/openshift-cluster/tasks/set_node_launch_facts.yml diff --git a/playbooks/common/openshift-master/config.yml b/playbooks/common/openshift-master/config.yml index 54d61da06..b1da85d5d 100644 --- a/playbooks/common/openshift-master/config.yml +++ b/playbooks/common/openshift-master/config.yml @@ -34,7 +34,9 @@        - role: common          local_facts:            hostname: "{{ openshift_hostname | default(None) }}" +          ip: "{{ openshift_ip | default(None) }}"            public_hostname: "{{ openshift_public_hostname | default(None) }}" +          public_ip: "{{ openshift_public_ip | default(None) }}"            deployment_type: "{{ openshift_deployment_type }}"        - role: master          local_facts: @@ -44,7 +46,6 @@            public_api_url: "{{ openshift_master_public_api_url | default(None) }}"            cluster_hostname: "{{ openshift_master_cluster_hostname | default(None) }}"            cluster_public_hostname: "{{ openshift_master_cluster_public_hostname | default(None) }}" -          cluster_defer_ha: "{{ openshift_master_cluster_defer_ha | default(None) }}"            console_path: "{{ openshift_master_console_path | default(None) }}"            console_port: "{{ openshift_master_console_port | default(None) }}"            console_url: "{{ openshift_master_console_url | default(None) }}" @@ -168,6 +169,10 @@      masters_needing_certs: "{{ hostvars                                 | oo_select_keys(groups['oo_masters_to_config'] | difference(groups['oo_first_master']))                                 | oo_filter_list(filter_attr='master_certs_missing') }}" +    master_hostnames: "{{ hostvars +                               | oo_select_keys(groups['oo_masters_to_config']) +                               | oo_collect('openshift.common.all_hostnames') +                               | oo_flatten | unique }}"      sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"    roles:    - openshift_master_certificates @@ -199,12 +204,84 @@        validate_checksum: yes      with_items: masters_needing_certs +- name: Inspect named certificates +  hosts: oo_first_master +  tasks: +  - name: Collect certificate names +    set_fact: +      parsed_named_certificates: "{{ openshift_master_named_certificates | oo_parse_certificate_names(master_cert_config_dir, openshift.common.internal_hostnames) }}" +    when: openshift_master_named_certificates is defined + +- name: Compute haproxy_backend_servers +  hosts: localhost +  connection: local +  sudo: false +  gather_facts: no +  tasks: +  - set_fact: +      haproxy_backend_servers: "{{ hostvars | oo_select_keys(groups['oo_masters_to_config']) | oo_haproxy_backend_masters }}" + +- name: Configure load balancers +  hosts: oo_lb_to_config +  vars: +    sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}" +    haproxy_frontends: +    - name: atomic-openshift-api +      mode: tcp +      options: +      - tcplog +      binds: +      - "*:{{ hostvars[groups.oo_first_master.0].openshift.master.api_port }}" +      default_backend: atomic-openshift-api +    haproxy_backends: +    - name: atomic-openshift-api +      mode: tcp +      option: tcplog +      balance: source +      servers: "{{ hostvars.localhost.haproxy_backend_servers }}" +  roles: +  - role: haproxy +    when: groups.oo_masters_to_config | length > 1 + +- name: Generate master session keys +  hosts: oo_first_master +  tasks: +  - fail: +      msg: "Both openshift_master_session_auth_secrets and openshift_master_session_encryption_secrets must be provided if either variable is set" +    when: (openshift_master_session_auth_secrets is defined and openshift_master_session_encryption_secrets is not defined) or (openshift_master_session_encryption_secrets is defined and openshift_master_session_auth_secrets is not defined) +  - fail: +      msg: "openshift_master_session_auth_secrets and openshift_master_encryption_secrets must be equal length" +    when: (openshift_master_session_auth_secrets is defined and openshift_master_session_encryption_secrets is defined) and (openshift_master_session_auth_secrets | length != openshift_master_session_encryption_secrets | length) +  - name: Generate session authentication key +    command: /usr/bin/openssl rand -base64 24 +    register: session_auth_output +    with_sequence: count=1 +    when: openshift_master_session_auth_secrets is undefined +  - name: Generate session encryption key +    command: /usr/bin/openssl rand -base64 24 +    register: session_encryption_output +    with_sequence: count=1 +    when: openshift_master_session_encryption_secrets is undefined +  - set_fact: +      session_auth_secret: "{{ openshift_master_session_auth_secrets +                                | default(session_auth_output.results +                                | map(attribute='stdout') +                                | list) }}" +      session_encryption_secret: "{{ openshift_master_session_encryption_secrets +                                      | default(session_encryption_output.results +                                      | map(attribute='stdout') +                                      | list) }}" +  - name: Configure master instances    hosts: oo_masters_to_config +  serial: 1    vars: +    named_certificates: "{{ hostvars[groups['oo_first_master'][0]]['parsed_named_certificates'] | default([])}}"      sync_tmpdir: "{{ hostvars.localhost.g_master_mktemp.stdout }}"      openshift_master_ha: "{{ groups.oo_masters_to_config | length > 1 }}" -    embedded_etcd: "{{ openshift.master.embedded_etcd }}" +    openshift_master_count: "{{ groups.oo_masters_to_config | length }}" +    openshift_master_session_auth_secrets: "{{ hostvars[groups['oo_first_master'][0]]['session_auth_secret'] }}" +    openshift_master_session_encryption_secrets: "{{ hostvars[groups['oo_first_master'][0]]['session_encryption_secret'] }}"    pre_tasks:    - name: Ensure certificate directory exists      file: @@ -233,11 +310,25 @@      omc_cluster_hosts: "{{ groups.oo_masters_to_config | join(' ')}}"    roles:    - role: openshift_master_cluster -    when: openshift_master_ha | bool +    when: openshift_master_ha | bool and openshift.master.cluster_method == "pacemaker"    - openshift_examples    - role: openshift_cluster_metrics      when: openshift.common.use_cluster_metrics | bool +- name: Determine cluster dns ip +  hosts: oo_first_master +  tasks: +  - name: Get master service ip +    command: "{{ openshift.common.client_binary }} get -o template svc kubernetes --template=\\{\\{.spec.clusterIP\\}\\}" +    register: master_service_ip_output +    when: openshift.common.version_greater_than_3_1_or_1_1 | bool +  - set_fact: +      cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}" +    when: not openshift.common.version_greater_than_3_1_or_1_1 | bool +  - set_fact: +      cluster_dns_ip: "{{ master_service_ip_output.stdout }}" +    when: openshift.common.version_greater_than_3_1_or_1_1 | bool +  - name: Enable cockpit    hosts: oo_first_master    vars: diff --git a/playbooks/gce/openshift-cluster/config.yml b/playbooks/gce/openshift-cluster/config.yml index 6ca4f7395..745161bcb 100644 --- a/playbooks/gce/openshift-cluster/config.yml +++ b/playbooks/gce/openshift-cluster/config.yml @@ -16,6 +16,7 @@  - include: ../../common/openshift-cluster/config.yml    vars:      g_etcd_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-etcd' }}" +    g_lb_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-lb' }}"      g_masters_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-master' }}"      g_nodes_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-node' }}"      g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}" diff --git a/playbooks/gce/openshift-cluster/join_node.yml b/playbooks/gce/openshift-cluster/join_node.yml index 0dfa3e9d7..c8f6065cd 100644 --- a/playbooks/gce/openshift-cluster/join_node.yml +++ b/playbooks/gce/openshift-cluster/join_node.yml @@ -46,4 +46,4 @@      openshift_node_labels: "{{ lookup('oo_option', 'openshift_node_labels') }} "      os_sdn_network_plugin_name: "redhat/openshift-ovs-subnet"      osn_cluster_dns_domain: "{{ hostvars[groups.oo_first_master.0].openshift.dns.domain }}" -    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].openshift.dns.ip }}" +    osn_cluster_dns_ip: "{{ hostvars[groups.oo_first_master.0].cluster_dns_ip }}" diff --git a/playbooks/gce/openshift-cluster/launch.yml b/playbooks/gce/openshift-cluster/launch.yml index c22b897d5..8be5d53e7 100644 --- a/playbooks/gce/openshift-cluster/launch.yml +++ b/playbooks/gce/openshift-cluster/launch.yml @@ -9,7 +9,7 @@    - fail: msg="Deployment type not supported for gce provider yet"      when: deployment_type == 'enterprise' -  - include: ../../common/openshift-cluster/set_master_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_master_launch_facts.yml    - include: tasks/launch_instances.yml      vars:        instances: "{{ master_names }}" @@ -17,7 +17,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "default" -  - include: ../../common/openshift-cluster/set_node_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_node_launch_facts.yml      vars:        type: "compute"        count: "{{ num_nodes }}" @@ -28,7 +28,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "{{ sub_host_type }}" -  - include: ../../common/openshift-cluster/set_node_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_node_launch_facts.yml      vars:        type: "infra"        count: "{{ num_infra }}" diff --git a/playbooks/libvirt/openshift-cluster/config.yml b/playbooks/libvirt/openshift-cluster/config.yml index c208eee81..4d1ae22ff 100644 --- a/playbooks/libvirt/openshift-cluster/config.yml +++ b/playbooks/libvirt/openshift-cluster/config.yml @@ -15,6 +15,7 @@  - include: ../../common/openshift-cluster/config.yml    vars:      g_etcd_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-etcd' }}" +    g_lb_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-lb' }}"      g_masters_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-master' }}"      g_nodes_group: "{{ 'tag_env-host-type-' ~ cluster_id ~ '-openshift-node' }}"      g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}" diff --git a/playbooks/libvirt/openshift-cluster/launch.yml b/playbooks/libvirt/openshift-cluster/launch.yml index d3e768de5..8d7949dd1 100644 --- a/playbooks/libvirt/openshift-cluster/launch.yml +++ b/playbooks/libvirt/openshift-cluster/launch.yml @@ -17,7 +17,7 @@    - include: tasks/configure_libvirt.yml -  - include: ../../common/openshift-cluster/set_etcd_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_etcd_launch_facts.yml    - include: tasks/launch_instances.yml      vars:        instances: "{{ etcd_names }}" @@ -25,7 +25,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "default" -  - include: ../../common/openshift-cluster/set_master_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_master_launch_facts.yml    - include: tasks/launch_instances.yml      vars:        instances: "{{ master_names }}" @@ -33,7 +33,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "default" -  - include: ../../common/openshift-cluster/set_node_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_node_launch_facts.yml      vars:        type: "compute"        count: "{{ num_nodes }}" @@ -44,7 +44,7 @@        type: "{{ k8s_type }}"        g_sub_host_type: "{{ sub_host_type }}" -  - include: ../../common/openshift-cluster/set_node_launch_facts_tasks.yml +  - include: ../../common/openshift-cluster/tasks/set_node_launch_facts.yml      vars:        type: "infra"        count: "{{ num_infra }}" diff --git a/playbooks/libvirt/openshift-cluster/templates/user-data b/playbooks/libvirt/openshift-cluster/templates/user-data index eacae7c7e..e0c966e45 100644 --- a/playbooks/libvirt/openshift-cluster/templates/user-data +++ b/playbooks/libvirt/openshift-cluster/templates/user-data @@ -19,5 +19,11 @@ system_info:  ssh_authorized_keys:    - {{ lookup('file', '~/.ssh/id_rsa.pub') }} +write_files: +  - path: /etc/sudoers.d/00-openshift-no-requiretty +    permissions: 440 +    content: | +        Defaults:openshift !requiretty +  runcmd:    - NETWORK_CONFIG=/etc/sysconfig/network-scripts/ifcfg-eth0; if ! grep DHCP_HOSTNAME ${NETWORK_CONFIG}; then echo 'DHCP_HOSTNAME="{{ item[0] }}.example.com"' >> ${NETWORK_CONFIG}; fi; pkill -9 dhclient; service network restart diff --git a/playbooks/openstack/openshift-cluster/config.yml b/playbooks/openstack/openshift-cluster/config.yml index a5ee2d6a5..888804e28 100644 --- a/playbooks/openstack/openshift-cluster/config.yml +++ b/playbooks/openstack/openshift-cluster/config.yml @@ -10,6 +10,7 @@  - include: ../../common/openshift-cluster/config.yml    vars:      g_etcd_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-etcd' }}" +    g_lb_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-lb' }}"      g_masters_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-master' }}"      g_nodes_group: "{{ 'tag_env-host-type_' ~ cluster_id ~ '-openshift-node' }}"      g_ssh_user: "{{ hostvars.localhost.g_ssh_user_tmp }}" | 
