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.
 
 
 

200 lines
4.5 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"
echo "Cluster $cluster_name initialized successfully!"
echo
echo "Review and adjust the following files to your needs:"
echo "- .clusters/$cluster_name/terraform.tfvars"
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" ansible/start.yaml
}
function stop () {
assert_cluster_name "$@"
local cluster_name="${1:-}"
ansible-playbook -i ".clusters/$cluster_name/inventory" ansible/stop.yaml
}
function post_install_nfs () {
local cluster_name="${1:-}"
kubectl apply --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" -f ".clusters/$cluster_name/registry-pv.yaml"
kubectl apply --insecure-skip-tls-verify --kubeconfig=".clusters/$cluster_name/auth/kubeconfig" -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
for i; do
post_install_$i "$cluster_name"
done
}
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"
# 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/auth/kubeconfig"
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 "$@"
;;
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