aa447585c4
When download_run_once with download_localhost is used, docker is expected to be running on the delegate localhost. That may be not the case for a non localhost delegate, which is the kube-master otherwise. Then the dnsmasq role, had it been invoked early before deployment starts, would fail because of the missing docker dependency. * Fix that dependency on docker and do not pre download dnsmasq image for the dnsmasq role, if download_localhost is disabled. * Remove become: false for docker CLI invocation because that's not the common pattern to allow users access docker CLI w/o sudo. * Fix opt bin path hack for localhost delegate to ignore errors when it fails with "sudo password required" otherwise. * Describe download_run_once with download_localhost use case in docs as well. Signed-off-by: Bogdan Dobrelya <bdobrelia@mirantis.com>
133 lines
5.6 KiB
YAML
133 lines
5.6 KiB
YAML
---
|
|
- name: downloading...
|
|
debug:
|
|
msg: "{{ download.url }}"
|
|
when: "{{ download.enabled|bool and not download.container|bool }}"
|
|
|
|
- name: Create dest directories
|
|
file: path={{local_release_dir}}/{{download.dest|dirname}} state=directory recurse=yes
|
|
when: "{{ download.enabled|bool and not download.container|bool }}"
|
|
|
|
- name: Download items
|
|
get_url:
|
|
url: "{{download.url}}"
|
|
dest: "{{local_release_dir}}/{{download.dest}}"
|
|
sha256sum: "{{download.sha256 | default(omit)}}"
|
|
owner: "{{ download.owner|default(omit) }}"
|
|
mode: "{{ download.mode|default(omit) }}"
|
|
register: get_url_result
|
|
until: "'OK' in get_url_result.msg or 'file already exists' in get_url_result.msg"
|
|
retries: 4
|
|
delay: "{{ retry_stagger | random + 3 }}"
|
|
when: "{{ download.enabled|bool and not download.container|bool }}"
|
|
|
|
- name: Extract archives
|
|
unarchive:
|
|
src: "{{ local_release_dir }}/{{download.dest}}"
|
|
dest: "{{ local_release_dir }}/{{download.dest|dirname}}"
|
|
owner: "{{ download.owner|default(omit) }}"
|
|
mode: "{{ download.mode|default(omit) }}"
|
|
copy: no
|
|
when: "{{ download.enabled|bool and not download.container|bool and download.unarchive is defined and download.unarchive == True }}"
|
|
|
|
- name: Fix permissions
|
|
file:
|
|
state: file
|
|
path: "{{local_release_dir}}/{{download.dest}}"
|
|
owner: "{{ download.owner|default(omit) }}"
|
|
mode: "{{ download.mode|default(omit) }}"
|
|
when: "{{ download.enabled|bool and not download.container|bool and (download.unarchive is not defined or download.unarchive == False) }}"
|
|
|
|
- name: pulling...
|
|
debug:
|
|
msg: "{{ download.repo }}:{{ download.tag }}"
|
|
when: "{{ download.enabled|bool and download.container|bool }}"
|
|
|
|
- set_fact:
|
|
download_delegate: "{% if download_localhost %}localhost{% else %}{{groups['kube-master'][0]}}{% endif %}"
|
|
|
|
- name: Create dest directory for saved/loaded container images
|
|
file: path="{{local_release_dir}}/containers" state=directory recurse=yes mode=0755 owner={{ansible_ssh_user|default(ansible_user_id)}}
|
|
when: "{{ download.enabled|bool and download.container|bool }}"
|
|
|
|
# This is required for the download_localhost delegate to work smooth with CoreOS cluster nodes
|
|
- name: Hack python binary path for localhost
|
|
raw: sh -c "mkdir -p /opt/bin; ln -sf /usr/bin/python /opt/bin/python"
|
|
when: "{{ download_delegate == 'localhost' }}"
|
|
delegate_to: localhost
|
|
ignore_errors: true
|
|
run_once: true
|
|
|
|
- name: Download | create local directory for saved/loaded container images
|
|
file: path="{{local_release_dir}}/containers" state=directory recurse=yes
|
|
delegate_to: localhost
|
|
become: false
|
|
run_once: true
|
|
when: "{{ download_run_once|bool and download.enabled|bool and download.container|bool and download_delegate == 'localhost' }}"
|
|
|
|
#NOTE(bogdando) this brings no docker-py deps for nodes
|
|
- name: Download containers
|
|
command: "/usr/bin/docker pull {{ download.repo }}:{{ download.tag }}"
|
|
register: pull_task_result
|
|
until: pull_task_result|success
|
|
retries: 4
|
|
delay: "{{ retry_stagger | random + 3 }}"
|
|
when: "{{ download.enabled|bool and download.container|bool }}"
|
|
delegate_to: "{{ download_delegate if download_run_once|bool else inventory_hostname }}"
|
|
run_once: "{{ download_run_once|bool }}"
|
|
|
|
- set_fact:
|
|
fname: "{{local_release_dir}}/containers/{{download.repo|regex_replace('/|\0|:', '_')}}:{{download.tag|regex_replace('/|\0|:', '_')}}.tar"
|
|
|
|
- name: "Set default value for 'container_changed' to false"
|
|
set_fact:
|
|
container_changed: false
|
|
|
|
- name: "Update the 'container_changed' fact"
|
|
set_fact:
|
|
container_changed: "{{ not 'up to date' in pull_task_result.stdout }}"
|
|
when: "{{ download.enabled|bool and download.container|bool }}"
|
|
delegate_to: "{{ download_delegate if download_run_once|bool else inventory_hostname }}"
|
|
run_once: "{{ download_run_once|bool }}"
|
|
|
|
- name: Stat saved container image
|
|
stat: path="{{fname}}"
|
|
register: img
|
|
changed_when: false
|
|
when: "{{ download.enabled|bool and download.container|bool and download_run_once|bool }}"
|
|
delegate_to: "{{ download_delegate }}"
|
|
become: false
|
|
run_once: true
|
|
|
|
- name: Download | save container images
|
|
shell: docker save "{{ download.repo }}:{{ download.tag }}" | gzip -{{ download_compress }} > "{{ fname }}"
|
|
delegate_to: "{{ download_delegate }}"
|
|
register: saved
|
|
run_once: true
|
|
when: (ansible_os_family != "CoreOS" or download_delegate == "localhost") and download_run_once|bool and download.enabled|bool and download.container|bool and (container_changed|bool or not img.stat.exists)
|
|
|
|
- name: Download | copy container images to ansible host
|
|
synchronize:
|
|
src: "{{ fname }}"
|
|
dest: "{{ fname }}"
|
|
mode: pull
|
|
delegate_to: localhost
|
|
become: false
|
|
when: ansible_os_family != "CoreOS" and inventory_hostname == groups['kube-master'][0] and download_delegate != "localhost" and download_run_once|bool and download.enabled|bool and download.container|bool and saved.changed
|
|
|
|
- name: Download | upload container images to nodes
|
|
synchronize:
|
|
src: "{{ fname }}"
|
|
dest: "{{ fname }}"
|
|
mode: push
|
|
delegate_to: localhost
|
|
become: false
|
|
register: get_task
|
|
until: get_task|success
|
|
retries: 4
|
|
delay: "{{ retry_stagger | random + 3 }}"
|
|
when: (ansible_os_family != "CoreOS" and inventory_hostname != groups['kube-master'][0] or download_delegate == "localhost") and download_run_once|bool and download.enabled|bool and download.container|bool
|
|
|
|
- name: Download | load container images
|
|
shell: docker load < "{{ fname }}"
|
|
when: (ansible_os_family != "CoreOS" and inventory_hostname != groups['kube-master'][0] or download_delegate == "localhost") and download_run_once|bool and download.enabled|bool and download.container|bool
|