diff options
Diffstat (limited to 'playbooks/init')
| -rw-r--r-- | playbooks/init/base_packages.yml | 37 | ||||
| -rw-r--r-- | playbooks/init/evaluate_groups.yml | 188 | ||||
| -rw-r--r-- | playbooks/init/facts.yml | 104 | ||||
| -rw-r--r-- | playbooks/init/main.yml | 36 | ||||
| -rw-r--r-- | playbooks/init/repos.yml | 16 | ||||
| l--------- | playbooks/init/roles | 1 | ||||
| -rw-r--r-- | playbooks/init/sanity_checks.yml | 15 | ||||
| -rw-r--r-- | playbooks/init/validate_hostnames.yml | 43 | ||||
| -rw-r--r-- | playbooks/init/vars/cluster_hosts.yml | 26 | ||||
| -rw-r--r-- | playbooks/init/version.yml | 21 | 
10 files changed, 487 insertions, 0 deletions
| diff --git a/playbooks/init/base_packages.yml b/playbooks/init/base_packages.yml new file mode 100644 index 000000000..15b3dd492 --- /dev/null +++ b/playbooks/init/base_packages.yml @@ -0,0 +1,37 @@ +--- +- name: Install packages necessary for installer +  hosts: oo_all_hosts +  any_errors_fatal: true +  tasks: +  - when: +    - not openshift_is_atomic | bool +    block: +    - name: Ensure openshift-ansible installer package deps are installed +      package: +        name: "{{ item }}" +        state: present +      with_items: +      - iproute +      - "{{ 'python3-dbus' if ansible_distribution == 'Fedora' else 'dbus-python' }}" +      - "{{ 'python3-PyYAML' if ansible_distribution == 'Fedora' else 'PyYAML' }}" +      - yum-utils +      register: result +      until: result is succeeded + +    - name: Ensure various deps for running system containers are installed +      package: +        name: "{{ item }}" +        state: present +      with_items: +      - atomic +      - ostree +      - runc +      when: +      - > +        (openshift_use_system_containers | default(False)) | bool +        or (openshift_use_etcd_system_container | default(False)) | bool +        or (openshift_use_openvswitch_system_container | default(False)) | bool +        or (openshift_use_node_system_container | default(False)) | bool +        or (openshift_use_master_system_container | default(False)) | bool +      register: result +      until: result is succeeded diff --git a/playbooks/init/evaluate_groups.yml b/playbooks/init/evaluate_groups.yml new file mode 100644 index 000000000..8087f6ffc --- /dev/null +++ b/playbooks/init/evaluate_groups.yml @@ -0,0 +1,188 @@ +--- +- name: Populate config host groups +  hosts: localhost +  connection: local +  become: no +  gather_facts: no +  tasks: +  - name: Load group name mapping variables +    include_vars: vars/cluster_hosts.yml + +  - name: Evaluate groups - g_etcd_hosts or g_new_etcd_hosts required +    fail: +      msg: This playbook requires g_etcd_hosts or g_new_etcd_hosts to be set +    when: g_etcd_hosts is not defined and g_new_etcd_hosts is not defined + +  - name: Evaluate groups - g_master_hosts or g_new_master_hosts required +    fail: +      msg: This playbook requires g_master_hosts or g_new_master_hosts to be set +    when: g_master_hosts is not defined and g_new_master_hosts is not defined + +  - name: Evaluate groups - g_node_hosts or g_new_node_hosts required +    fail: +      msg: This playbook requires g_node_hosts or g_new_node_hosts to be set +    when: g_node_hosts is not defined and g_new_node_hosts is not defined + +  - name: Evaluate groups - g_lb_hosts required +    fail: +      msg: This playbook requires g_lb_hosts to be set +    when: g_lb_hosts is not defined + +  - name: Evaluate groups - g_nfs_hosts required +    fail: +      msg: This playbook requires g_nfs_hosts to be set +    when: g_nfs_hosts is not defined + +  - name: Evaluate groups - g_nfs_hosts is single host +    fail: +      msg: The nfs group must be limited to one host +    when: g_nfs_hosts | default([]) | length > 1 + +  - name: Evaluate groups - g_glusterfs_hosts required +    fail: +      msg: This playbook requires g_glusterfs_hosts to be set +    when: g_glusterfs_hosts is not defined + +  - name: Evaluate groups - Fail if no etcd hosts group is defined +    fail: +      msg: > +        Running etcd as an embedded service is no longer supported. +    when: +    - g_etcd_hosts | default([]) | length not in [3,1] +    - not (openshift_node_bootstrap | default(False)) + +  - name: Evaluate oo_all_hosts +    add_host: +      name: "{{ item }}" +      groups: oo_all_hosts +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_all_hosts | default([]) }}" +    changed_when: no + +  - name: Evaluate oo_masters +    add_host: +      name: "{{ item }}" +      groups: oo_masters +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_master_hosts | union(g_new_master_hosts) | default([]) }}" +    changed_when: no + +  - name: Evaluate oo_first_master +    add_host: +      name: "{{ g_master_hosts[0] }}" +      groups: oo_first_master +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    when: g_master_hosts|length > 0 +    changed_when: no + +  - name: Evaluate oo_new_etcd_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_new_etcd_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_new_etcd_hosts | default([]) }}" +    changed_when: no + +  - name: Evaluate oo_masters_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_masters_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_new_master_hosts | default(g_master_hosts | default([], true), true) }}" +    changed_when: no + +  - name: Evaluate oo_etcd_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_etcd_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_etcd_hosts | default([]) }}" +    changed_when: no + +  - name: Evaluate oo_first_etcd +    add_host: +      name: "{{ g_etcd_hosts[0] }}" +      groups: oo_first_etcd +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    when: g_etcd_hosts|length > 0 +    changed_when: no + +  # We use two groups one for hosts we're upgrading which doesn't include embedded etcd +  # The other for backing up which includes the embedded etcd host, there's no need to +  # upgrade embedded etcd that just happens when the master is updated. +  - name: Evaluate oo_etcd_hosts_to_upgrade +    add_host: +      name: "{{ item }}" +      groups: oo_etcd_hosts_to_upgrade +    with_items: "{{ groups.oo_etcd_to_config if groups.oo_etcd_to_config is defined and groups.oo_etcd_to_config | length > 0 else [] }}" +    changed_when: False + +  - name: Evaluate oo_etcd_hosts_to_backup +    add_host: +      name: "{{ item }}" +      groups: oo_etcd_hosts_to_backup +    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 | default([])) }}" +    changed_when: False + +  - name: Evaluate oo_nodes_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_nodes_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_new_node_hosts | default(g_node_hosts | default([], true), true) }}" +    changed_when: no + +  # Skip adding the master to oo_nodes_to_config when g_new_node_hosts is +  - name: Add master to oo_nodes_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_nodes_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_master_hosts | default([]) }}" +    when: g_nodeonmaster | default(false) | bool and not g_new_node_hosts | default(false) | bool +    changed_when: no + +  - name: Evaluate oo_lb_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_lb_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_lb_hosts | default([]) }}" +    changed_when: no + +  - name: Evaluate oo_nfs_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_nfs_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_nfs_hosts | default([]) }}" +    changed_when: no + +  - name: Evaluate oo_glusterfs_to_config +    add_host: +      name: "{{ item }}" +      groups: oo_glusterfs_to_config +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ g_glusterfs_hosts | union(g_glusterfs_registry_hosts | default([])) }}" +    changed_when: no + +  - name: Evaluate oo_etcd_to_migrate +    add_host: +      name: "{{ item }}" +      groups: oo_etcd_to_migrate +      ansible_ssh_user: "{{ g_ssh_user | default(omit) }}" +      ansible_become: "{{ g_sudo | default(omit) }}" +    with_items: "{{ groups.oo_etcd_to_config if groups.oo_etcd_to_config | default([]) | length != 0 else (groups.oo_first_master |default([]))}}" +    changed_when: no diff --git a/playbooks/init/facts.yml b/playbooks/init/facts.yml new file mode 100644 index 000000000..094db845d --- /dev/null +++ b/playbooks/init/facts.yml @@ -0,0 +1,104 @@ +--- +- name: Ensure that all non-node hosts are accessible +  hosts: oo_masters_to_config:oo_etcd_to_config:oo_lb_to_config:oo_nfs_to_config +  any_errors_fatal: true +  tasks: + +- name: Initialize host facts +  hosts: oo_all_hosts +  tasks: +  - name: load openshift_facts module +    import_role: +      name: openshift_facts + +  # TODO: Should this role be refactored into health_checks?? +  - name: Run openshift_sanitize_inventory to set variables +    import_role: +      name: openshift_sanitize_inventory + +  - name: Detecting Operating System from ostree_booted +    stat: +      path: /run/ostree-booted +    register: ostree_booted + +  # TODO(michaelgugino) remove this line once CI is updated. +  - name: set openshift_deployment_type if unset +    set_fact: +      openshift_deployment_type: "{{ deployment_type }}" +    when: +    - openshift_deployment_type is undefined +    - deployment_type is defined + +  - name: initialize_facts set fact openshift_is_atomic and openshift_is_containerized +    set_fact: +      openshift_is_atomic: "{{ ostree_booted.stat.exists }}" +      openshift_is_containerized: "{{ ostree_booted.stat.exists or (containerized | default(false) | bool) }}" + +  # TODO: Should this be moved into health checks?? +  # Seems as though any check that happens with a corresponding fail should move into health_checks +  # Fail as early as possible if Atomic and old version of Docker +  - when: +    - openshift_is_atomic | bool +    block: + +    # See https://access.redhat.com/articles/2317361 +    # and https://github.com/ansible/ansible/issues/15892 +    # NOTE: the "'s can not be removed at this level else the docker command will fail +    # NOTE: When ansible >2.2.1.x is used this can be updated per +    # https://github.com/openshift/openshift-ansible/pull/3475#discussion_r103525121 +    - name: Determine Atomic Host Docker Version +      shell: 'CURLY="{"; docker version --format "$CURLY{json .Server.Version}}"' +      register: l_atomic_docker_version + +    - name: assert atomic host docker version is 1.12 or later +      assert: +        that: +        - l_atomic_docker_version.stdout | replace('"', '') is version_compare('1.12','>=') +        msg: Installation on Atomic Host requires Docker 1.12 or later. Please upgrade and restart the Atomic Host. + +  - name: Gather Cluster facts +    openshift_facts: +      role: common +      local_facts: +        deployment_type: "{{ openshift_deployment_type }}" +        deployment_subtype: "{{ openshift_deployment_subtype | default(None) }}" +        hostname: "{{ openshift_hostname | default(None) }}" +        ip: "{{ openshift_ip | default(None) }}" +        public_hostname: "{{ openshift_public_hostname | default(None) }}" +        public_ip: "{{ openshift_public_ip | default(None) }}" +        portal_net: "{{ openshift_portal_net | default(openshift_master_portal_net) | default(None) }}" +        http_proxy: "{{ openshift_http_proxy | default(None) }}" +        https_proxy: "{{ openshift_https_proxy | default(None) }}" +        no_proxy: "{{ openshift_no_proxy | default(None) }}" +        generate_no_proxy_hosts: "{{ openshift_generate_no_proxy_hosts | default(True) }}" + +  - name: Set fact of no_proxy_internal_hostnames +    openshift_facts: +      role: common +      local_facts: +        no_proxy_internal_hostnames: "{{ hostvars | lib_utils_oo_select_keys(groups['oo_nodes_to_config'] +                                             | union(groups['oo_masters_to_config']) +                                             | union(groups['oo_etcd_to_config'] | default([]))) +                                         | lib_utils_oo_collect('openshift.common.hostname') | default([]) | join (',') +                                         }}" +    when: +    - openshift_http_proxy is defined or openshift_https_proxy is defined +    - openshift_generate_no_proxy_hosts | default(True) | bool + +  - name: Initialize openshift.node.sdn_mtu +    openshift_facts: +      role: node +      local_facts: +        sdn_mtu: "{{ openshift_node_sdn_mtu | default(None) }}" + +- name: Initialize special first-master variables +  hosts: oo_first_master +  roles: +  - role: openshift_facts +  tasks: +  - set_fact: +      # We need to setup openshift_client_binary here for special uses of delegate_to in +      # later roles and plays. +      first_master_client_binary: "{{  openshift_client_binary }}" +      #Some roles may require this to be set for first master +      openshift_client_binary: "{{ openshift_client_binary }}" diff --git a/playbooks/init/main.yml b/playbooks/init/main.yml new file mode 100644 index 000000000..20457e508 --- /dev/null +++ b/playbooks/init/main.yml @@ -0,0 +1,36 @@ +--- +- name: Initialization Checkpoint Start +  hosts: all +  gather_facts: false +  roles: +  - installer_checkpoint +  tasks: +  - name: Set install initialization 'In Progress' +    run_once: true +    set_stats: +      data: +        installer_phase_initialize: +          status: "In Progress" +          start: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}" + +- import_playbook: evaluate_groups.yml + +- import_playbook: facts.yml + +- import_playbook: sanity_checks.yml +  when: not (skip_sanity_checks | default(False)) + +- import_playbook: version.yml +  when: not (skip_verison | default(False)) + +- name: Initialization Checkpoint End +  hosts: all +  gather_facts: false +  tasks: +  - name: Set install initialization 'Complete' +    run_once: true +    set_stats: +      data: +        installer_phase_initialize: +          status: "Complete" +          end: "{{ lookup('pipe', 'date +%Y%m%d%H%M%SZ') }}" diff --git a/playbooks/init/repos.yml b/playbooks/init/repos.yml new file mode 100644 index 000000000..667f38ddd --- /dev/null +++ b/playbooks/init/repos.yml @@ -0,0 +1,16 @@ +--- +- name: Setup yum repositories for all hosts +  hosts: oo_all_hosts +  gather_facts: no +  tasks: +  - name: subscribe instances to Red Hat Subscription Manager +    import_role: +      name: rhel_subscribe +    when: +    - ansible_distribution == 'RedHat' +    - openshift_deployment_type == 'openshift-enterprise' +    - rhsub_user is defined +    - rhsub_pass is defined +  - name: initialize openshift repos +    import_role: +      name: openshift_repos diff --git a/playbooks/init/roles b/playbooks/init/roles new file mode 120000 index 000000000..b741aa3db --- /dev/null +++ b/playbooks/init/roles @@ -0,0 +1 @@ +../../roles
\ No newline at end of file diff --git a/playbooks/init/sanity_checks.yml b/playbooks/init/sanity_checks.yml new file mode 100644 index 000000000..52bcf42c0 --- /dev/null +++ b/playbooks/init/sanity_checks.yml @@ -0,0 +1,15 @@ +--- +- name: Verify Requirements +  hosts: oo_first_master +  roles: +  - role: lib_utils +  tasks: +  # sanity_checks is a custom action plugin defined in lib_utils. +  # This module will loop through all the hostvars for each host +  # specified in check_hosts. +  # Since sanity_checks is an action_plugin, it executes on the control host. +  # Thus, sanity_checks cannot gather new information about any hosts. +  - name: Run variable sanity checks +    sanity_checks: +      check_hosts: "{{ groups['oo_all_hosts'] }}" +    run_once: True diff --git a/playbooks/init/validate_hostnames.yml b/playbooks/init/validate_hostnames.yml new file mode 100644 index 000000000..86e0b2416 --- /dev/null +++ b/playbooks/init/validate_hostnames.yml @@ -0,0 +1,43 @@ +--- +- name: Validate node hostnames +  hosts: oo_nodes_to_config +  any_errors_fatal: true +  tasks: +  - name: Query DNS for IP address of {{ openshift.common.hostname }} +    shell: +      getent ahostsv4 {{ openshift.common.hostname }} | head -n 1 | awk '{ print $1 }' +    register: lookupip +    changed_when: false +    failed_when: false + +  - name: Validate openshift_hostname when defined +    fail: +      msg: > +        The hostname {{ openshift.common.hostname }} for {{ ansible_nodename }} +        doesn't resolve to an IP address owned by this host. Please set +        openshift_hostname variable to a hostname that when resolved on the host +        in question resolves to an IP address matching an interface on this host. +        This will ensure proper functionality of OpenShift networking features. +        Inventory setting: openshift_hostname={{ openshift_hostname }} +        This check can be overridden by setting openshift_hostname_check=false in +        the inventory. +        See https://docs.openshift.org/latest/install_config/install/advanced_install.html#configuring-host-variables +    when: +    - lookupip.stdout != '127.0.0.1' +    - lookupip.stdout not in ansible_all_ipv4_addresses +    - openshift_hostname_check | default(true) + +  - name: Validate openshift_ip exists on node when defined +    fail: +      msg: > +        The IP address {{ openshift_ip }} does not exist on {{ ansible_nodename }}. +        Please set the openshift_ip variable to an IP address of this node. +        This will ensure proper functionality of OpenShift networking features. +        Inventory setting: openshift_ip={{ openshift_ip }} +        This check can be overridden by setting openshift_ip_check=false in +        the inventory. +        See https://docs.openshift.org/latest/install_config/install/advanced_install.html#configuring-host-variables +    when: +    - openshift_ip is defined +    - openshift_ip not in ansible_all_ipv4_addresses +    - openshift_ip_check | default(true) diff --git a/playbooks/init/vars/cluster_hosts.yml b/playbooks/init/vars/cluster_hosts.yml new file mode 100644 index 000000000..e807ac004 --- /dev/null +++ b/playbooks/init/vars/cluster_hosts.yml @@ -0,0 +1,26 @@ +--- +g_etcd_hosts: "{{ groups.etcd | default([]) }}" + +g_new_etcd_hosts: "{{ groups.new_etcd | default([]) }}" + +g_lb_hosts: "{{ groups.lb | default([]) }}" + +g_master_hosts: "{{ groups.masters | default([]) }}" + +g_new_master_hosts: "{{ groups.new_masters | default([]) }}" + +g_node_hosts: "{{ groups.nodes | default([]) }}" + +g_new_node_hosts: "{{ groups.new_nodes | default([]) }}" + +g_nfs_hosts: "{{ groups.nfs | default([]) }}" + +g_glusterfs_hosts: "{{ groups.glusterfs | default([]) }}" + +g_glusterfs_registry_hosts: "{{ groups.glusterfs_registry | default(g_glusterfs_hosts) }}" + +g_all_hosts: "{{ g_master_hosts | union(g_node_hosts) | union(g_etcd_hosts) +                 | union(g_new_etcd_hosts) | union(g_lb_hosts) | union(g_nfs_hosts) +                 | union(g_new_node_hosts)| union(g_new_master_hosts) +                 | union(g_glusterfs_hosts) | union(g_glusterfs_registry_hosts) +                 | default([]) }}" diff --git a/playbooks/init/version.yml b/playbooks/init/version.yml new file mode 100644 index 000000000..37a5284d5 --- /dev/null +++ b/playbooks/init/version.yml @@ -0,0 +1,21 @@ +--- +# NOTE: requires openshift_facts be run +- name: Determine openshift_version to configure on first master +  hosts: oo_first_master +  roles: +  - openshift_version + +# NOTE: We set this even on etcd hosts as they may also later run as masters, +# and we don't want to install wrong version of docker and have to downgrade +# later. +- name: Set openshift_version for etcd, node, and master hosts +  hosts: oo_etcd_to_config:oo_nodes_to_config:oo_masters_to_config:!oo_first_master +  vars: +    openshift_version: "{{ hostvars[groups.oo_first_master.0].openshift_version }}" +  pre_tasks: +  - set_fact: +      openshift_pkg_version: -{{ openshift_version }} +    when: openshift_pkg_version is not defined +  - debug: msg="openshift_pkg_version set to {{ openshift_pkg_version }}" +  roles: +  - openshift_version | 
