0

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

yq m <yaml_file> <yaml_file2> <yaml_file3>

该命令按此处概述的方式工作

例如,假设我有以下 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

帐户.yml

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

网络.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按照此处概述的方式合并:yq 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 的合并功能,我将不胜感激。

4

1 回答 1

1

如果你给--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
于 2021-08-12T15:36:35.240 回答