#!/usr/bin/env bash ########################################################### #./kube-provisioning.sh dev cicd-user kubeconfig-dev.yaml #arg1 = namespace #arg2 = env (dev|qa|prod) ########################################################### set -euo pipefail ############################################ # CONFIG ############################################ NAMESPACE=${1:-dev}-$2 SERVICE_ACCOUNT="deployer" KUBECONFIG_FILE=${NAMESPACE}.yaml echo "Namespace: $NAMESPACE" echo "ServiceAccount: $SERVICE_ACCOUNT" echo "Output kubeconfig: $KUBECONFIG_FILE" ############################################ # CHECK REQUIREMENTS ############################################ if ! command -v kubectl >/dev/null 2>&1; then echo "kubectl not found" exit 1 fi ############################################ # CREATE NAMESPACE ############################################ kubectl get ns "$NAMESPACE" >/dev/null 2>&1 || kubectl create namespace "$NAMESPACE" ############################################ # CREATE SERVICE ACCOUNT ############################################ kubectl -n "$NAMESPACE" get sa "$SERVICE_ACCOUNT" >/dev/null 2>&1 || \ kubectl -n "$NAMESPACE" create serviceaccount "$SERVICE_ACCOUNT" ############################################ # CREATE ROLE ############################################ cat </dev/null 2>&1 || \ kubectl create rolebinding namespace-deployer-binding \ --role=namespace-deployer \ --serviceaccount=${NAMESPACE}:${SERVICE_ACCOUNT} \ -n "$NAMESPACE" ############################################ # GENERATE TOKEN ############################################ TOKEN=$(kubectl create token "$SERVICE_ACCOUNT" -n "$NAMESPACE") ############################################ # CLUSTER INFO ############################################ CLUSTER_NAME=$(kubectl config view --minify -o jsonpath='{.clusters[0].name}') CLUSTER_SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}') CLUSTER_CA=$(kubectl config view --raw --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}') ############################################ # GENERATE KUBECONFIG ############################################ cat < "$KUBECONFIG_FILE" apiVersion: v1 kind: Config clusters: - cluster: certificate-authority-data: ${CLUSTER_CA} server: ${CLUSTER_SERVER} name: ${CLUSTER_NAME} contexts: - context: cluster: ${CLUSTER_NAME} namespace: ${NAMESPACE} user: ${SERVICE_ACCOUNT} name: ${SERVICE_ACCOUNT}-${CLUSTER_NAME} current-context: ${SERVICE_ACCOUNT}-${CLUSTER_NAME} users: - name: ${SERVICE_ACCOUNT} user: token: ${TOKEN} EOF echo echo "Kubeconfig generated:" echo "$KUBECONFIG_FILE" echo echo "Test command:" echo "kubectl --kubeconfig=$KUBECONFIG_FILE get pods"