anthos-bm-edge-deployment/roles/abm-install/tasks/main.yaml (230 lines of code) (raw):
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
## Check to make sure all hosts are active
- name: Pre ABM Install--Fail if number of available hosts != in-play count
fail:
msg: "Failure caused by expected {{ ansible_play_hosts_all|length }} hosts but have {{ ansible_play_hosts|length }}. Check failures above to see what issue happened."
when: (ansible_play_hosts_all|length) != (ansible_play_hosts|length)
tags:
- verify
# tasks file for abm-install
### gcloud auth to target-machine-gsa done in google-tools
### Create or enable Google Service Accounts
- name: Create or Enable Service Accounts
shell: |
SA_NAME="{{ item.name }}"
PROJECT="{{ google_project_id }}"
DESCRIPTION="{{ item.description }}"
CURR_SA_NAME=$(gcloud iam service-accounts describe ${SA_NAME}@${PROJECT}.iam.gserviceaccount.com --format="value(name)" 2> /dev/null)
if [ -z "$CURR_SA_NAME" ]; then
gcloud iam service-accounts create ${SA_NAME} --display-name "${DESCRIPTION}"
else
gcloud iam service-accounts enable "${SA_NAME}@${PROJECT}.iam.gserviceaccount.com"
fi
loop: "{{ service_accounts }}"
run_once: true # only one machine to do this
args:
executable: /bin/bash
creates: /var/nothing
environment:
PATH: "{{ tools_base_path }}/google-cloud-sdk/bin:{{ ansible_env.PATH }}"
tags:
- abm-install
- abm-once
- name: Add roles to service accounts
command:
cmd: gcloud projects add-iam-policy-binding {{ google_project_id }} --member="serviceAccount:{{ item.0.name }}@{{ google_project_id }}.iam.gserviceaccount.com" --role="{{ item.1 }}"
loop: "{{ service_accounts | subelements('roles') }}"
run_once: true
environment:
PATH: "{{ tools_base_path }}/google-cloud-sdk/bin:{{ ansible_env.PATH }}"
tags:
- abm-install
- abm-once
### Check if the GSA keys exists in Secrets Manager
- name: "Look to see if GSA keys exists in secrets manager"
run_once: true # only one machine to do this
shell: |
export HAS_SECRET=$(gcloud secrets list --filter="name~{{ item.name }}" --format="value(name)" --project="{{ google_project_id }}")
if [ -z "$HAS_SECRET" ]; then
gcloud secrets create {{ item.name }} --replication-policy="automatic" --project={{ google_project_id }}
echo "NO SECRET {{ item.name }}"
exit 1 # exit early, no chance there's a version since there wasn't a secret
fi
gcloud secrets versions access latest --secret="{{ item.name }}" --project="{{ google_project_id }}" &>/dev/null
if [ $? -gt 0 ]; then
echo "NO SECRET {{ item.name }}"
exit 1
fi
args:
executable: /bin/bash
register: secret_exists
changed_when: "'NO SECRET' in secret_exists.stdout"
ignore_errors: true
loop: "{{ service_accounts }}"
environment:
PATH: "{{ tools_base_path }}/google-cloud-sdk/bin:{{ ansible_env.PATH }}"
tags:
- abm-once
- abm-debug
- abm-gsa-keys
- abm-install
- name: Create new GSA keys for all service accounts in configuration and push to Secret Manager
run_once: true # only one machine to do this
shell: |
gcloud iam service-accounts keys create /tmp/{{ entry.item.keyfile }} --iam-account={{ entry.item.name }}@{{ google_project_id }}.iam.gserviceaccount.com --project={{ google_project_id }}
gcloud secrets versions add {{ entry.item.name }} --data-file="/tmp/{{ entry.item.keyfile }}"
rm -rf /tmp/{{ entry.item.keyfile }} # delete temp file
args:
executable: /bin/bash
when: entry.rc != 0
loop: "{{ secret_exists.results }}"
loop_control:
loop_var: entry
environment:
PATH: "{{ tools_base_path }}/google-cloud-sdk/bin:{{ ansible_env.PATH }}"
tags:
- abm-once
- abm-debug
- abm-gsa-keys
- abm-install
- name: Write GSA key files from secret manager
shell: |
gcloud secrets versions access latest --secret="{{ item.name }}" >> {{ remote_gsa_key }}/{{ item.keyfile }}
args:
executable: /bin/bash
creates: "{{ remote_gsa_key }}/{{ item.keyfile }}"
loop: "{{ service_accounts }}"
environment:
PATH: "{{ tools_base_path }}/google-cloud-sdk/bin:{{ ansible_env.PATH }}"
tags:
- abm-once
- abm-debug
- abm-gsa-keys
- abm-install
### Create or ensure root folder exists for storage provider
- name: Create the storage provider folder(s)
ansible.builtin.file:
path: "{{ item }}"
state: directory
mode: '0755'
loop: "{{ storage_provider_roots }}"
tags:
- abm-install
- abm-config
- storage-setup
### Create Local PVC folder (future will be mounted or something)
- name: Create PVC Folder
file:
path: '{{ local_pvc_mount }}'
state: directory
mode: '0755'
tags:
- abm-install
- abm-config
- storage-setup
### Create install folder
- name: Create isolated install folder
file:
path: '{{ abm_workspace_folder }}/{{ cluster_name }}'
state: directory
mode: '0755'
tags:
- abm-install
- abm-config
- build-config
### Create cluster configuration file
- name: "Place configuration file into ABM install folder"
template:
src: cluster-config.yaml.j2
dest: "{{ abm_workspace_folder }}/{{ cluster_name }}/{{ cluster_name }}.yaml"
when: "(primary_cluster_machine is defined) and (primary_cluster_machine == true)"
tags:
- abm-install
- abm-config
- build-config
### Check if cluster is installed already (kubeconfig file would exist)
- name: Check to see if ABM has been installed already
stat:
path: "{{ abm_install_folder }}/bmctl-workspace/{{ cluster_name }}/{{ cluster_name }}-kubeconfig"
register: abm_installed
when: "(primary_cluster_machine is defined) and (primary_cluster_machine == true)"
tags:
- abm-install
- abm-create
- build-config
### For caution, re-run setup of VXLAN
- name: Run startup for vxlan
command:
cmd: "/var/setup-vxlan.sh"
when:
- is_cloud_resource is defined
- is_cloud_resource == True
tags:
- network-vxlan
- abm-install
- abm-config
### Run VXLAN is up script (only for cloud resources)
- name: Run script for vxlan status
command:
cmd: "/var/vxlan-status-check.sh"
when:
- is_cloud_resource is defined
- is_cloud_resource == True
tags:
- network-vxlan
- abm-install
- abm-config
### Check cluster configuration
- name: Validate configuration file updates
command:
cmd: bmctl check config --cluster={{ cluster_name }}
args:
chdir: "{{ abm_install_folder }}"
environment:
GOOGLE_APPLICATION_CREDENTIALS: "/var/keys/gsa-key.json"
when:
- primary_cluster_machine is defined
- abm_installed.stat.exists == False
- primary_cluster_machine == True
tags:
- abm-install
- abm-config
- build-config
### Create cluster configuration
- name: "Create cluster {{ cluster_name }} -- (be patient, this takes 20-40 minutes)"
command: bmctl create cluster --cluster={{ cluster_name }} --quiet --v 0
when:
- primary_cluster_machine is defined
- abm_installed.stat.exists == False
- primary_cluster_machine == True
args:
chdir: "{{ abm_install_folder }}"
creates: "{{ abm_install_folder }}/bmctl-workspace/{{ cluster_name }}/{{ cluster_name }}-kubeconfig"
async: 7200 # run for up to 60 minutes
#poll: 30 # poll status every 30 seconds
environment:
GOOGLE_APPLICATION_CREDENTIALS: "/var/keys/gsa-key.json"
tags:
- abm-install
- abm-create
- name: Re-gather facts
setup:
when: ansible_facts == {}
tags:
- abm-check-membership
- name: Make sure the GKE Hub membership exists
run_once: true
command:
cmd: gcloud container hub memberships describe {{ cluster_name }} --format="value(name)" --project {{ google_project_id }}
environment:
PATH: "{{ tools_base_path }}/google-cloud-sdk/bin:{{ ansible_env.PATH }}"
GOOGLE_APPLICATION_CREDENTIALS: "/var/keys/gsa-key.json"
tags:
- abm-install
- abm-verify-install
- abm-check-membership
#### Post Install Activities
- name: Create PVC Folder
file:
path: '{{ kubeconfig_shared_root }}'
state: directory
mode: '0755'
tags:
- abm-install
- abm-post-install
### Setup kubeconfig for all clusters
- name: "Share kubeconfig with others in cluster"
include: share-kubeconfig.yaml
tags:
- abm-post-install
- abm-install
- kubeconfig-share
- name: "Setup profile.d for kubeconfig"
template:
src: profile-user.sh.j2
dest: "/etc/profile.d/kubeconfig.sh"
tags:
- abm-install
- abm-post-install