代码之家  ›  专栏  ›  技术社区  ›  Mike Chaliy

如何使用yq在条件下修补多文档yaml文件?

  •  0
  • Mike Chaliy  · 技术社区  · 4 年前

    让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,但其他解决方案也会有所帮助。

    0 回复  |  直到 4 年前
        1
  •  6
  •   Inian    4 年前

    mikefarah/yq 对于4以上的版本,您可以 select 并更新 |= 对所需文档的操作

    yq e 'select(.kind == "NetworkPolicy").apiVersion |= "networking.k8s.io/v1beta1"' yaml
    

    上述方法在以下方面效果良好 yq version 4.6.0 .使用 -i 标记以替换文件。

        2
  •  0
  •   Bogdan B.    4 年前

    鉴于其他解决方案会有所帮助,另一种解决方案是使用 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 .