diff options
Diffstat (limited to 'roles/docker')
| -rw-r--r-- | roles/docker/README.md | 9 | ||||
| -rw-r--r-- | roles/docker/handlers/main.yml | 2 | ||||
| -rw-r--r-- | roles/docker/meta/main.yml | 1 | ||||
| -rw-r--r-- | roles/docker/tasks/main.yml | 122 | ||||
| -rw-r--r-- | roles/docker/tasks/package_docker.yml | 116 | ||||
| -rw-r--r-- | roles/docker/tasks/systemcontainer_docker.yml | 160 | ||||
| -rw-r--r-- | roles/docker/templates/daemon.json | 20 | ||||
| -rw-r--r-- | roles/docker/templates/systemcontainercustom.conf.j2 | 17 | ||||
| -rw-r--r-- | roles/docker/vars/main.yml | 4 | 
9 files changed, 335 insertions, 116 deletions
| diff --git a/roles/docker/README.md b/roles/docker/README.md index ea06fd41a..4a9f21f22 100644 --- a/roles/docker/README.md +++ b/roles/docker/README.md @@ -1,7 +1,9 @@  Docker  ========= -Ensures docker package is installed, and optionally raises timeout for systemd-udevd.service to 5 minutes. +Ensures docker package or system container is installed, and optionally raises timeout for systemd-udevd.service to 5 minutes. + +daemon.json items may be found at https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file  Requirements  ------------ @@ -11,8 +13,10 @@ Ansible 2.2  Role Variables  -------------- -udevw_udevd_dir: location of systemd config for systemd-udevd.service +docker_conf_dir: location of the Docker configuration directory +docker_systemd_dir location of the systemd directory for Docker  docker_udev_workaround: raises udevd timeout to 5 minutes (https://bugzilla.redhat.com/show_bug.cgi?id=1272446) +udevw_udevd_dir: location of systemd config for systemd-udevd.service  Dependencies  ------------ @@ -26,6 +30,7 @@ Example Playbook        roles:        - role: docker          docker_udev_workaround: "true" +        docker_use_system_container: False  License  ------- diff --git a/roles/docker/handlers/main.yml b/roles/docker/handlers/main.yml index 9ccb306fc..7f91afb37 100644 --- a/roles/docker/handlers/main.yml +++ b/roles/docker/handlers/main.yml @@ -2,7 +2,7 @@  - name: restart docker    systemd: -    name: docker +    name: "{{ openshift.docker.service_name }}"      state: restarted    when: not docker_service_status_changed | default(false) | bool diff --git a/roles/docker/meta/main.yml b/roles/docker/meta/main.yml index ad28cece9..cd4083572 100644 --- a/roles/docker/meta/main.yml +++ b/roles/docker/meta/main.yml @@ -11,3 +11,4 @@ galaxy_info:      - 7  dependencies:  - role: os_firewall +- role: lib_openshift diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml index c34700aeb..0c2b16acf 100644 --- a/roles/docker/tasks/main.yml +++ b/roles/docker/tasks/main.yml @@ -1,119 +1,17 @@  --- -- name: Get current installed Docker version -  command: "{{ repoquery_cmd }} --installed --qf '%{version}' docker" -  when: not openshift.common.is_atomic | bool -  register: curr_docker_version -  changed_when: false - -- name: Error out if Docker pre-installed but too old -  fail: -    msg: "Docker {{ curr_docker_version.stdout }} is installed, but >= 1.9.1 is required." -  when: not curr_docker_version | skipped and curr_docker_version.stdout != '' and curr_docker_version.stdout | version_compare('1.9.1', '<') and not docker_version is defined - -- name: Error out if requested Docker is too old -  fail: -    msg: "Docker {{ docker_version }} requested, but >= 1.9.1 is required." -  when: docker_version is defined and docker_version | version_compare('1.9.1', '<') - -# If a docker_version was requested, sanity check that we can install or upgrade to it, and -# no downgrade is required. -- name: Fail if Docker version requested but downgrade is required -  fail: -    msg: "Docker {{ curr_docker_version.stdout }} is installed, but version {{ docker_version }} was requested." -  when: not curr_docker_version | skipped and curr_docker_version.stdout != '' and docker_version is defined and curr_docker_version.stdout | version_compare(docker_version, '>') - -# This involves an extremely slow migration process, users should instead run the -# Docker 1.10 upgrade playbook to accomplish this. -- name: Error out if attempting to upgrade Docker across the 1.10 boundary -  fail: -    msg: "Cannot upgrade Docker to >= 1.10, please upgrade or remove Docker manually, or use the Docker upgrade playbook if OpenShift is already installed." -  when: not curr_docker_version | skipped and curr_docker_version.stdout != '' and curr_docker_version.stdout | version_compare('1.10', '<') and docker_version is defined and docker_version | version_compare('1.10', '>=') - -# Make sure Docker is installed, but does not update a running version. -# Docker upgrades are handled by a separate playbook. -- name: Install Docker -  package: name=docker{{ '-' + docker_version if docker_version is defined else '' }} state=present -  when: not openshift.common.is_atomic | bool - -- block: -  # Extend the default Docker service unit file when using iptables-services -  - name: Ensure docker.service.d directory exists -    file: -      path: "{{ docker_systemd_dir }}" -      state: directory - -  - name: Configure Docker service unit file -    template: -      dest: "{{ docker_systemd_dir }}/custom.conf" -      src: custom.conf.j2 -  when: not os_firewall_use_firewalld | default(True) | bool +# These tasks dispatch to the proper set of docker tasks based on the +# inventory:openshift_docker_use_system_container variable  - include: udev_workaround.yml    when: docker_udev_workaround | default(False) | bool -- stat: path=/etc/sysconfig/docker -  register: docker_check - -- name: Set registry params -  lineinfile: -    dest: /etc/sysconfig/docker -    regexp: '^{{ item.reg_conf_var }}=.*$' -    line: "{{ item.reg_conf_var }}='{{ item.reg_fact_val | oo_prepend_strings_in_list(item.reg_flag ~ ' ') | join(' ') }}'" -  when: item.reg_fact_val != '' and docker_check.stat.isreg is defined and docker_check.stat.isreg -  with_items: -  - reg_conf_var: ADD_REGISTRY -    reg_fact_val: "{{ docker_additional_registries | default(None, true)}}" -    reg_flag: --add-registry -  - reg_conf_var: BLOCK_REGISTRY -    reg_fact_val: "{{ docker_blocked_registries| default(None, true) }}" -    reg_flag: --block-registry -  - reg_conf_var: INSECURE_REGISTRY -    reg_fact_val: "{{ docker_insecure_registries| default(None, true) }}" -    reg_flag: --insecure-registry -  notify: -  - restart docker - -- name: Set Proxy Settings -  lineinfile: -    dest: /etc/sysconfig/docker -    regexp: '^{{ item.reg_conf_var }}=.*$' -    line: "{{ item.reg_conf_var }}='{{ item.reg_fact_val }}'" -    state: "{{ 'present' if item.reg_fact_val != '' else 'absent'}}" -  with_items: -  - reg_conf_var: HTTP_PROXY -    reg_fact_val: "{{ docker_http_proxy | default('') }}" -  - reg_conf_var: HTTPS_PROXY -    reg_fact_val: "{{ docker_https_proxy | default('') }}" -  - reg_conf_var: NO_PROXY -    reg_fact_val: "{{ docker_no_proxy | default('') }}" -  notify: -  - restart docker -  when: -  - docker_check.stat.isreg is defined and docker_check.stat.isreg and '"http_proxy" in openshift.common or "https_proxy" in openshift.common' - -- name: Set various Docker options -  lineinfile: -    dest: /etc/sysconfig/docker -    regexp: '^OPTIONS=.*$' -    line: "OPTIONS='\ -      {% if ansible_selinux.status | default(None) == '''enabled''' and docker_selinux_enabled | default(true) %} --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 %}'" -  when: docker_check.stat.isreg is defined and docker_check.stat.isreg -  notify: -  - restart docker - -- name: Start the Docker service -  systemd: -    name: docker -    enabled: yes -    state: started -    daemon_reload: yes -  register: start_result -  - set_fact: -    docker_service_status_changed: start_result | changed +    l_use_system_container: "{{ openshift.docker.use_system_container | default(False) }}" + +- name: Use Package Docker if Requested +  include: package_docker.yml +  when: not l_use_system_container -- meta: flush_handlers +- name: Use System Container Docker if Requested +  include: systemcontainer_docker.yml +  when: l_use_system_container diff --git a/roles/docker/tasks/package_docker.yml b/roles/docker/tasks/package_docker.yml new file mode 100644 index 000000000..e101730d2 --- /dev/null +++ b/roles/docker/tasks/package_docker.yml @@ -0,0 +1,116 @@ +--- +- name: Get current installed Docker version +  command: "{{ repoquery_cmd }} --installed --qf '%{version}' docker" +  when: not openshift.common.is_atomic | bool +  register: curr_docker_version +  changed_when: false + +- name: Error out if Docker pre-installed but too old +  fail: +    msg: "Docker {{ curr_docker_version.stdout }} is installed, but >= 1.9.1 is required." +  when: not curr_docker_version | skipped and curr_docker_version.stdout != '' and curr_docker_version.stdout | version_compare('1.9.1', '<') and not docker_version is defined + +- name: Error out if requested Docker is too old +  fail: +    msg: "Docker {{ docker_version }} requested, but >= 1.9.1 is required." +  when: docker_version is defined and docker_version | version_compare('1.9.1', '<') + +# If a docker_version was requested, sanity check that we can install or upgrade to it, and +# no downgrade is required. +- name: Fail if Docker version requested but downgrade is required +  fail: +    msg: "Docker {{ curr_docker_version.stdout }} is installed, but version {{ docker_version }} was requested." +  when: not curr_docker_version | skipped and curr_docker_version.stdout != '' and docker_version is defined and curr_docker_version.stdout | version_compare(docker_version, '>') + +# This involves an extremely slow migration process, users should instead run the +# Docker 1.10 upgrade playbook to accomplish this. +- name: Error out if attempting to upgrade Docker across the 1.10 boundary +  fail: +    msg: "Cannot upgrade Docker to >= 1.10, please upgrade or remove Docker manually, or use the Docker upgrade playbook if OpenShift is already installed." +  when: not curr_docker_version | skipped and curr_docker_version.stdout != '' and curr_docker_version.stdout | version_compare('1.10', '<') and docker_version is defined and docker_version | version_compare('1.10', '>=') + +# Make sure Docker is installed, but does not update a running version. +# Docker upgrades are handled by a separate playbook. +- name: Install Docker +  package: name=docker{{ '-' + docker_version if docker_version is defined else '' }} state=present +  when: not openshift.common.is_atomic | bool + +- block: +  # Extend the default Docker service unit file when using iptables-services +  - name: Ensure docker.service.d directory exists +    file: +      path: "{{ docker_systemd_dir }}" +      state: directory + +  - name: Configure Docker service unit file +    template: +      dest: "{{ docker_systemd_dir }}/custom.conf" +      src: custom.conf.j2 +  when: not os_firewall_use_firewalld | default(False) | bool + +- stat: path=/etc/sysconfig/docker +  register: docker_check + +- name: Set registry params +  lineinfile: +    dest: /etc/sysconfig/docker +    regexp: '^{{ item.reg_conf_var }}=.*$' +    line: "{{ item.reg_conf_var }}='{{ item.reg_fact_val | oo_prepend_strings_in_list(item.reg_flag ~ ' ') | join(' ') }}'" +  when: item.reg_fact_val != '' and docker_check.stat.isreg is defined and docker_check.stat.isreg +  with_items: +  - reg_conf_var: ADD_REGISTRY +    reg_fact_val: "{{ docker_additional_registries | default(None, true)}}" +    reg_flag: --add-registry +  - reg_conf_var: BLOCK_REGISTRY +    reg_fact_val: "{{ docker_blocked_registries| default(None, true) }}" +    reg_flag: --block-registry +  - reg_conf_var: INSECURE_REGISTRY +    reg_fact_val: "{{ docker_insecure_registries| default(None, true) }}" +    reg_flag: --insecure-registry +  notify: +  - restart docker + +- name: Set Proxy Settings +  lineinfile: +    dest: /etc/sysconfig/docker +    regexp: '^{{ item.reg_conf_var }}=.*$' +    line: "{{ item.reg_conf_var }}='{{ item.reg_fact_val }}'" +    state: "{{ 'present' if item.reg_fact_val != '' else 'absent'}}" +  with_items: +  - reg_conf_var: HTTP_PROXY +    reg_fact_val: "{{ docker_http_proxy | default('') }}" +  - reg_conf_var: HTTPS_PROXY +    reg_fact_val: "{{ docker_https_proxy | default('') }}" +  - reg_conf_var: NO_PROXY +    reg_fact_val: "{{ docker_no_proxy | default('') }}" +  notify: +  - restart docker +  when: +  - docker_check.stat.isreg is defined and docker_check.stat.isreg and '"http_proxy" in openshift.common or "https_proxy" in openshift.common' + +- name: Set various Docker options +  lineinfile: +    dest: /etc/sysconfig/docker +    regexp: '^OPTIONS=.*$' +    line: "OPTIONS='\ +      {% if ansible_selinux.status | default(None) == '''enabled''' and docker_selinux_enabled | default(true) %} --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 %}'" +  when: docker_check.stat.isreg is defined and docker_check.stat.isreg +  notify: +  - restart docker + +- name: Start the Docker service +  systemd: +    name: docker +    enabled: yes +    state: started +    daemon_reload: yes +  register: start_result + +- set_fact: +    docker_service_status_changed: start_result | changed + +- meta: flush_handlers diff --git a/roles/docker/tasks/systemcontainer_docker.yml b/roles/docker/tasks/systemcontainer_docker.yml new file mode 100644 index 000000000..f0f5a40dd --- /dev/null +++ b/roles/docker/tasks/systemcontainer_docker.yml @@ -0,0 +1,160 @@ +--- +# 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 +  assert: +    that: +      - docker_options is defined +      - docker_options != "" +    msg: | +      Docker via System Container does not allow for the use of the openshift_docker_options +      variable. If you want to use openshift_docker_options you will need to use the +      traditional docker package install. Otherwise, comment out openshift_docker_options +      in your inventory file. + +# Used to pull and install the system container +- name: Ensure atomic is installed +  package: +    name: atomic +    state: present +  when: not openshift.common.is_atomic | bool + +# At the time of writing the atomic command requires runc for it's own use. This +# task is here in the even that the atomic package ever removes the dependency. +- name: Ensure runc is installed +  package: +    name: runc +    state: present +  when: not openshift.common.is_atomic | bool + +# Make sure Docker is installed so we are able to use the client +- name: Install Docker so we can use the client +  package: name=docker{{ '-' + docker_version if docker_version is defined else '' }} state=present +  when: not openshift.common.is_atomic | bool + +# Make sure docker is disabled. Errors are ignored. +- name: Disable Docker +  systemd: +    name: docker +    enabled: no +    state: stopped +    daemon_reload: yes +  ignore_errors: True + +# 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 != '' + +- block: + +    - name: Set to default prepend +      set_fact: +        l_docker_image_prepend: "gscrivano" + +    - name: Use Red Hat Registry for image when distribution is Red Hat +      set_fact: +        l_docker_image_prepend: "registry.access.redhat.com/openshift3" +      when: ansible_distribution == 'RedHat' + +    - name: Use Fedora Registry for image when distribution is Fedora +      set_fact: +        l_docker_image_prepend: "registry.fedoraproject.org" +      when: ansible_distribution == 'Fedora' + +    # For https://github.com/openshift/openshift-ansible/pull/4049#discussion_r114478504 +    - name: Use a testing registry if requested +      set_fact: +        l_docker_image_prepend: "{{ openshift_docker_systemcontainer_image_registry_override }}" +      when: +        - openshift_docker_systemcontainer_image_registry_override is defined +        - openshift_docker_systemcontainer_image_registry_override != "" + +    - name: Set the full image name +      set_fact: +        l_docker_image: "{{ l_docker_image_prepend }}/{{ openshift.docker.service_name }}:latest" + +# NOTE: no_proxy added as a workaround until https://github.com/projectatomic/atomic/pull/999 is released +- name: Pre-pull Container Engine System Container image +  command: "atomic pull --storage ostree {{ l_docker_image }}" +  changed_when: false +  environment: +    NO_PROXY: "{{ openshift.common.no_proxy | default('') }}" + + +- name: Ensure container-engine.service.d directory exists +  file: +    path: "{{ container_engine_systemd_dir }}" +    state: directory + +- name: Ensure /etc/docker directory exists +  file: +    path: "{{ docker_conf_dir }}" +    state: directory + +- name: Install Container Engine System Container +  oc_atomic_container: +    name: "{{ openshift.docker.service_name }}" +    image: "{{ l_docker_image }}" +    state: latest + +- name: Configure Container Engine Service File +  template: +    dest: "{{ container_engine_systemd_dir }}/custom.conf" +    src: systemcontainercustom.conf.j2 + +# Set local versions of facts that must be in json format for daemon.json +# NOTE: When jinja2.9+ is used the daemon.json file can move to using tojson +- set_fact: +    l_docker_insecure_registries: "{{ docker_insecure_registries | default([]) | to_json }}" +    l_docker_log_options: "{{ docker_log_options | default({}) | to_json }}" +    l_docker_additional_registries: "{{ docker_additional_registries | default([]) | to_json }}" +    l_docker_blocked_registries: "{{ docker_blocked_registries | default([]) | to_json }}" +    l_docker_selinux_enabled: "{{ docker_selinux_enabled | default(true) | to_json }}" + +# Configure container-engine using the daemon.json file +- name: Configure Container Engine +  template: +    dest: "{{ docker_conf_dir }}/daemon.json" +    src: daemon.json + +# Enable and start the container-engine service +- name: Start the Container Engine service +  systemd: +    name: "{{ openshift.docker.service_name }}" +    enabled: yes +    state: started +    daemon_reload: yes +  register: start_result + +- set_fact: +    docker_service_status_changed: start_result | changed + +- meta: flush_handlers diff --git a/roles/docker/templates/daemon.json b/roles/docker/templates/daemon.json new file mode 100644 index 000000000..a41b7cdbd --- /dev/null +++ b/roles/docker/templates/daemon.json @@ -0,0 +1,20 @@ +{ +    "authorization-plugins": ["rhel-push-plugin"], +    "default-runtime": "oci", +    "containerd": "/run/containerd.sock", +    "disable-legacy-registry": false, +    "exec-opts": ["native.cgroupdriver=systemd"], +    "insecure-registries": {{ l_docker_insecure_registries }}, +{% if docker_log_driver is defined  %} +    "log-driver": "{{ docker_log_driver }}", +{%- endif %} +    "log-opts": {{ l_docker_log_options }}, +    "runtimes": { +	"oci": { +	    "path": "/usr/libexec/docker/docker-runc-current" +	} +    }, +    "selinux-enabled": {{ l_docker_selinux_enabled | lower }}, +    "add-registry": {{ l_docker_additional_registries }}, +    "block-registry": {{ l_docker_blocked_registries }} +} diff --git a/roles/docker/templates/systemcontainercustom.conf.j2 b/roles/docker/templates/systemcontainercustom.conf.j2 new file mode 100644 index 000000000..86eebfba6 --- /dev/null +++ b/roles/docker/templates/systemcontainercustom.conf.j2 @@ -0,0 +1,17 @@ +# {{ ansible_managed }} + +[Service] +{% if "http_proxy" in openshift.common %} +Environment=HTTP_PROXY={{ docker_http_proxy }} +{% endif -%} +{% if "https_proxy" in openshift.common %} +Environment=HTTPS_PROXY={{ docker_http_proxy }} +{% endif -%} +{% if "no_proxy" in openshift.common %} +Environment=NO_PROXY={{ docker_no_proxy }} +{% endif %} +{%- if os_firewall_use_firewalld|default(false) %} +[Unit] +Wants=iptables.service +After=iptables.service +{%- endif %} diff --git a/roles/docker/vars/main.yml b/roles/docker/vars/main.yml index 5237ed8f2..4e940b7f5 100644 --- a/roles/docker/vars/main.yml +++ b/roles/docker/vars/main.yml @@ -1,3 +1,5 @@  --- -udevw_udevd_dir: /etc/systemd/system/systemd-udevd.service.d  docker_systemd_dir: /etc/systemd/system/docker.service.d +container_engine_systemd_dir: /etc/systemd/system/container-engine.service.d +docker_conf_dir: /etc/docker/ +udevw_udevd_dir: /etc/systemd/system/systemd-udevd.service.d | 
