我正在尝试将配置映射的内容保存到本地硬盘上的文件中。 Kubectl 支持使用 JSONPath 进行选择,但我找不到仅选择文件内容所需的表达式。
配置映射是使用命令创建的
kubectl create configmap my-configmap --from-file=my.configmap.json=my.file.json
当我跑步时
kubectl describe configmap my-configmap
我看到以下输出:
Name: my-configmap
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
my.file.json:
----
{
"key": "value"
}
Events: <none>
我最远的选择是仅选择文件内容:
kubectl get configmap my-configmap -o jsonpath="{.data}"
哪个输出
map[my.file.json:{
"key": "value"
}]
我想要的输出是
{
"key": "value"
}
JSONPath 难题的最后一块是什么?
如果您有能力使用
jq
,那么您可以使用以下方法,例如按选择器“列出”所有配置映射,并提取文件:
readarray -d $'\0' -t a < <(kubectl get cm -l grafana=dashboards -o json | jq -cj '.items[] | . as $cm | .data | to_entries[] | [ ($cm.metadata.name + "-" + .key), .value ][]+"\u0000"') ; count=0; while [ $count -lt ${#a[@]} ]; do echo "${a[$((count + 1))]}" > ${a[$count]}; count=$(( $count + 2)); done
这使用
kubectl
(使用 -l
作为标签选择器)来获取所有配置映射。接下来,它将它们通过 jq
进行管道传输,创建具有空字节终止的键值对(键还包含配置映射的名称,这样我确保重复的文件名不是问题)。然后它将其读入 bash 数组,按照步骤 2. 创建包含内容的文件来迭代该数组。
这也适用于包含换行符的文件配置映射值。
我使用此命令在 Linux 中将多个内容保存为文件:
mkdir -p data && \
cd data && \
kubectl get cm my-configmap -o go-template --template='{{range $key,$value := .data}}{{println $key}}{{end}}' | xargs touch && \
for file in *; do kubectl get cm my-configmap -o go-template --template="{{index .data \"$file\"}}" > $file; done && \
ls -la