diff options
Diffstat (limited to 'roles/docker')
| -rw-r--r-- | roles/docker/defaults/main.yml | 13 | ||||
| -rw-r--r-- | roles/docker/handlers/main.yml | 1 | ||||
| -rw-r--r-- | roles/docker/meta/main.yml | 1 | ||||
| -rw-r--r-- | roles/docker/tasks/crio_firewall.yml | 40 | ||||
| -rw-r--r-- | roles/docker/tasks/main.yml | 17 | ||||
| -rw-r--r-- | roles/docker/tasks/package_docker.yml | 45 | ||||
| -rw-r--r-- | roles/docker/tasks/registry_auth.yml | 16 | ||||
| -rw-r--r-- | roles/docker/tasks/systemcontainer_crio.yml | 79 | ||||
| -rw-r--r-- | roles/docker/tasks/systemcontainer_docker.yml | 57 | ||||
| -rw-r--r-- | roles/docker/templates/crio.conf.j2 | 26 | ||||
| -rw-r--r-- | roles/docker/templates/custom.conf.j2 | 6 | 
11 files changed, 193 insertions, 108 deletions
| diff --git a/roles/docker/defaults/main.yml b/roles/docker/defaults/main.yml index e36dfa7b9..f6f2bd77e 100644 --- a/roles/docker/defaults/main.yml +++ b/roles/docker/defaults/main.yml @@ -1,5 +1,6 @@  ---  docker_cli_auth_config_path: '/root/.docker' +openshift_docker_signature_verification: False  # oreg_url is defined by user input.  oreg_host: "{{ oreg_url.split('/')[0] if (oreg_url is defined and '.' in oreg_url.split('/')[0]) else '' }}" @@ -19,4 +20,16 @@ l2_docker_additional_registries: "{% if openshift_docker_additional_registries i  l2_docker_blocked_registries: "{% if openshift_docker_blocked_registries is string %}{% if openshift_docker_blocked_registries == '' %}[]{% elif ',' in openshift_docker_blocked_registries %}{{ openshift_docker_blocked_registries.split(',') | list }}{% else %}{{ [ openshift_docker_blocked_registries ] }}{% endif %}{% else %}{{ openshift_docker_blocked_registries }}{% endif %}"  l2_docker_insecure_registries: "{% if openshift_docker_insecure_registries is string %}{% if openshift_docker_insecure_registries == '' %}[]{% elif ',' in openshift_docker_insecure_registries %}{{ openshift_docker_insecure_registries.split(',') | list }}{% else %}{{ [ openshift_docker_insecure_registries ] }}{% endif %}{% else %}{{ openshift_docker_insecure_registries }}{% endif %}" +openshift_docker_use_etc_containers: False  containers_registries_conf_path: /etc/containers/registries.conf + +r_crio_firewall_enabled: "{{ os_firewall_enabled | default(True) }}" +r_crio_use_firewalld: "{{ os_firewall_use_firewalld | default(False) }}" + +r_crio_os_firewall_deny: [] +r_crio_os_firewall_allow: +- service: crio +  port: 10010/tcp + + +openshift_docker_is_node_or_master: "{{ True if inventory_hostname in (groups['oo_masters_to_config']|default([])) or inventory_hostname in (groups['oo_nodes_to_config']|default([])) else False | bool }}" diff --git a/roles/docker/handlers/main.yml b/roles/docker/handlers/main.yml index 591367467..866ed0452 100644 --- a/roles/docker/handlers/main.yml +++ b/roles/docker/handlers/main.yml @@ -4,6 +4,7 @@    systemd:      name: "{{ openshift.docker.service_name }}"      state: restarted +    daemon_reload: yes    register: r_docker_restart_docker_result    until: not r_docker_restart_docker_result | failed    retries: 3 diff --git a/roles/docker/meta/main.yml b/roles/docker/meta/main.yml index b773a417c..62b8a2eb5 100644 --- a/roles/docker/meta/main.yml +++ b/roles/docker/meta/main.yml @@ -11,3 +11,4 @@ galaxy_info:      - 7  dependencies:  - role: lib_openshift +- role: lib_os_firewall diff --git a/roles/docker/tasks/crio_firewall.yml b/roles/docker/tasks/crio_firewall.yml new file mode 100644 index 000000000..fbd1ff515 --- /dev/null +++ b/roles/docker/tasks/crio_firewall.yml @@ -0,0 +1,40 @@ +--- +- when: r_crio_firewall_enabled | bool and not r_crio_use_firewalld | bool +  block: +  - name: Add iptables allow rules +    os_firewall_manage_iptables: +      name: "{{ item.service }}" +      action: add +      protocol: "{{ item.port.split('/')[1] }}" +      port: "{{ item.port.split('/')[0] }}" +    when: item.cond | default(True) +    with_items: "{{ r_crio_os_firewall_allow }}" + +  - name: Remove iptables rules +    os_firewall_manage_iptables: +      name: "{{ item.service }}" +      action: remove +      protocol: "{{ item.port.split('/')[1] }}" +      port: "{{ item.port.split('/')[0] }}" +    when: item.cond | default(True) +    with_items: "{{ r_crio_os_firewall_deny }}" + +- when: r_crio_firewall_enabled | bool and r_crio_use_firewalld | bool +  block: +  - name: Add firewalld allow rules +    firewalld: +      port: "{{ item.port }}" +      permanent: true +      immediate: true +      state: enabled +    when: item.cond | default(True) +    with_items: "{{ r_crio_os_firewall_allow }}" + +  - name: Remove firewalld allow rules +    firewalld: +      port: "{{ item.port }}" +      permanent: true +      immediate: true +      state: disabled +    when: item.cond | default(True) +    with_items: "{{ r_crio_os_firewall_deny }}" diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml index dae17c3ce..1539af53f 100644 --- a/roles/docker/tasks/main.yml +++ b/roles/docker/tasks/main.yml @@ -10,13 +10,14 @@      l_use_crio: "{{ openshift_use_crio | default(False) }}"      l_use_crio_only: "{{ openshift_use_crio_only | default(False) }}" -- when: -    - openshift_deployment_type == 'openshift-enterprise' -  assert: -    that: -      - "openshift_image_tag is defined" -    msg: > -      openshift_image_tag is a required inventory variable when installing openshift-enterprise +- name: Add enterprise registry, if necessary +  set_fact: +    l2_docker_additional_registries: "{{ l2_docker_additional_registries + [openshift_docker_ent_reg] }}" +  when: +    - openshift.common.deployment_type == 'openshift-enterprise' +    - openshift_docker_ent_reg != '' +    - openshift_docker_ent_reg not in l2_docker_additional_registries +    - not l_use_crio_only  - name: Use Package Docker if Requested    include: package_docker.yml @@ -34,4 +35,4 @@    include: systemcontainer_crio.yml    when:      - l_use_crio -    - inventory_hostname in groups['oo_masters_to_config'] or inventory_hostname in groups['oo_nodes_to_config'] +    - openshift_docker_is_node_or_master | bool diff --git a/roles/docker/tasks/package_docker.yml b/roles/docker/tasks/package_docker.yml index a35335937..c1aedf879 100644 --- a/roles/docker/tasks/package_docker.yml +++ b/roles/docker/tasks/package_docker.yml @@ -48,15 +48,9 @@      template:        dest: "{{ docker_systemd_dir }}/custom.conf"        src: custom.conf.j2 -  when: not os_firewall_use_firewalld | default(False) | bool - -- name: Add enterprise registry, if necessary -  set_fact: -    l2_docker_additional_registries: "{{ l2_docker_additional_registries + [openshift_docker_ent_reg] }}" -  when: -  - openshift.common.deployment_type == 'openshift-enterprise' -  - openshift_docker_ent_reg != '' -  - openshift_docker_ent_reg not in l2_docker_additional_registries +    notify: +    - restart docker +  when: not (os_firewall_use_firewalld | default(False)) | bool  - stat: path=/etc/sysconfig/docker    register: docker_check @@ -87,6 +81,7 @@    template:      dest: "{{ containers_registries_conf_path }}"      src: registries.conf +  when: openshift_docker_use_etc_containers | bool    notify:    - restart docker @@ -113,11 +108,12 @@      dest: /etc/sysconfig/docker      regexp: '^OPTIONS=.*$'      line: "OPTIONS='\ -      {% if ansible_selinux.status | default(None) == 'enabled' and docker_selinux_enabled | default(true) | bool %} --selinux-enabled {% endif %}\ -      {% if docker_log_driver is defined  %} --log-driver {{ docker_log_driver }}{% endif %}\ -      {% if docker_log_options is defined %} {{ docker_log_options |  oo_split() | oo_prepend_strings_in_list('--log-opt ') | join(' ')}}{% endif %}\ -      {% if docker_options is defined %} {{ docker_options }}{% endif %}\ -      {% if docker_disable_push_dockerhub is defined %} --confirm-def-push={{ docker_disable_push_dockerhub | bool }}{% endif %}'" +      {% if ansible_selinux.status | default(None) == 'enabled' and docker_selinux_enabled | default(true) | bool %} --selinux-enabled {% endif %} \ +      {% if docker_log_driver is defined  %} --log-driver {{ docker_log_driver }}{% endif %} \ +      {% if docker_log_options is defined %} {{ docker_log_options |  oo_split() | oo_prepend_strings_in_list('--log-opt ') | join(' ')}}{% endif %} \ +      {% if docker_options is defined %} {{ docker_options }}{% endif %} \ +      {% if docker_disable_push_dockerhub is defined %} --confirm-def-push={{ docker_disable_push_dockerhub | bool }}{% endif %} \ +      --signature-verification={{ openshift_docker_signature_verification | bool }}'"    when: docker_check.stat.isreg is defined and docker_check.stat.isreg    notify:    - restart docker @@ -137,17 +133,12 @@    notify:    - restart docker -- name: Check for credentials file for registry auth -  stat: -    path: "{{ docker_cli_auth_config_path }}/config.json" -  when: oreg_auth_user is defined -  register: docker_cli_auth_credentials_stat - -- name: Create credentials for docker cli registry auth -  command: "docker --config={{ docker_cli_auth_config_path }} login -u {{ oreg_auth_user }} -p {{ oreg_auth_password }} {{ oreg_host }}" -  when: -  - oreg_auth_user is defined -  - (not docker_cli_auth_credentials_stat.stat.exists or oreg_auth_credentials_replace) | bool +# The following task is needed as the systemd module may report a change in +# state even though docker is already running. +- name: Detect if docker is already started +  command: "systemctl show docker -p ActiveState" +  changed_when: False +  register: r_docker_already_running_result  - name: Start the Docker service    systemd: @@ -161,6 +152,8 @@    delay: 30  - set_fact: -    docker_service_status_changed: "{{ r_docker_package_docker_start_result | changed }}" +    docker_service_status_changed: "{{ (r_docker_package_docker_start_result | changed) and (r_docker_already_running_result.stdout != 'ActiveState=active' ) }}" + +- include: registry_auth.yml  - meta: flush_handlers diff --git a/roles/docker/tasks/registry_auth.yml b/roles/docker/tasks/registry_auth.yml new file mode 100644 index 000000000..d05b7f2b8 --- /dev/null +++ b/roles/docker/tasks/registry_auth.yml @@ -0,0 +1,16 @@ +--- +- name: Check for credentials file for registry auth +  stat: +    path: "{{ docker_cli_auth_config_path }}/config.json" +  when: oreg_auth_user is defined +  register: docker_cli_auth_credentials_stat + +- name: Create credentials for docker cli registry auth +  command: "docker --config={{ docker_cli_auth_config_path }} login -u {{ oreg_auth_user }} -p {{ oreg_auth_password }} {{ oreg_host }}" +  register: openshift_docker_credentials_create_res +  retries: 3 +  delay: 5 +  until: openshift_docker_credentials_create_res.rc == 0 +  when: +  - oreg_auth_user is defined +  - (not docker_cli_auth_credentials_stat.stat.exists or oreg_auth_credentials_replace) | bool diff --git a/roles/docker/tasks/systemcontainer_crio.yml b/roles/docker/tasks/systemcontainer_crio.yml index 386369d26..67ede0d21 100644 --- a/roles/docker/tasks/systemcontainer_crio.yml +++ b/roles/docker/tasks/systemcontainer_crio.yml @@ -3,16 +3,32 @@  # TODO: Much of this file is shared with container engine tasks  - set_fact:      l_insecure_crio_registries: "{{ '\"{}\"'.format('\", \"'.join(l2_docker_insecure_registries)) }}" -  when: l2_docker_insecure_registries +  when: l2_docker_insecure_registries | bool  - set_fact:      l_crio_registries: "{{ l2_docker_additional_registries + ['docker.io'] }}" -  when: l2_docker_additional_registries +  when: l2_docker_additional_registries | bool  - set_fact:      l_crio_registries: "{{ ['docker.io'] }}" -  when: not l2_docker_additional_registries +  when: not (l2_docker_additional_registries | bool)  - set_fact:      l_additional_crio_registries: "{{ '\"{}\"'.format('\", \"'.join(l_crio_registries)) }}" -  when: l2_docker_additional_registries +  when: l2_docker_additional_registries | bool + +- set_fact: +    l_openshift_image_tag: "{{ openshift_image_tag | string }}" +  when: openshift_image_tag is defined + +- set_fact: +    l_openshift_image_tag: "latest" +  when: +    - openshift_image_tag is not defined +    - openshift_release == "latest" + +- set_fact: +    l_openshift_image_tag: "{{ openshift_release | string }}" +  when: +    - openshift_image_tag is not defined +    - openshift_release != "latest"  - name: Ensure container-selinux is installed    package: @@ -20,6 +36,12 @@      state: present    when: not openshift.common.is_atomic | bool +- name: Check we are not using node as a Docker container with CRI-O +  fail: msg='Cannot use CRI-O with node configured as a Docker container' +  when: +    - openshift.common.is_containerized | bool +    - not openshift.common.is_node_system_container | bool +  # Used to pull and install the system container  - name: Ensure atomic is installed    package: @@ -40,7 +62,7 @@    shell: lsmod | grep overlay    register: l_has_overlay_in_kernel    ignore_errors: yes - +  failed_when: false  - when: l_has_overlay_in_kernel.rc != 0    block: @@ -60,36 +82,10 @@          enabled: yes          state: restarted - -- block: - -    - name: Add http_proxy to /etc/atomic.conf -      lineinfile: -        dest: /etc/atomic.conf -        regexp: "^#?http_proxy[:=]{1}" -        line: "http_proxy: {{ openshift.common.http_proxy | default('') }}" -      when: -        - openshift.common.http_proxy is defined -        - openshift.common.http_proxy != '' - -    - name: Add https_proxy to /etc/atomic.conf -      lineinfile: -        dest: /etc/atomic.conf -        regexp: "^#?https_proxy[:=]{1}" -        line: "https_proxy: {{ openshift.common.https_proxy | default('') }}" -      when: -        - openshift.common.https_proxy is defined -        - openshift.common.https_proxy != '' - -    - name: Add no_proxy to /etc/atomic.conf -      lineinfile: -        dest: /etc/atomic.conf -        regexp: "^#?no_proxy[:=]{1}" -        line: "no_proxy: {{ openshift.common.no_proxy | default('') }}" -      when: -        - openshift.common.no_proxy is defined -        - openshift.common.no_proxy != '' - +- name: Ensure proxies are in the atomic.conf +  include_role: +    name: openshift_atomic +    tasks_from: proxy  - block: @@ -106,10 +102,9 @@      - name: Set CRI-O image tag        set_fact: -        l_crio_image_tag: "{{ openshift_image_tag }}" +        l_crio_image_tag: "{{ l_openshift_image_tag }}"        when:          - openshift_deployment_type == 'openshift-enterprise' -        - openshift_image_tag is defined      - name: Use RHEL based image when distribution is Red Hat        set_fact: @@ -147,7 +142,7 @@      image: "{{ l_crio_image }}"      state: latest -- name: Remove CRI-o default configuration files +- name: Remove CRI-O default configuration files    file:      path: "{{ item }}"      state: absent @@ -166,11 +161,19 @@      path: /etc/cni/net.d/      state: directory +- name: setup firewall for CRI-O +  include: crio_firewall.yml +  static: yes +  - name: Configure the CNI network    template:      dest: /etc/cni/net.d/openshift-sdn.conf      src: 80-openshift-sdn.conf.j2 +- name: Fix SELinux Permissions on /var/lib/containers +  command: "restorecon -R /var/lib/containers/" +  changed_when: false +  - name: Start the CRI-O service    systemd:      name: "cri-o" diff --git a/roles/docker/tasks/systemcontainer_docker.yml b/roles/docker/tasks/systemcontainer_docker.yml index 5b1605b58..aa3b35ddd 100644 --- a/roles/docker/tasks/systemcontainer_docker.yml +++ b/roles/docker/tasks/systemcontainer_docker.yml @@ -1,5 +1,21 @@  --- +- set_fact: +    l_openshift_image_tag: "{{ openshift_image_tag | string }}" +  when: openshift_image_tag is defined + +- set_fact: +    l_openshift_image_tag: "latest" +  when: +    - openshift_image_tag is not defined +    - openshift_release == "latest" + +- set_fact: +    l_openshift_image_tag: "{{ openshift_release | string }}" +  when: +    - openshift_image_tag is not defined +    - openshift_release != "latest" +  # If docker_options are provided we should fail. We should not install docker and ignore  # the users configuration. NOTE: docker_options == inventory:openshift_docker_options  - name: Fail quickly if openshift_docker_options are set @@ -52,38 +68,10 @@    retries: 3    delay: 30 - -# Set http_proxy, https_proxy, and no_proxy in /etc/atomic.conf -# regexp: the line starts with or without #, followed by the string -#         http_proxy, then either : or = -- block: - -    - name: Add http_proxy to /etc/atomic.conf -      lineinfile: -        dest: /etc/atomic.conf -        regexp: "^#?http_proxy[:=]{1}" -        line: "http_proxy: {{ openshift.common.http_proxy | default('') }}" -      when: -        - openshift.common.http_proxy is defined -        - openshift.common.http_proxy != '' - -    - name: Add https_proxy to /etc/atomic.conf -      lineinfile: -        dest: /etc/atomic.conf -        regexp: "^#?https_proxy[:=]{1}" -        line: "https_proxy: {{ openshift.common.https_proxy | default('') }}" -      when: -        - openshift.common.https_proxy is defined -        - openshift.common.https_proxy != '' - -    - name: Add no_proxy to /etc/atomic.conf -      lineinfile: -        dest: /etc/atomic.conf -        regexp: "^#?no_proxy[:=]{1}" -        line: "no_proxy: {{ openshift.common.no_proxy | default('') }}" -      when: -        - openshift.common.no_proxy is defined -        - openshift.common.no_proxy != '' +- name: Ensure proxies are in the atomic.conf +  include_role: +    name: openshift_atomic +    tasks_from: proxy  - block: @@ -94,10 +82,9 @@      - name: Set container engine image tag        set_fact: -        l_docker_image_tag: "{{ openshift_image_tag }}" +        l_docker_image_tag: "{{ l_openshift_image_tag }}"        when:          - openshift_deployment_type == 'openshift-enterprise' -        - openshift_image_tag is defined      - name: Use Red Hat Registry for image when distribution is Red Hat        set_fact: @@ -186,4 +173,6 @@  - set_fact:      docker_service_status_changed: "{{ r_docker_systemcontainer_docker_start_result | changed }}" +- include: registry_auth.yml +  - meta: flush_handlers diff --git a/roles/docker/templates/crio.conf.j2 b/roles/docker/templates/crio.conf.j2 index b4ee84fd0..93014a80d 100644 --- a/roles/docker/templates/crio.conf.j2 +++ b/roles/docker/templates/crio.conf.j2 @@ -13,12 +13,12 @@ runroot = "/var/run/containers/storage"  # storage_driver select which storage driver is used to manage storage  # of images and containers. -storage_driver = "overlay2" +storage_driver = "overlay"  # storage_option is used to pass an option to the storage driver.  storage_option = [  {% if ansible_distribution in ['RedHat', 'CentOS'] %} -	"overlay2.override_kernel_check=1" +	"overlay.override_kernel_check=1"  {% endif %}  ] @@ -35,6 +35,10 @@ stream_address = ""  # stream_port is the port on which the stream server will listen  stream_port = "10010" +# file_locking is whether file-based locking will be used instead of +# in-memory locking +file_locking = true +  # The "crio.runtime" table contains settings pertaining to the OCI  # runtime used and options for how to set up and manage the OCI runtime.  [crio.runtime] @@ -67,6 +71,9 @@ runtime_untrusted_workload = ""  # container runtime for all containers.  default_workload_trust = "trusted" +# no_pivot instructs the runtime to not use pivot_root, but instead use MS_MOVE +no_pivot = false +  # conmon is the path to conmon binary, used for managing the runtime.  conmon = "/usr/libexec/crio/conmon" @@ -93,6 +100,16 @@ apparmor_profile = "crio-default"  # for the runtime.  cgroup_manager = "systemd" +# hooks_dir_path is the oci hooks directory for automatically executed hooks +hooks_dir_path = "/usr/share/containers/oci/hooks.d" + +# pids_limit is the number of processes allowed in a container +pids_limit = 1024 + +# log_size_max is the max limit for the container log size in bytes. +# Negative values indicate that no limit is imposed. +log_size_max = 52428800 +  # The "crio.image" table contains settings pertaining to the  # management of OCI images.  [crio.image] @@ -115,6 +132,10 @@ pause_command = "/pause"  # unspecified so that the default system-wide policy will be used.  signature_policy = "" +# image_volumes controls how image volumes are handled. +# The valid values are mkdir and ignore. +image_volumes = "mkdir" +  # insecure_registries is used to skip TLS verification when pulling images.  insecure_registries = [  {{ l_insecure_crio_registries|default("") }} @@ -125,6 +146,7 @@ insecure_registries = [  registries = [  {{ l_additional_crio_registries|default("") }}  ] +  # The "crio.network" table contains settings pertaining to the  # management of CNI plugins.  [crio.network] diff --git a/roles/docker/templates/custom.conf.j2 b/roles/docker/templates/custom.conf.j2 index 9b47cb6ab..713412473 100644 --- a/roles/docker/templates/custom.conf.j2 +++ b/roles/docker/templates/custom.conf.j2 @@ -3,3 +3,9 @@  [Unit]  Wants=iptables.service  After=iptables.service + +# The following line is a work-around to ensure docker is restarted whenever +# iptables is restarted.  This ensures the proper iptables rules will be in +# place for docker. +# Note:  This will also cause docker to be stopped if iptables is stopped. +PartOf=iptables.service | 
