如何将kubectl get secret的输出作为参数正确传入kubectl patch命令
错误原因
你之前的写法存在两处核心问题:
- 命令替换的反引号位置错误,误将反引号写到了
password键名中 - bash默认不会解析单引号包裹内容里的命令替换逻辑,导致最终提交的是命令文本而非命令执行后得到的base64格式密码,因此触发了base64格式非法的报错
正确实现方案
方案一:直接使用命令替换
调整引号嵌套规则,用双引号包裹整个patch参数,对内部json的双引号做转义即可触发命令替换:
kubectl --context foo -n foo patch secret postgres.foo-db.credentials -p "{\"data\":{\"password\":\"$(kubectl --context foo -n foo get secret postgres.foo-db.credentials -o jsonpath={.data.password})\"}}"
方案二:先存为变量再传参(更易读、不易出错)
先将查询到的密码存入临时变量,再代入patch命令,避免复杂的引号转义:
# 第一步:查询密码存入变量 PASSWORD=$(kubectl --context foo -n foo get secret postgres.foo-db.credentials -o jsonpath={.data.password}) # 第二步:执行patch更新 kubectl --context foo -n foo patch secret postgres.foo-db.credentials -p '{"data":{"password":"'"$PASSWORD"'"}}'
这种写法的引号逻辑为:用单引号包裹大部分固定json内容,到需要插入变量的位置先闭合单引号,用双引号包裹变量保证变量解析,最后再补全剩余的单引号即可,既不会破坏json结构,也不会出现变量解析失败的问题。
内容的提问来源于stack exchange,提问作者David Huber FF
相关产品推荐
相关产品推荐

