#!/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