--- - name: Download | Prepare working directories and variables import_tasks: prep_download.yml when: - not skip_downloads tags: - download - upload - name: Download | Get kubeadm binary and list of required images include_tasks: prep_kubeadm_images.yml when: - not skip_downloads - inventory_hostname in groups['kube_control_plane'] tags: - download - upload - name: Download | Download files / images include_tasks: "{{ include_file }}" loop: "{{ downloads | combine(kubeadm_images) | dict2items }}" vars: download: "{{ download_defaults | combine(item.value) }}" include_file: "download_{% if download.container %}container{% else %}file{% endif %}.yml" kubeadm_images: "{{ skip_kubeadm_images | ternary({}, _kubeadm_images) }}" # The trick (converting list of tuples to list of dicts) below come from # https://docs.ansible.com/ansible/latest/collections/community/general/dict_filter.html#examples _kubeadm_images: "{{ dict(names | map('regex_replace', '^(.*)', 'kubeadm_\\1') | zip( repos | zip(_tags, _groups) | map('zip', keys) | map('map', 'reverse') | map('community.general.dict') | map('combine', defaults))) | dict2items | rejectattr('key', 'in', excluded) | items2dict }}" keys: - repo - tag - groups images: "{{ kubeadm_images_raw.stdout_lines | map('split', ':') }}" _tags: "{{ images | map(attribute=1) }}" repos: "{{ images | map(attribute=0) }}" names: "{{ repos | map('split', '/') | map(attribute=-1) }}" _groups: "{{ names | map('extract', images_groups) }}" defaults: enabled: true container: true excluded: - kubeadm_coredns - kubeadm_pause images_groups: coredns: [] pause: [] kube-proxy: - k8s_cluster etcd: - etcd kube-scheduler: - kube_control_plane kube-controller-manager: - kube_control_plane kube-apiserver: - kube_control_plane when: - not skip_downloads - download.enabled - item.value.enabled - (not (item.value.container | default(false))) or (item.value.container and download_container) - (download_run_once and inventory_hostname == download_delegate) or (group_names | intersect(download.groups) | length)