containers: export all images in one file
[infra/stack/kubernetes.git] / playbooks / roles / package / tasks / containers.yaml
index c90f906..e94d6fd 100644 (file)
     kubeadm_images: "{{ kubeadm_images_cooked.results | map(attribute='ansible_facts.kubeadm_image') | list | items2dict }}"
   run_once: true
 
-# NOTE (fdegir): docker_image module doesn't seem to respect become so falling back to command module
-- name: Pull kubeadm container images
-  command: "docker pull {{ kubeadm_images[item.key].repo }}:{{ kubeadm_images[item.key].tag }}"
-  with_dict: "{{ kubeadm_images }}"
-  become: true
+- name: Populate list of images to pull and save with those specified by Kubespray
+  vars:
+    image_list: []
+  set_fact:
+    image_list: "{{ image_list }} + [ '{{ downloads[item].repo }}:{{ downloads[item].tag }}' ]"
+  loop: "{{ k8s_misc_images }}"
   changed_when: false
+  when: downloads[item].container is defined and downloads[item].container
 
-- name: Pull tiller container image (helm v2 only)
-  command: "docker pull {{ downloads['tiller'].repo }}:{{ downloads['tiller'].tag }}"
-  become: true
+- name: Populate list of images to pull and save with those specified by Kubeadm
+  set_fact:
+    image_list: "{{ image_list }} + [ '{{ item.value.repo }}:{{ item.value.tag }}' ]"
+  loop: "{{ kubeadm_images | dict2items }}"
   changed_when: false
-  when: helm_version is version('v3.0.0', '<')
 
-- name: Pull misc container images
-  command: "docker pull {{ downloads[item].repo }}:{{ downloads[item].tag }}"
-  loop: "{{ k8s_misc_images }}"
-  become: true
+- name: Populate list of images to pull and save with other miscellaneous images
+  set_fact:
+    image_list: "{{ image_list }} + [ '{{ item.value.repo }}:{{ item.value.tag }}' ]"
+  loop: "{{ other_images | dict2items }}"
   changed_when: false
-  when: downloads[item].container is defined and downloads[item].container
 
-- name: Pull other container images
-  command: "docker pull {{ other_images[item.key].repo }}:{{ other_images[item.key].tag }}"
-  with_dict: "{{ other_images }}"
-  become: true
+- name: Add tiller container image to list of images (helm v2 only)
+  set_fact:
+    image_list: "{{ image_list }} + [ '{{ downloads['tiller'].repo }}:{{ downloads['tiller'].tag }}' ]"
   changed_when: false
+  when: helm_version is version('v3.0.0', '<')
 
-# save container images
-- name: Save kubeadm container images
-  command: |-
-    docker save {{ kubeadm_images[item.key].repo }}:{{ kubeadm_images[item.key].tag }}
-    -o {{ kubeadm_images[item.key].repo | replace('/', '_') }}_{{ kubeadm_images[item.key].tag }}.tar
-  with_dict: "{{ kubeadm_images }}"
-  args:
-    chdir: "{{ containers_folder }}"
-  become: true
-  changed_when: false
+- name: Dump image list to disk
+  copy:
+    content: "{{ image_list | join('\n') }}"
+    dest: "{{ engine_cache }}/images.txt"
 
-- name: Save misc container images
-  command: |-
-    docker save {{ downloads[item].repo }}:{{ downloads[item].tag }}
-    -o {{ downloads[item].repo }} -o {{ downloads[item].repo | replace('/', '_') }}_{{ downloads[item].tag }}.tar
-  loop: "{{ k8s_misc_images }}"
-  args:
-    chdir: "{{ containers_folder }}"
+- name: Pull images (using pull-images.sh)
+  vars:
+    container_tool: docker
+    container_pull_parallel: 4
+    images_txt: "{{ engine_cache }}/images.txt"
+  script: pull-images.sh -l {{ images_txt }} -c {{ container_tool }} -p {{ container_pull_parallel }}
   become: true
-  changed_when: false
-  when: downloads[item].container is defined and downloads[item].container
+  register: pull_images_output_raw
+  changed_when: pull_images_output_raw.stdout is search("downloaded newer image for", ignorecase=true)
 
-- name: Save tiller container image (helm v2 only)
-  command: |-
-    docker save {{ downloads['tiller'].repo }}:{{ downloads['tiller'].tag }}
-    -o {{ downloads['tiller'].repo }} -o {{ downloads['tiller'].repo | replace('/', '_') }}_{{ downloads['tiller'].tag }}.tar
+- name: Save images (using save-images.sh)
+  vars:
+    container_tool: docker
+    images_txt: "{{ engine_cache }}/images.txt"
+    images_output: "{{ containers_folder }}/images.tar"
+  script: save-images.sh -l {{ images_txt }} -c {{ container_tool }} -o {{ images_output }}
   args:
-    chdir: "{{ containers_folder }}"
+    creates: "{{ images_output }}"
   become: true
-  changed_when: false
-  when: helm_version is version('v3.0.0', '<')
 
-- name: Save other container images
-  command: |-
-    docker save {{ other_images[item.key].repo }}:{{ other_images[item.key].tag }}
-    -o {{ other_images[item.key].repo | replace('/', '_') }}_{{ other_images[item.key].tag }}.tar
-  with_dict: "{{ other_images }}"
+- name: Save registry image separately
+  vars:
+    img: "{{ other_images['docker-registry'].repo }}:{{ other_images['docker-registry'].tag }}"
+    dest: "{{ img | regex_replace('[/:]', '_') }}.tar"
+  shell: |-
+    set -o pipefail && \
+    docker save {{ img }} -o {{ dest }}
   args:
+    executable: "/bin/bash"
     chdir: "{{ containers_folder }}"
+    creates: "{{ containers_folder }}/{{ dest }}"
   become: true
-  changed_when: false
 
 # NOTE (fdegir): archive fails due to wrong permissions so we fix them
 - name: Fix container image permissions