Bash函数获取和解码kubernetes秘密



我正在尝试编写一个bash函数,以便在一个简短的命令中获取和解码kubernetes秘密的数据。我的想法是把kgsecd -n <namespace> <secret-name> <secret-data>映射到kubectl get secret -n <namespace> <secret-name> -o "jsonpath={.data.<secret-data>}" | base64 -d。我已经将其编码如下:

kgsecd() {
secretData="${@: -1}"
kubectlParams=(${@:1:-1})
echo "kubectl get secret ${kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d"
kubectl get secret "${kubectlParams}" -o "jsonpath={.data.$secretData}" | base64 -d;
}

然而,我正在努力使它工作,因为当我调用它时,它在终端中不显示任何输出(除了echo句子),但是如果我复制&粘贴并执行echo句子的输出,它就会像预期的那样工作。让我用一个例子来说明我的意思:

$> kgsecd -n my-ns my-secret secret-data
kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d
$>

但是当我执行kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d时,我得到了预期的结果。

如果您正在使用bash,请尝试以下操作,只更改kubectlParams的分配方式。这里,kubectlParams将第一个参数赋值给倒数第二个参数($#-1)。

另外,如果加引号的话,"${kubectlParams}"将被认为是一个命令。例如:-n my-ns my-secret将被视为单个字符串。它将被视为单个字符串,该字符串是kubectl的参数。kubectl可以理解-n,my-ns,my-secret,但不能理解-n my-ns mysecret

kgsecd() {
secretData="${@: -1}"
kubectlParams=${@:1:$#-1}
echo "kubectl get secret ${kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d"
kubectl get secret ${kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d
}

执行输出:

#test secret created:
kubectl create secret  generic my-secret -n my-ns --from-literal=secret-data=helloooooo

#function output
kgsecd -n my-ns my-secret secret-data
kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d
helloooooo

#manual命令执行输出:

kubectl get secret -n my-ns my-secret -o "jsonpath={.data.secret-data}" | base64 -d
helloooooo

zsh解决方案(见OP注释):

kgsecd() { kubectl get secret ${@:1:-1} -o "jsonpath={.data.${@: -1}}" | base64 -d }

除了前面的答案之外,这实际上是正确的,这里是符合zsh的"长版本"。函数:

kgsecd() {
secretData=${@: -1}
kubectlParams=${@:1:-1}
kubectl get secret ${=kubectlParams} -o "jsonpath={.data.$secretData}" | base64 -d
}

的主要差异,使其zsh-compliant:

  • kubectlParams=${@:1:-1}使用:-1}代替:$#-1}来获取params数组倒数第二个元素之前的项。
  • kubectl get secret ${=kubectlParams} ...注意${=kubectlParams}中的等号。这是因为zsh不像bash,在变量替换时不拆分数组项,所以如果你想要这种行为,你必须添加等号。