如何使用 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:

  1. 创建 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

  1. 运行
kustomize build | kubectl apply -f -

kubectl apply -k .