如何使用 yq 在条件下修补多文档 yaml 文件?
How to patch multi document yaml file on condition using yq?
拥有类似于以下内容的 YAML 文档:
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-scraping
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: allow-webhooks
我想得到类似
的东西
---
apiVersion: **networking.k8s.io/v1beta1**
kind: NetworkPolicy
metadata:
name: allow-scraping
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: allow-webhooks
所以基本上是获取文档,如果文档有 kind: NetworkPolicy
然后补丁 apiVersion: networking.k8s.io/v1beta1
.
最好是一个 liner,最好是 yq v4,但其他解决方案也会有帮助。
对于 4 以上的版本 mikefarah/yq,您可以对所需文档执行 select
和更新 |=
操作
yq e 'select(.kind == "NetworkPolicy").apiVersion |= "networking.k8s.io/v1beta1"' yaml
以上在 yq version 4.6.0
上运行良好。使用 -i
标志就地替换文件。
考虑到其他解决方案会有帮助 - 替代解决方案是使用 kustomize:
- 创建 kustomization.yaml 文件:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- network-policy.yaml
patches:
- target:
kind: NetworkPolicy
group: networking.k8s.io
version: v1
patch: |
- op: replace
path: /apiVersion
value: networking.k8s.io/v1beta1
- 运行
kustomize build | kubectl apply -f -
或
kubectl apply -k .
拥有类似于以下内容的 YAML 文档:
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-scraping
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: allow-webhooks
我想得到类似
的东西---
apiVersion: **networking.k8s.io/v1beta1**
kind: NetworkPolicy
metadata:
name: allow-scraping
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: allow-webhooks
所以基本上是获取文档,如果文档有 kind: NetworkPolicy
然后补丁 apiVersion: networking.k8s.io/v1beta1
.
最好是一个 liner,最好是 yq v4,但其他解决方案也会有帮助。
对于 4 以上的版本 mikefarah/yq,您可以对所需文档执行 select
和更新 |=
操作
yq e 'select(.kind == "NetworkPolicy").apiVersion |= "networking.k8s.io/v1beta1"' yaml
以上在 yq version 4.6.0
上运行良好。使用 -i
标志就地替换文件。
考虑到其他解决方案会有帮助 - 替代解决方案是使用 kustomize:
- 创建 kustomization.yaml 文件:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- network-policy.yaml
patches:
- target:
kind: NetworkPolicy
group: networking.k8s.io
version: v1
patch: |
- op: replace
path: /apiVersion
value: networking.k8s.io/v1beta1
- 运行
kustomize build | kubectl apply -f -
或
kubectl apply -k .