Merge "Refactor Ansible playbook for download and push images"

This commit is contained in:
Zuul
2019-10-17 15:39:07 +00:00
committed by Gerrit Code Review
9 changed files with 295 additions and 272 deletions

View File

@@ -167,3 +167,13 @@
systemd:
name: docker-distribution
state: restarted
- name: Update /etc/hosts with local registry host
command: >-
sed -i -e 's|'$CONTROLLER_ADDRESS'\t'$CONTROLLER'|'$CONTROLLER_ADDRESS'\t'$CONTROLLER'\t'$LOCAL_REGISTRY'|g' /etc/hosts
args:
warn: false
environment:
CONTROLLER_ADDRESS: "{{ controller_floating_address }}"
CONTROLLER: "controller"
LOCAL_REGISTRY: "registry.local"

View File

@@ -52,7 +52,8 @@
import_tasks: bringup_local_registry.yml
- name: Push images to local docker registry
import_tasks: push_images_to_local_registry.yml
import_role:
name: common/push-docker-images
- name: Bring up Kubernetes master
import_tasks: bringup_kubemaster.yml

View File

@@ -1,242 +0,0 @@
---
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# SUB-TASKS DESCRIPTION:
# This task is to pre-pull platform images from public/private registries
# and push images to the local registry.
# - Update /etc/hosts with registry.local
# - Login to k8s/gcr/quay/docker registries if applicable
# - Login to local registry with its credentials
# - Pull platform images from k8s/gcr/quay/docker registries
# and push them to local registry
# - Logout of k8s/gcr/quay/docker registries if applicable
# - Logout of local registry
# - Remove registry.local from /etc/hosts
- name: Update /etc/hosts with local registry host
command: >-
sed -i -e 's|'$CONTROLLER_ADDRESS'\t'$CONTROLLER'|'$CONTROLLER_ADDRESS'\t'$CONTROLLER'\t'$LOCAL_REGISTRY'|g' /etc/hosts
args:
warn: false
environment:
CONTROLLER_ADDRESS: "{{ controller_floating_address }}"
CONTROLLER: "controller"
LOCAL_REGISTRY: "registry.local"
- name: Get kubernetes version
command: "sed -n 's|^kubernetesVersion: \\(.*\\)$|\\1|p' {{ kube_admin_yaml_template }}"
args:
warn: false
register: kubernetes_version
- name: Get the list of kubernetes images
shell: "kubeadm config images list --kubernetes-version {{ kubernetes_version.stdout }}
--image-repository {{ k8s_registry.url }} | grep -v etcd"
register: kubernetes_images_output
- set_fact:
kubernetes_images: "{{ kubernetes_images_output.stdout_lines }}"
- name: Update Tiller, Armada, Calico, Multus, Sriov image tags
set_fact:
tiller_img: "{{ tiller_img | regex_replace('gcr.io', '{{ gcr_registry.url }}') }}"
armada_img: "{{ armada_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
calico_cni_img: "{{ calico_cni_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
calico_node_img: "{{ calico_node_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
calico_kube_controllers_img: "{{ calico_kube_controllers_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
multus_img: "{{ multus_img | regex_replace('docker.io', '{{ docker_registry.url }}') }}"
sriov_cni_img: "{{ sriov_cni_img | regex_replace('docker.io', '{{ docker_registry.url }}') }}"
sriov_network_device_img: "{{ sriov_network_device_img | regex_replace('docker.io', '{{ docker_registry.url }}') }}"
- name: Get the list of platform images
set_fact:
platform_images:
- "{{ tiller_img }}"
- "{{ armada_img }}"
- "{{ calico_cni_img }}"
- "{{ calico_node_img }}"
- "{{ calico_kube_controllers_img }}"
- "{{ multus_img }}"
- "{{ sriov_cni_img }}"
- "{{ sriov_network_device_img }}"
- block:
- name: Update additional image tags if applicable
shell: >-
echo {{ item }} | sed 's|quay.io|{{ quay_registry.url }}|g' | sed 's|docker.io|{{ docker_registry.url }}|g' |
sed 's|k8s.gcr.io|{{ k8s_registry.url }}|g' | sed 's|gcr.io|{{ gcr_registry.url }}|g'
with_items: "{{ additional_local_registry_images }}"
register: images
- set_fact:
additional_images: "{{ images.results | map(attribute='stdout') | list }}"
when: additional_local_registry_images
- name: Set the download images list
set_fact:
download_images_list:
"{{ (kubernetes_images + platform_images + additional_images) if additional_images is defined
else (kubernetes_images + platform_images) }}"
- set_fact:
download_images: "{{ download_images_list | join(',') }}"
- debug: var=download_images_list
- block:
- block:
- name: Get the k8s registry credentials if registry type is AWS ECR
script: get_registry_auth.py {{ k8s_registry.url }} {{ k8s_registry.username }} {{ k8s_registry.password }}
register: k8s_registry_auth_output
- set_fact:
k8s_registry_auth: "{{ k8s_registry_auth_output.stdout }}"
- set_fact:
k8s_registry: "{{ k8s_registry | combine(k8s_registry_auth, recursive=true) }}"
when: k8s_registry.type is defined and k8s_registry.type == 'aws-ecr'
- name: Log in to k8s registry if credentials exist
docker_login:
registry: "{{ k8s_registry['url'] }}"
username: "{{ k8s_registry['username'] }}"
password: "{{ k8s_registry['password'] }}"
when: k8s_registry.username is defined
- block:
- block:
- name: Get the gcr registry credentials if registry type is AWS ECR
script: get_registry_auth.py {{ gcr_registry.url }} {{ gcr_registry.username }} {{ gcr_registry.password }}
register: gcr_registry_auth_output
- set_fact:
gcr_registry_auth: "{{ gcr_registry_auth_output.stdout }}"
- set_fact:
gcr_registry: "{{ gcr_registry | combine(gcr_registry_auth, recursive=true) }}"
when: gcr_registry.type is defined and gcr_registry.type == 'aws-ecr'
- name: Log in to gcr registry if credentials exist
docker_login:
registry: "{{ gcr_registry['url'] }}"
username: "{{ gcr_registry['username'] }}"
password: "{{ gcr_registry['password'] }}"
when: gcr_registry.username is defined
- block:
- block:
- name: Get the quay registry credentials if registry type is AWS ECR
script: get_registry_auth.py {{ quay_registry.url }} {{ quay_registry.username }} {{ quay_registry.password }}
register: quay_registry_auth_output
- set_fact:
quay_registry_auth: "{{ quay_registry_auth_output.stdout }}"
- set_fact:
quay_registry: "{{ quay_registry | combine(quay_registry_auth, recursive=true) }}"
when: quay_registry.type is defined and quay_registry.type == 'aws-ecr'
- name: Log in to quay registry if credentials exist
docker_login:
registry: "{{ quay_registry['url'] }}"
username: "{{ quay_registry['username'] }}"
password: "{{ quay_registry['password'] }}"
when: quay_registry.username is defined
- block:
- block:
- name: Get the docker registry credentials if registry type is AWS ECR
script: get_registry_auth.py {{ docker_registry.url }} {{ docker_registry.username }} {{ docker_registry.password }}
register: docker_registry_auth_output
- set_fact:
docker_registry_auth: "{{ docker_registry_auth_output.stdout }}"
- set_fact:
docker_registry: "{{ docker_registry | combine(docker_registry_auth, recursive=true) }}"
when: docker_registry.type is defined and docker_registry.type == 'aws-ecr'
- name: Log in to docker registry if credentials exist
docker_login:
registry: "{{ docker_registry['url'] }}"
username: "{{ docker_registry['username'] }}"
password: "{{ docker_registry['password'] }}"
when: docker_registry.username is defined
- name: Get local registry credentials
vars:
script_content: |
import keyring
password = str(keyring.get_password("CGCS", "admin"))
if not password:
raise Exception("Local registry password not found.")
print dict(username='admin', password=password)
shell: "{{ script_content }}"
args:
executable: /usr/bin/python
register: local_registry_credentials_output
- set_fact:
local_registry_credentials: "{{ local_registry_credentials_output.stdout }}"
- name: Log in to local registry
docker_login:
registry: "{{ local_registry }}"
username: "{{ local_registry_credentials['username'] }}"
password: "{{ local_registry_credentials['password'] }}"
- name: Download images and push to local registry
script: download_images.py {{ download_images }}
register: download_images_output
- debug:
msg: "{{ download_images_output.stdout_lines }}"
- name: Log out of k8s registry if credentials exist
docker_login:
registry: "{{ k8s_registry['url'] }}"
state: absent
when: k8s_registry.username is defined
- name: Log out of gcr registry if credentials exist
docker_login:
registry: "{{ gcr_registry['url'] }}"
state: absent
when: gcr_registry.username is defined
- name: Log out of quay registry if credentials exist
docker_login:
registry: "{{ quay_registry['url'] }}"
state: absent
when: quay_registry.username is defined
- name: Log out of docker registry if credentials exist
docker_login:
registry: "{{ docker_registry['url'] }}"
state: absent
when: docker_registry.username is defined
- name: Log out of local registry
docker_login:
registry: "{{ local_registry }}"
state: absent
- name: Strip out port from Tiller, Armada, Calico, Multus, Sriov image tags
set_fact:
tiller_img: "{{ tiller_img | regex_replace(':[0-9]+/', '/') }}"
armada_img: "{{ armada_img | regex_replace(':[0-9]+/', '/') }}"
calico_cni_img: "{{ calico_cni_img | regex_replace(':[0-9]+/', '/') }}"
calico_node_img: "{{ calico_node_img | regex_replace(':[0-9]+/', '/') }}"
calico_kube_controllers_img: "{{ calico_kube_controllers_img | regex_replace(':[0-9]+/', '/') }}"
multus_img: "{{ multus_img | regex_replace(':[0-9]+/', '/') }}"
sriov_cni_img: "{{ sriov_cni_img | regex_replace(':[0-9]+/', '/') }}"
sriov_network_device_img: "{{ sriov_network_device_img | regex_replace(':[0-9]+/', '/') }}"
- name: Remove local registry host from /etc/hosts
command: >-
sed -i -e 's|'$CONTROLLER_ADDRESS'\t'$CONTROLLER'\t'$LOCAL_REGISTRY'|'$CONTROLLER_ADDRESS'\t'$CONTROLLER'|g' /etc/hosts
args:
warn: false
environment:
CONTROLLER_ADDRESS: "{{ controller_floating_address }}"
CONTROLLER: "controller"
LOCAL_REGISTRY: "registry.local"

View File

@@ -0,0 +1,24 @@
---
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
# SUB-TASKS DESCRIPTION:
# Get aws ecr credentials
#
- block:
- name: Get the {{ registry.name }} credentials
script: get_registry_auth.py {{ registry.value.url }} {{ registry.value.username }} {{ registry.value.password }}
register: registry_auth_output
- set_fact:
registry_auth: "{{ registry_auth_output.stdout }}"
- set_fact:
"{{ registry.name }}":
url: "{{ registry.value.url }}"
type: "{{ registry.value.type }}"
username: "{{ registry_auth.username }}"
password: "{{ registry_auth.password }}"
when: registry.value.username is defined

View File

@@ -0,0 +1,55 @@
---
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# SUB-TASKS DESCRIPTION:
# Query a registry from Sysinv via Sysinv CLI
- block:
- name: Query the {{ registry.name }}
shell: >-
source /etc/platform/openrc; system service-parameter-list --nowrap |
awk '{if ($6 == "{{ registry.name | regex_replace('_', '-') }}") print $8"="$10;}'
register: running_registry_output
- set_fact:
running_registry:
"{{ running_registry|default({}) | combine({inner_item.split('=')[0]:inner_item.split('=')[1]}, recursive=True) }}"
with_items: "{{ running_registry_output.stdout_lines }}"
loop_control:
loop_var: inner_item
- block:
- name: Validate {{ registry.name }} information if it exists
fail:
msg: "{{ registry.name }}'s url doesn't exist"
when: running_registry['url'] is not defined
- block:
- name: Get the {{ registry.name }} barbican secret if it's authenticated
shell: >-
source /etc/platform/openrc; openstack secret get {{ running_registry['auth-secret'] }} -p -f value
register: registry_credentials
- name: Validate {{ registry.name }} secret
fail:
msg: "Unknown format of the {{ registry.name }} secret"
when: (registry_credentials.stdout is not search('username:') or
registry_credentials.stdout is not search('password:'))
- set_fact:
registry_username: "{{ registry_credentials.stdout.split()[0].split('username:')[1] }}"
registry_password: "{{ registry_credentials.stdout.split()[1].split('password:')[1] }}"
when: registry_credentials.stdout | length > 0
- set_fact:
running_registry:
"{{ running_registry | combine(
{'username': registry_username, 'password': registry_password}, recursive=True) }}"
when: running_registry['auth-secret'] is defined
when: running_registry is defined
- set_fact:
"{{ registry.name }}": "{{ registry.value if running_registry is not defined else running_registry }}"

View File

@@ -0,0 +1,191 @@
---
#
# Copyright (c) 2019 Wind River Systems, Inc.
#
# SPDX-License-Identifier: Apache-2.0
#
# ROLE DESCRIPTION:
# This role is to perform tasks that download container images
# from public/private registries and push to local registry.
#
- name: Get docker registries if upgrade kubernetes or k8s networking
include: get_docker_registry.yml registry={{ item }}
with_items:
- { name: 'k8s_registry', value: { url: 'k8s.gcr.io' } }
- { name: 'gcr_registry', value: { url: 'gcr.io' } }
- { name: 'quay_registry', value: { url: 'quay.io' } }
- { name: 'docker_registry', value: { url: 'docker.io' } }
when: upgrade_k8s_networking is defined or
upgrade_kubernetes is defined
# Disable the log to not expose registry password
- name: Get registry credentials if registry type is AWS ECR
include: get_aws_ecr_credentials.yml registry={{ item }}
with_items:
- { name: "k8s_registry", value: "{{ k8s_registry }}" }
- { name: "gcr_registry", value: "{{ gcr_registry }}" }
- { name: "quay_registry", value: "{{ quay_registry }}" }
- { name: "docker_registry", value: "{{ docker_registry }}" }
when: registry.value.type is defined and
registry.value.type == 'aws-ecr'
no_log: true
- block:
- name: Get kubernetes version from template
command: "sed -n 's|^kubernetesVersion: \\(.*\\)$|\\1|p' {{ kube_admin_yaml_template }}"
args:
warn: false
register: kubernetes_version_output
- set_fact:
kubernetes_version: "{{ kubernetes_version_output.stdout }}"
when: upgrade_kubernetes is not defined
- name: Get the list of kubernetes images
shell: "kubeadm config images list --kubernetes-version {{ kubernetes_version }}
--image-repository {{ k8s_registry.url }} | grep -v etcd"
register: kubernetes_images_output
when: k8s_registry.url is defined and kubernetes_version is defined
- set_fact:
kubernetes_images: "{{ kubernetes_images_output.stdout_lines }}"
- name: Update Tiller, Armada, Calico, Multus, Sriov image tags
set_fact:
tiller_img: "{{ tiller_img | regex_replace('gcr.io', '{{ gcr_registry.url }}') }}"
armada_img: "{{ armada_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
calico_cni_img: "{{ calico_cni_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
calico_node_img: "{{ calico_node_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
calico_kube_controllers_img: "{{ calico_kube_controllers_img | regex_replace('quay.io', '{{ quay_registry.url }}') }}"
multus_img: "{{ multus_img | regex_replace('docker.io', '{{ docker_registry.url }}') }}"
sriov_cni_img: "{{ sriov_cni_img | regex_replace('docker.io', '{{ docker_registry.url }}') }}"
sriov_network_device_img: "{{ sriov_network_device_img | regex_replace('docker.io', '{{ docker_registry.url }}') }}"
- name: Get the list of platform images
set_fact:
networking_images:
- "{{ calico_cni_img }}"
- "{{ calico_node_img }}"
- "{{ calico_kube_controllers_img }}"
- "{{ multus_img }}"
- "{{ sriov_cni_img }}"
- "{{ sriov_network_device_img }}"
tiller_armada_images:
- "{{ tiller_img }}"
- "{{ armada_img }}"
- block:
- name: Update additional image tags if applicable
shell: >-
echo {{ item }} |
sed 's|quay.io|{{ quay_registry.url }}|g' |
sed 's|docker.io|{{ docker_registry.url }}|g' |
sed 's|k8s.gcr.io|{{ k8s_registry.url }}|g' |
sed 's|gcr.io|{{ gcr_registry.url }}|g' |
sed 's|docker.elastic.co|{{ elastic_registry.url }}|g'
with_items: "{{ additional_local_registry_images }}"
register: images
- set_fact:
additional_images: "{{ images.results | map(attribute='stdout') | list }}"
when: additional_local_registry_images is defined and
additional_local_registry_images | length > 0
# Download all system images and additional images if bootstrap
- name: Set download images list
set_fact:
download_images_list:
"{{ (kubernetes_images + networking_images + tiller_armada_images + additional_images)
if additional_images is defined else (kubernetes_images + networking_images + tiller_armada_images) }}"
when: (upgrade_kubernetes is not defined and
upgrade_k8s_networking is not defined)
# Only download k8s networking images if k8s networking upgrade
- name: Set download images list to k8s network images if upgrading k8s networking
set_fact:
download_images_list: "{{ download_images_list|default([]) + networking_images }}"
when: upgrade_k8s_networking is defined and upgrade_k8s_networking
# Only download kubernetes images if kubernetes upgrade
- name: Set download images list to kubernetes images if upgrading kubernetes
set_fact:
download_images_list: "{{ download_images_list|default([]) + kubernetes_images }}"
when: upgrade_kubernetes is defined and upgrade_kubernetes
- set_fact:
download_images: "{{ download_images_list | join(',') }}"
- debug: var=download_images_list
# Disable the log to not expose registry password
- name: Log in k8s, gcr, quay, docker registries if credentials exist
docker_login:
registry: "{{ item['url'] }}"
username: "{{ item['username'] }}"
password: "{{ item['password'] }}"
with_items:
- "{{ k8s_registry }}"
- "{{ gcr_registry }}"
- "{{ quay_registry }}"
- "{{ docker_registry }}"
when: item.username is defined
no_log: true
- name: Get local registry credentials
vars:
script_content: |
import keyring
password = str(keyring.get_password("CGCS", "admin"))
if not password:
raise Exception("Local registry password not found.")
print dict(username='admin', password=password)
shell: "{{ script_content }}"
args:
executable: /usr/bin/python
register: local_registry_credentials_output
- set_fact:
local_registry_credentials: "{{ local_registry_credentials_output.stdout }}"
- name: Log in to local registry
docker_login:
registry: "{{ local_registry }}"
username: "{{ local_registry_credentials['username'] }}"
password: "{{ local_registry_credentials['password'] }}"
- name: Download images and push to local registry
script: download_images.py {{ download_images }}
register: download_images_output
- debug:
msg: "{{ download_images_output.stdout_lines }}"
# Disable the log to not expose registry password
- name: Log out of k8s, gcr, quay, docker registries if credentials exist
docker_login:
registry: "{{ item['url'] }}"
state: absent
with_items:
- "{{ k8s_registry }}"
- "{{ gcr_registry }}"
- "{{ quay_registry }}"
- "{{ docker_registry }}"
when: item.username is defined
no_log: true
- name: Log out of local registry
docker_login:
registry: "{{ local_registry }}"
state: absent
- name: Strip out port from Tiller, Armada, Calico, Multus, Sriov image tags
set_fact:
tiller_img: "{{ tiller_img | regex_replace(':[0-9]+/', '/') }}"
armada_img: "{{ armada_img | regex_replace(':[0-9]+/', '/') }}"
calico_cni_img: "{{ calico_cni_img | regex_replace(':[0-9]+/', '/') }}"
calico_node_img: "{{ calico_node_img | regex_replace(':[0-9]+/', '/') }}"
calico_kube_controllers_img: "{{ calico_kube_controllers_img | regex_replace(':[0-9]+/', '/') }}"
multus_img: "{{ multus_img | regex_replace(':[0-9]+/', '/') }}"
sriov_cni_img: "{{ sriov_cni_img | regex_replace(':[0-9]+/', '/') }}"
sriov_network_device_img: "{{ sriov_network_device_img | regex_replace(':[0-9]+/', '/') }}"

View File

@@ -7,6 +7,9 @@
- hosts: all
vars:
upgrade_k8s_networking: true
tasks:
# TODO(kbujold): This comment from the review will be implemented in a separate submission.
@@ -31,41 +34,22 @@
shell: "grep cluster-host-subnet /tmp/addrpool.txt | awk '{print $14}'"
register: cluster_floating_address
- name: Query the quay-registry
shell: >-
source /etc/platform/openrc; system service-parameter-list --nowrap |
awk '{if ($6 == "quay-registry" && $8 == "url") print $10;}'
register: running_quay_registry
- name: Query the docker-registry
shell: >-
source /etc/platform/openrc; system service-parameter-list --nowrap |
awk '{if ($6 == "docker-registry" && $8 == "url") print $10;}'
register: running_docker_registry
- name: Set default registries
set_fact:
default_quay_registry:
url: "quay.io"
default_docker_registry:
url: "docker.io"
- name: Set networking and registry facts
- name: Set networking facts
set_fact:
kubelet_cni_bin_dir: "/usr/libexec/cni"
cluster_pod_subnet: "{{ cluster_pod_subnet.stdout }}"
cluster_network_ipv4: "{{ cluster_pod_subnet.stdout | ipv4 }}"
cluster_network_ipv6: "{{ cluster_pod_subnet.stdout | ipv6 }}"
cluster_floating_address: "{{ cluster_floating_address.stdout }}"
quay_registry:
url:
"{{ running_quay_registry.stdout if (running_quay_registry.stdout|length > 0)
else default_quay_registry.url}}"
docker_registry:
url:
"{{ running_docker_registry.stdout if (running_docker_registry.stdout|length > 0)
else default_docker_registry.url}}"
- name: Set images facts
include_vars:
dir: "roles/bootstrap/bringup-essential-services/vars"
files_matching: main.yml
- name: Upgrade k8s networking images
import_role:
name: common/push-docker-images
- name: Create Calico config file
template: