mirror of
https://github.com/dredx/prole.git
synced 2026-09-23 10:13:58 +00:00
76 lines
2.6 KiB
Bash
76 lines
2.6 KiB
Bash
#!/usr/bin/env bash
|
|
# Refresh the local kubeconfig entry for knoe-k3s using the live kubeconfig
|
|
# from myrddin.knoe.org. The CA bundle on the server is malformed, so we
|
|
# deliberately disable TLS verification while keeping client cert auth.
|
|
|
|
# If invoked via `sh`, re-exec with bash to enable arrays and pipefail.
|
|
if [ -z "${BASH_VERSION:-}" ]; then
|
|
exec bash "$0" "$@"
|
|
fi
|
|
|
|
set -euo pipefail
|
|
|
|
SERVER=${K3S_SERVER:-"https://myrddin.prole.org:6443"}
|
|
REMOTE_HOST=${K3S_REMOTE_HOST:-"myrddin.prole.org"}
|
|
REMOTE_USER=${K3S_REMOTE_USER:-"ansible"}
|
|
SSH_KEY=${K3S_SSH_KEY:-"$HOME/.ssh/id_ed25519_ansible"}
|
|
REMOTE_KUBECONFIG=${K3S_REMOTE_KUBECONFIG:-"/etc/rancher/k3s/k3s.yaml"}
|
|
|
|
CLUSTER="knoe-k3s"
|
|
USER="knoe-k3s"
|
|
CONTEXT="knoe-k3s"
|
|
|
|
echo "Configuring ${CONTEXT} from ${REMOTE_HOST}..."
|
|
|
|
if ! command -v kubectl >/dev/null 2>&1; then
|
|
echo "[error] kubectl not found in PATH" >&2
|
|
exit 1
|
|
fi
|
|
|
|
TMP_REMOTE=$(mktemp)
|
|
TMP_CERT=$(mktemp)
|
|
TMP_KEY=$(mktemp)
|
|
|
|
# Fetch kubeconfig from the control-plane node (requires ssh access).
|
|
if ! ssh -i "${SSH_KEY}" "${REMOTE_USER}@${REMOTE_HOST}" sudo cat "${REMOTE_KUBECONFIG}" >"${TMP_REMOTE}"; then
|
|
echo "[error] unable to fetch kubeconfig from ${REMOTE_HOST}" >&2
|
|
rm -f "${TMP_REMOTE}" "${TMP_CERT}" "${TMP_KEY}"
|
|
exit 1
|
|
fi
|
|
|
|
# Extract client cert/key data from the remote kubeconfig into temp files.
|
|
python - "$TMP_REMOTE" "$TMP_CERT" "$TMP_KEY" <<'PY'
|
|
import sys, base64, yaml
|
|
src, cert_path, key_path = sys.argv[1:]
|
|
cfg = yaml.safe_load(open(src))
|
|
user = cfg['users'][0]['user']
|
|
base64.b64decode(user['client-certificate-data'], validate=True, altchars=None)
|
|
base64.b64decode(user['client-key-data'], validate=True, altchars=None)
|
|
open(cert_path, 'wb').write(base64.b64decode(user['client-certificate-data']))
|
|
open(key_path, 'wb').write(base64.b64decode(user['client-key-data']))
|
|
PY
|
|
|
|
# Configure cluster entry (skip CA because the server CA is malformed).
|
|
kubectl config set-cluster "${CLUSTER}" \
|
|
--server="${SERVER}" \
|
|
--insecure-skip-tls-verify=true >/dev/null
|
|
kubectl config unset "clusters.${CLUSTER}.certificate-authority" >/dev/null 2>&1 || true
|
|
kubectl config unset "clusters.${CLUSTER}.certificate-authority-data" >/dev/null 2>&1 || true
|
|
|
|
kubectl config set-credentials "${USER}" \
|
|
--client-certificate="${TMP_CERT}" \
|
|
--client-key="${TMP_KEY}" \
|
|
--embed-certs=true >/dev/null
|
|
|
|
kubectl config set-context "${CONTEXT}" \
|
|
--cluster="${CLUSTER}" \
|
|
--user="${USER}" \
|
|
--namespace=default >/dev/null
|
|
|
|
kubectl config use-context "${CONTEXT}" >/dev/null
|
|
|
|
rm -f "${TMP_REMOTE}" "${TMP_CERT}" "${TMP_KEY}"
|
|
|
|
echo "Done. Context ${CONTEXT} is ready."
|
|
kubectl --context "${CONTEXT}" auth whoami
|