Terraform resources for a Kubernetes lab
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

247 lines
5.8 KiB

#!/bin/bash
set -Eeuo pipefail
trap "exit" INT
function assert_cluster_name () {
local cluster_name="${1:-}"
if [ ! -d ".clusters/$cluster_name" ]; then
echo "Cluster '$cluster_name' does not exist!"
exit 1
fi
if [ -f ".clusters/$cluster_name/local.env" ]; then
source ".clusters/$cluster_name/local.env"
fi
}
function init () {
local cluster_name="${1:-}"
if [ -d ".clusters/$cluster_name" ]; then
echo "Cluster '$cluster_name' already initialized !"
exit 1
fi
mkdir -p ".clusters/$cluster_name"
sed "s/__CLUSTER_NAME__/$cluster_name/" terraform.tfvars > ".clusters/$cluster_name/terraform.tfvars"
cp kubespray.yaml ".clusters/$cluster_name/kubespray.yaml"
ln -sf ../../ansible/kubespray/inventory/sample/group_vars/ ".clusters/$cluster_name/group_vars"
echo "Cluster $cluster_name initialized successfully!"
echo
echo "Review and adjust the following files to your needs:"
echo "- .clusters/$cluster_name/terraform.tfvars"
echo "- .clusters/$cluster_name/kubespray.yaml"
echo
exit 0
}
function destroy () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
terraform destroy -var-file=".clusters/$cluster_name/terraform.tfvars" -state=".clusters/$cluster_name/terraform.tfstate"
}
function apply () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
# Provision the infrastructure and wait for bootstrap to complete
terraform apply -var-file=".clusters/$cluster_name/terraform.tfvars" -state=".clusters/$cluster_name/terraform.tfstate" -auto-approve
}
function start () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
ansible-playbook -i ".clusters/$cluster_name/inventory.yaml" ansible/start.yaml
}
function stop () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
ansible-playbook -i ".clusters/$cluster_name/inventory.yaml" ansible/stop.yaml
}
function post_install_nfs () {
local cluster_name="${1:-}"
kubectl apply --insecure-skip-tls-verify -f ".clusters/$cluster_name/nfs-provisioner.yaml"
}
function post_install () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
shift
if [ $# -eq 0 ]; then
set nfs
fi
export KUBECONFIG="$PWD/.clusters/$cluster_name/kube.config"
for i; do
post_install_$i "$cluster_name"
done
}
function ensure_kubespray_venv_ready () {
if [ ! -d "ansible/ansible-venv" ]; then
python -m venv ansible/ansible-venv
ansible-venv/bin/pip install -r ansible/kubespray/requirements.txt
ansible-venv/bin/pip install selinux
fi
}
function kubespray_install () {
local cluster_name="${1:-}"
ensure_kubespray_venv_ready
ansible/ansible-venv/bin/ansible-playbook -i ."clusters/$cluster_name/inventory.yaml" ansible/kubespray/cluster.yml -e "@.clusters/$cluster_name/kubespray.yaml"
ln -sf artifacts/admin.conf ".clusters/$cluster_name/kube.config"
}
function kubespray_remove () {
local cluster_name="${1:-}"
ensure_kubespray_venv_ready
ansible/ansible-venv/bin/ansible-playbook -i ."clusters/$cluster_name/inventory.yaml" ansible/kubespray/reset.yml -e "@.clusters/$cluster_name/kubespray.yaml"
rm -f ".clusters/$cluster_name/kube.config"
}
function kubespray () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
shift
if [ $# -eq 0 ]; then
set install
fi
kubespray_$1 "$cluster_name"
}
function install_addon () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
local addon="${2:-}"
install_addon_$addon "$cluster_name"
}
function shell () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
# Ansible
export DEFAULT_HOST_LIST="$PWD/.clusters/$cluster_name/inventory.yaml"
# Terraform
export TF_CLI_ARGS_plan="-var-file=.clusters/$cluster_name/terraform.tfvars -state=.clusters/$cluster_name/terraform.tfstate"
export TF_CLI_ARGS_apply="-var-file=.clusters/$cluster_name/terraform.tfvars -state=.clusters/$cluster_name/terraform.tfstate"
export TF_CLI_ARGS_destroy="-var-file=.clusters/$cluster_name/terraform.tfvars -state=.clusters/$cluster_name/terraform.tfstate"
export TF_CLI_ARGS_state_list="-state=.clusters/$cluster_name/terraform.tfstate"
export TF_CLI_ARGS_state_rm="-state=.clusters/$cluster_name/terraform.tfstate"
# Kubernetes
export KUBECONFIG="$PWD/.clusters/$cluster_name/kube.config"
export KUBECTL_BINARY="$(which kubectl)"
export CLUSTER_NAME="$cluster_name"
export PS1="[$CLUSTER_NAME:\w] "
function kubectl () {
"$KUBECTL_BINARY" --insecure-skip-tls-verify "$@"
}
export -f kubectl
exec /bin/bash
}
if [ ! -e "local.env" ]; then
echo "Please create local.env first!"
exit 1
fi
source local.env
export LC_ALL=C
export LANG=C
case "${1:-}" in
init)
if [ -z "${2:-}" ]; then
echo "Usage: $0 init cluster-name"
exit 1
fi
shift
init "$@"
;;
start)
if [ -z "${2:-}" ]; then
echo "Usage: $0 start cluster-name"
exit 1
fi
shift
start "$@"
;;
stop)
if [ -z "${2:-}" ]; then
echo "Usage: $0 stop cluster-name"
exit 1
fi
shift
stop "$@"
;;
apply)
if [ -z "${2:-}" ]; then
echo "Usage: $0 apply cluster-name"
exit 1
fi
shift
apply "$@"
;;
kubespray)
if [ -z "${2:-}" ]; then
echo "Usage: $0 kubespray cluster-name {install|remove}"
exit 1
fi
shift
kubespray "$@"
;;
destroy)
if [ -z "${2:-}" ]; then
echo "Usage: $0 destroy cluster-name"
exit 1
fi
shift
destroy "$@"
;;
shell)
if [ -z "${2:-}" ]; then
echo "Usage: $0 shell cluster-name"
exit 1
fi
shift
shell "$@"
;;
post-install)
if [ -z "${2:-}" ]; then
echo "Usage: $0 post-install cluster-name"
exit 1
fi
shift
post_install "$@"
;;
install-addon)
if [ -z "${2:-}" -o -z "${3:-}" ]; then
echo "Usage: $0 install-addon cluster-name addon-name"
exit 1
fi
shift
install_addon "$@"
;;
*)
echo "Usage: $0 {init|apply|approve-csr|post-install|destroy|shell|ping|start|stop} cluster-name"
exit 1
;;
esac