mirror of
https://github.com/kubernetes-sigs/kubespray.git
synced 2026-06-30 23:38:03 +00:00
d6fd0d2aca
* Download to delegate and sync files when download_run_once * Fail on error after saving container image * Do not set changed status when downloaded container was up to date * Only sync containers when they are actually required Previously, non-required images (pull_required=false as image existed on target host) were synced to the target hosts. This failed as the image was not downloaded to the download_delegate and hence was not available for syncing. * Sync containers when only missing on some hosts * Consider images with multiple repo tags * Enable kubeadm images pull/syncing with download_delegate * Use kubeadm images list to pull/sync 'kubeadm config images pull' is replaced by collecting the images list with 'kubeadm config images list' and using the commonly used method of pull/syncing the images. * Ensure containers are downloaded and synced for all hosts * Fix download/syncing when download_delegate is a kubernetes host
142 lines
4.1 KiB
YAML
142 lines
4.1 KiB
YAML
---
|
|
- name: container_download | Make download decision if pull is required by tag or sha256
|
|
include: set_docker_image_facts.yml
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
tags:
|
|
- facts
|
|
|
|
- set_fact:
|
|
fname: "{{local_release_dir}}/containers/{{download.repo|regex_replace('/|\0|:', '_')}}:{{download.tag|default(download.sha256)|regex_replace('/|\0|:', '_')}}.tar"
|
|
run_once: true
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
|
|
tags:
|
|
- facts
|
|
|
|
- name: "container_download | Set default value for 'container_changed' to false"
|
|
set_fact:
|
|
container_changed: "{{pull_required|default(false)}}"
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
|
|
- name: "container_download | Update the 'container_changed' fact"
|
|
set_fact:
|
|
container_changed: "{{ pull_required|default(false) or not 'up to date' in pull_task_result.stdout }}"
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
- pull_required|default(download_always_pull)
|
|
run_once: "{{ download_run_once }}"
|
|
tags:
|
|
- facts
|
|
|
|
- name: container_download | Stat saved container image
|
|
stat:
|
|
path: "{{ fname }}"
|
|
register: img
|
|
changed_when: false
|
|
delegate_to: "{{ download_delegate }}"
|
|
delegate_facts: no
|
|
become: false
|
|
run_once: true
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
- any_pull_required | default(download_always_pull)
|
|
tags:
|
|
- facts
|
|
|
|
- name: container_download | save container images
|
|
shell: "{{ docker_bin_dir }}/docker save {{ pull_args }} | gzip -{{ download_compress }} > {{ fname }}"
|
|
delegate_to: "{{ download_delegate }}"
|
|
delegate_facts: no
|
|
register: saved
|
|
failed_when: saved.stderr != ""
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
- any_pull_required | default(download_always_pull)
|
|
- (ansible_os_family not in ["CoreOS", "Container Linux by CoreOS"] or download_delegate == "localhost")
|
|
- (container_changed or not img.stat.exists)
|
|
|
|
- name: container_download | create container images directory on ansible host
|
|
file:
|
|
state: directory
|
|
path: "{{ fname | dirname }}"
|
|
delegate_to: localhost
|
|
delegate_facts: no
|
|
run_once: true
|
|
become: false
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
- any_pull_required | default(download_always_pull)
|
|
- ansible_os_family not in ["CoreOS", "Container Linux by CoreOS"]
|
|
- inventory_hostname == download_delegate
|
|
- download_delegate != "localhost"
|
|
- saved.changed
|
|
|
|
- name: container_download | copy container images to ansible host
|
|
synchronize:
|
|
src: "{{ fname }}"
|
|
dest: "{{ fname }}"
|
|
use_ssh_args: "{{ has_bastion | default(false) }}"
|
|
mode: pull
|
|
private_key: "{{ ansible_ssh_private_key_file }}"
|
|
become: false
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
- ansible_os_family not in ["CoreOS", "Container Linux by CoreOS"]
|
|
- inventory_hostname == download_delegate
|
|
- download_delegate != "localhost"
|
|
- saved.changed
|
|
|
|
- name: container_download | upload container images to nodes
|
|
synchronize:
|
|
src: "{{ fname }}"
|
|
dest: "{{ fname }}"
|
|
use_ssh_args: "{{ has_bastion | default(false) }}"
|
|
mode: push
|
|
become: true
|
|
register: get_task
|
|
until: get_task is succeeded
|
|
retries: 4
|
|
delay: "{{ retry_stagger | random + 3 }}"
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
- pull_required|default(download_always_pull)
|
|
- (ansible_os_family not in ["CoreOS", "Container Linux by CoreOS"] and
|
|
inventory_hostname != download_delegate or
|
|
download_delegate == "localhost")
|
|
tags:
|
|
- upload
|
|
- upgrade
|
|
|
|
- name: container_download | load container images
|
|
shell: "{{ docker_bin_dir }}/docker load < {{ fname }}"
|
|
when:
|
|
- download.enabled
|
|
- download.container
|
|
- download_run_once
|
|
- pull_required|default(download_always_pull)
|
|
- (ansible_os_family not in ["CoreOS", "Container Linux by CoreOS"] and
|
|
inventory_hostname != download_delegate or download_delegate == "localhost")
|
|
tags:
|
|
- upload
|
|
- upgrade
|