blob: 66328fcc34e1ed52e83ab741216fb19e745f8df9 [file] [log] [blame]
Luca Pretec97ad882018-05-04 11:22:14 -07001#!/usr/bin/env bash
2#
3# Copyright 2017-present Open Networking Foundation
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
Luca Pretec97ad882018-05-04 11:22:14 -070017#
18# Installs Kubespray on remote target machines.
19#
Zack Williams11b2e5c2018-05-18 09:50:54 -070020
Zack Williamsd24053d2018-07-31 09:12:35 -070021set -e -o pipefail
Zack Williams11b2e5c2018-05-18 09:50:54 -070022
Zack Williamsfab10452019-08-15 15:50:29 -070023KS_COMMIT="${KS_COMMIT:-v2.10.4}"
Zack Williamsbb846a22018-06-26 14:57:17 -070024
Luca Pretec97ad882018-05-04 11:22:14 -070025install_kubespray () {
26 # Cleanup Old Kubespray Installations
Zack Williams249ac7f2018-05-18 13:34:14 -070027 echo "Cleaning Up Old Kubespray Installation"
Luca Pretec97ad882018-05-04 11:22:14 -070028 rm -rf kubespray
29
30 # Download Kubespray
Zack Williams249ac7f2018-05-18 13:34:14 -070031 echo "Downloading Kubespray"
Zack Williamsbb846a22018-06-26 14:57:17 -070032 git clone https://github.com/kubernetes-incubator/kubespray.git
33 pushd kubespray
34 git checkout "$KS_COMMIT"
35 popd
Luca Pretec97ad882018-05-04 11:22:14 -070036
Zack Williamsd24053d2018-07-31 09:12:35 -070037 # create a virtualenv with specific packages, if it doesn't exist
38 if [ ! -x "ks_venv/bin/activate" ]
39 then
Wei-Yu Chendb5386b2019-04-11 18:05:32 -070040 virtualenv ks_venv --python=python3
Zack Williams92196ac2018-09-26 15:02:40 -070041 # shellcheck disable=SC1091
42 source ks_venv/bin/activate
43
Zack Williamsfab10452019-08-15 15:50:29 -070044 pip3 install ansible~=2.7.12 # update to newest 2.7.x version of ansible
Wei-Yu Chendb5386b2019-04-11 18:05:32 -070045 pip3 install -r kubespray/requirements.txt
Zack Williams92196ac2018-09-26 15:02:40 -070046 else
47 # shellcheck disable=SC1091
48 source ks_venv/bin/activate
Zack Williamsd24053d2018-07-31 09:12:35 -070049 fi
50
Zack Williamsd24053d2018-07-31 09:12:35 -070051
Luca Pretec97ad882018-05-04 11:22:14 -070052 # Generate inventory and var files
Zack Williams249ac7f2018-05-18 13:34:14 -070053 echo "Generating The Inventory File"
Zack Williamsbb846a22018-06-26 14:57:17 -070054
Zack Williams249ac7f2018-05-18 13:34:14 -070055 rm -rf "inventories/${DEPLOYMENT_NAME}"
Zack Williamsbb846a22018-06-26 14:57:17 -070056 mkdir -p "inventories/${DEPLOYMENT_NAME}"
57
58 cp -r kubespray/inventory/sample/group_vars "inventories/${DEPLOYMENT_NAME}/group_vars"
Wei-Yu Chendb5386b2019-04-11 18:05:32 -070059 CONFIG_FILE="inventories/${DEPLOYMENT_NAME}/inventory.yml" python3 kubespray/contrib/inventory_builder/inventory.py "${NODES[@]}"
Luca Pretec97ad882018-05-04 11:22:14 -070060
Zack Williams249ac7f2018-05-18 13:34:14 -070061 # Add configuration to inventory
62 ansible-playbook k8s-configs.yaml --extra-vars "deployment_name=${DEPLOYMENT_NAME} k8s_nodes='${NODES[*]}' kubespray_remote_ssh_user='${REMOTE_SSH_USER}'"
Luca Pretec97ad882018-05-04 11:22:14 -070063
64 # Prepare Target Machines
Zack Williams249ac7f2018-05-18 13:34:14 -070065 echo "Installing Prerequisites On Remote Machines"
Wei-Yu Chendb5386b2019-04-11 18:05:32 -070066 ansible-playbook -i "inventories/${DEPLOYMENT_NAME}/inventory.yml" k8s-requirements.yaml
Luca Pretec97ad882018-05-04 11:22:14 -070067
68 # Install Kubespray
Zack Williams249ac7f2018-05-18 13:34:14 -070069 echo "Installing Kubespray"
Wei-Yu Chendb5386b2019-04-11 18:05:32 -070070 ansible-playbook -i "inventories/${DEPLOYMENT_NAME}/inventory.yml" kubespray/cluster.yml -b -v
Luca Pretec97ad882018-05-04 11:22:14 -070071}
72
73#
74# Exports the Kubespray Config Location
75#
76source_kubeconfig () {
Zack Williamsbb846a22018-06-26 14:57:17 -070077
78 kubeconfig_path="${PWD}/inventories/${DEPLOYMENT_NAME}/artifacts/admin.conf"
79
80 if [ -f "$kubeconfig_path" ]
81 then
82 # these options are annoying outside of scripts
83 set +e +u +o pipefail
84
85 echo "setting KUBECONFIG=$kubeconfig_path"
86
87 export KUBECONFIG="$kubeconfig_path"
88 else
89 echo "kubernetes admin.conf not found at: '$kubeconfig_path'"
90 exit 1
91 fi
Luca Pretec97ad882018-05-04 11:22:14 -070092}
93
94#
Luca Pretec97ad882018-05-04 11:22:14 -070095# Checks if an arbitrary pod name is given during specifc
96# operations.
97#
98check_pod_name () {
Zack Williams11b2e5c2018-05-18 09:50:54 -070099 if [ -z "$DEPLOYMENT_NAME" ]
Luca Pretec97ad882018-05-04 11:22:14 -0700100 then
101 echo "Missing option: podname" >&2
102 echo " "
103 display_help
Zack Williamsf0b8e942019-07-23 16:21:28 -0700104 exit 1
Luca Pretec97ad882018-05-04 11:22:14 -0700105 fi
106}
107
108#
109# Displays the help menu.
110#
111display_help () {
112 echo "Usage: $0 {--install|--source|--help} [podname] [ip...] " >&2
113 echo " "
114 echo " -h, --help Display this help message."
115 echo " -i, --install Install Kubespray on <podname>"
116 echo " -s, --source Source the Kubectl config for <podname>"
117 echo " "
118 echo " podname An arbitrary name representing the pod"
Kailash Khalasi236b0f62018-06-27 08:50:39 -0700119 echo " ip The IP address of the remote node(s)"
Luca Pretec97ad882018-05-04 11:22:14 -0700120 echo " "
121 echo "Example usages:"
122 echo " ./setup.sh -i podname 192.168.10.100 192.168.10.101 192.168.10.102"
Zack Williams249ac7f2018-05-18 13:34:14 -0700123 echo " ./setup.sh -i podname (default is 10.90.0.101 10.90.0.102 10.90.0.103)"
Luca Pretec97ad882018-05-04 11:22:14 -0700124 echo " source setup.sh -s podname"
125}
126
127#
128# Init
129#
Kailash Khalasic09de4b2018-06-13 13:56:18 -0700130if [ $# -lt 2 ]
131then
132 display_help
133 exit 0
134fi
135
Luca Pretec97ad882018-05-04 11:22:14 -0700136CLI_OPT=$1
137DEPLOYMENT_NAME=$2
138shift 2
Zack Williams249ac7f2018-05-18 13:34:14 -0700139DEFAULT_NODES=(10.90.0.101 10.90.0.102 10.90.0.103)
140NODES=("${@:-${DEFAULT_NODES[@]}}")
141
142REMOTE_SSH_USER="${REMOTE_SSH_USER:-cord}"
Luca Pretec97ad882018-05-04 11:22:14 -0700143
144while :
145do
146 case $CLI_OPT in
147 -i | --install)
148 check_pod_name
Zack Williams249ac7f2018-05-18 13:34:14 -0700149 install_kubespray
Luca Pretec97ad882018-05-04 11:22:14 -0700150 exit 0
151 ;;
152 -h | --help)
153 display_help
154 exit 0
155 ;;
156 -s | --source)
157 check_pod_name
Zack Williams249ac7f2018-05-18 13:34:14 -0700158 source_kubeconfig
Zack Williamsbb846a22018-06-26 14:57:17 -0700159 break
160 ;;
Luca Pretec97ad882018-05-04 11:22:14 -0700161 --) # End of all options
162 shift
163 break
164 ;;
165 *)
Zack Williams11b2e5c2018-05-18 09:50:54 -0700166 echo Error: Unknown option: "$CLI_OPT" >&2
Luca Pretec97ad882018-05-04 11:22:14 -0700167 echo " "
168 display_help
Zack Williamsf0b8e942019-07-23 16:21:28 -0700169 exit 1
Luca Pretec97ad882018-05-04 11:22:14 -0700170 ;;
171 esac
172done