从 v3 升级到 yq v4 - 合并 YAML 文件

upgrading to yq v4 from v3 - merging YAML files

我一直在使用 yq v3 通过以下命令合并 yaml 文件。

yq m <yaml_file> <yaml_file2> <yaml_file3>

命令按概述工作here

例如,假设我有以下 3 个 yaml 文件。

训练实验室-account.yml

account:
  alias: training-lab-account
  orgEmail: training-lab-account@example.com
  snsSubscriptions:
    - training-lab-coe-aws@example.com
network:
  vpcs:
    - cidr: 10.253.0.0/16
  snsSubscriptions:
    - training-lab-coe-aws@example.com

account.yml

---
account:
  snsSubscriptions:
    - ONE_REQUIRED@example.com
  orgEmail: REQUIRED
  orgAccountProvisioningEnabled: true
  groups:
    - name: SmileAdmins
      policies:
        - AdministratorAccess
    - name: SmileReadOnly
      policies:
        - ReadOnlyAccess

network.yml

---
network:
  snsSubscriptions:
    - ONE_REQUIRED@example.com
  vpcs:
    - vpcName: Main
      amiPipeline: false
      accountVendingMachine: false
      flowlogs: true
      transitGw: false
      maxAzs: 3
      endpoints:
        gateway:
          - name: s3
          - name: dynamodb
        interface:
          - name: ssm

当我执行 yq m training-lab-account.yml account.yml network.yml 时,我得到以下输出。

account:
  alias: training-lab-account
  orgEmail: training-lab-account@example.com
  snsSubscriptions:
    - training-lab-coe-aws@example.com
  orgAccountProvisioningEnabled: true
  groups:
    - name: SmileAdmins
      policies:
        - AdministratorAccess
    - name: SmileReadOnly
      policies:
        - ReadOnlyAccess
network:
  vpcs:
    - cidr: 10.253.0.0/16
      vpcName: Main
      amiPipeline: false
      accountVendingMachine: false
      flowlogs: true
      transitGw: false
      maxAzs: 3
      endpoints:
        gateway:
          - name: s3
          - name: dynamodb
        interface:
          - name: ssm
  snsSubscriptions:
    - training-lab-coe-aws@example.com

基本上,account.yml和network.yml合并到training-lab-account.yml,没有覆盖training-lab-account.yml.

中的内容

yq v4 不再支持“m”标志合并。其实我觉得yq@4是一个全新的软件,和yq@3完全不同

长话短说,我正在尝试使用 eval-all 合并 hereyq eval-all --inplace 'select(fileIndex == 0) * select(fileIndex == 1)' f1.yml f2.yml

不幸的是,这会覆盖 f2.yml 中 f1.yml 中的内容 - 这不是 yq@3 中的合并行为。

由于 yq@3 已弃用,我需要升级到 yq@4。对于如何在 yq@4 中复制 yq@3 的合并功能,我将不胜感激。

如果你给出--inplace,它会将结果写入第一个给定的文件。只需删除该参数。


编辑: 要使 training-lab-account.yml 中的值优先于其他文件中的值,请将其作为最后一个参数。要合并 vpcs: 中的序列值,请使用 *d 启用深度数组合并。结果命令:

yq eval-all 'select(fileIndex == 0) *d select(fileIndex == 1) *d select(fileIndex == 2)' account.yml network.yml training-lab-account.yml