#!/usr/bin/env bash
# vim:ts=4:sts=4:sw=4:et
# args: 'echo -n "kubectl namespace: "; kubectl config get-contexts | awk "/^\*/{print \$5\" \"\$3}"; echo "var \{namespace\}: {namespace}"'
#
# Author: Hari Sekhon
# Date: 2020-09-08 19:20:40 +0100 (Tue, 08 Sep 2020)
#
# https://github.com/HariSekhon/bash-tools
#
# License: see accompanying Hari Sekhon LICENSE file
#
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
#
# https://www.linkedin.com/in/HariSekhon
#
set -euo pipefail
[ -n " ${ DEBUG :- } " ] && set -x
srcdir = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
# shellcheck disable=SC1090
. " $srcdir /lib/utils.sh "
# shellcheck disable=SC2034,SC2154
usage_description = "
Run a command against each Kubernetes namespace on the current cluster / kubectl context
Can chain with kubernetes_foreach_context.sh
This is powerful so use carefully!
Requires 'kubectl' to be configured and available in \$ PATH
All arguments become the command template
Replaces { namespace} if present in the command template with the namespace in each iteration, but often this isn't necessary to specify explicitly given the kubectl context' s namespace is set within each iteration for convenience running short commands local to the namespace
eg.
${ 0 ##*/ } gcp_secrets_to_kubernetes.sh
"
# used by usage() in lib/utils.sh
# shellcheck disable=SC2034
usage_args = "<command> <args>"
help_usage " $@ "
min_args 1 " $@ "
cmd_template = " $* "
# XXX: critical to protect current environment from imperative kubectl concurrency race conditions because changes the current namespace - so isolate to only this script's environment
kubeconfig = " /tmp/.kube/config. ${ EUID :- $UID } . $$ "
mkdir -pv " $( dirname " $kubeconfig " ) "
cp -f " ${ KUBECONFIG :- $HOME /.kube/config } " " $kubeconfig "
export KUBECONFIG = " $kubeconfig "
current_context = " $( kubectl config current-context) "
# there is no -o jsonpath/namespace so must just get column
# don't need to store this any more as we now switch the KUBECONFIG which is only used for the lifetime of this script
#original_namespace="$(kubectl config get-contexts "$current_context" --no-headers | awk '{print $5}')"
set_namespace( ) {
local namespace = " $1 "
kubectl config set-context " $current_context " --namespace " $namespace "
}
while read -r namespace; do
#if [[ "$context" =~ kube-system ]]; then
# echo "Skipping context '$context'..."
# echo
# continue
#fi
echo "# ============================================================================ #" >& 2
echo " # Kubernetes namespace = $namespace , content = $current_context " >& 2
echo "# ============================================================================ #" >& 2
# shellcheck disable=SC2064 # want interpolation now
# XXX: no longer reset because we isolate the environment above via redirecting KUBECONFIG and simply let it expire at the end of this script
#trap "echo; echo 'Reverting context to original namespace: $original_namespace' ; set_namespace '$original_namespace'" EXIT
set_namespace " $namespace "
cmd = " ${ cmd_template // \{ namespace \} / $namespace } "
eval " $cmd "
echo
#done < <(kubectl get namespaces -o name | sed 's,namespace/,,')
done < <( kubectl get namespaces -o 'jsonpath={range .items[*]}{.metadata.name}{"\n"}' )