以编程方式应用来自多资源 Kubernetes YAML 文件的单个资源
Programatically apply a single resource from a multi resource Kubernetes YAML file
我有一个包含三个配置映射的文件,如下所示。
apiVersion: v1
data:
TEST: "one"
kind: ConfigMap
metadata:
name: test-config-one
---
apiVersion: v1
data:
TEST: "two"
kind: ConfigMap
metadata:
name: test-config-two
---
apiVersion: v1
data:
TEST: "three"
kind: ConfigMap
metadata:
name: test-config-three
我正在尝试仅将 test-config-three
应用于集群。我知道我可以将它分解成自己的文件 运行 kubectl apply -f test-config-three.yaml
,但是有没有一种方法可以做到这一点而不必创建新文件?
我希望能够做类似的事情:
cat file.yml | yq <get only test-config-three> | kubectl apply -f -
但是yq
似乎不支持在文件中查找单个资源。我还查看了 kubesplit 之类的工具,但它们倾向于将所有资源输出到单独的文件。
有没有办法在不创建新文件的情况下从包含多个资源的yaml文件中隔离并输出单个资源?
更新
感谢@Inian 在下面的回答,我能够使这个完整的命令正常工作。
cat file.yml | yq e 'select(.data.TEST == "three")' - | kubectl apply -f -
如果你有 python 你可以尝试关注
export MYFILE=file.yml
export DOC_NUMBER=2
python3 -c "import yaml; print(yaml.dump(list(yaml.safe_load_all(open('"$MYFILE"')))["$DOC_NUMBER"]))" | kubectl apply -f -
yaml.safe_load_all(open('"$MYFILE"'))
将 yaml 文件中的所有文档加载到一个列表中。然后您选择带有 ["$DOC_NUMBER"]
.
的“$DOC_NUMBER”文档
yaml.dump
会将加载的对象转储为 yaml 格式,然后打印出来。
yq
实现了两个版本,一个在 Python 中,一个在 Go 中,正如我在 How can I parse a YAML file from a Linux shell script?
的回答中强调的那样
使用 Python 版本 - kislyuk/yq
yq -y 'select(.data.TEST == "three")' yaml
Go 版本 - mikefarah/yq
yq e 'select(.data.TEST == "three")' yaml
我有一个包含三个配置映射的文件,如下所示。
apiVersion: v1
data:
TEST: "one"
kind: ConfigMap
metadata:
name: test-config-one
---
apiVersion: v1
data:
TEST: "two"
kind: ConfigMap
metadata:
name: test-config-two
---
apiVersion: v1
data:
TEST: "three"
kind: ConfigMap
metadata:
name: test-config-three
我正在尝试仅将 test-config-three
应用于集群。我知道我可以将它分解成自己的文件 运行 kubectl apply -f test-config-three.yaml
,但是有没有一种方法可以做到这一点而不必创建新文件?
我希望能够做类似的事情:
cat file.yml | yq <get only test-config-three> | kubectl apply -f -
但是yq
似乎不支持在文件中查找单个资源。我还查看了 kubesplit 之类的工具,但它们倾向于将所有资源输出到单独的文件。
有没有办法在不创建新文件的情况下从包含多个资源的yaml文件中隔离并输出单个资源?
更新
感谢@Inian 在下面的回答,我能够使这个完整的命令正常工作。
cat file.yml | yq e 'select(.data.TEST == "three")' - | kubectl apply -f -
如果你有 python 你可以尝试关注
export MYFILE=file.yml
export DOC_NUMBER=2
python3 -c "import yaml; print(yaml.dump(list(yaml.safe_load_all(open('"$MYFILE"')))["$DOC_NUMBER"]))" | kubectl apply -f -
yaml.safe_load_all(open('"$MYFILE"'))
将 yaml 文件中的所有文档加载到一个列表中。然后您选择带有 ["$DOC_NUMBER"]
.
yaml.dump
会将加载的对象转储为 yaml 格式,然后打印出来。
yq
实现了两个版本,一个在 Python 中,一个在 Go 中,正如我在 How can I parse a YAML file from a Linux shell script?
使用 Python 版本 - kislyuk/yq
yq -y 'select(.data.TEST == "three")' yaml
Go 版本 - mikefarah/yq
yq e 'select(.data.TEST == "three")' yaml