【问题标题】:upgrading to yq v4 from v3 - merging YAML files从 v3 升级到 yq v4 - 合并 YAML 文件
【发布时间】:2021-08-14 00:10:14
【问题描述】:

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

yq m <yaml_file> <yaml_file2> <yaml_file3>

该命令按照here的概述工作

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

training-lab-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 进行合并,如here 所述: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 的合并功能,我将不胜感激。

【问题讨论】:

    标签: yaml yq


    【解决方案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
    

    【讨论】:

    • 添加 --inplace 标志似乎不起作用。它基本上会覆盖第一个给定文件中的所有内容。我使用了这个命令: yq eval-all --inplace 'select(fileIndex == 0) * select(fileIndex == 1) * select(fileIndex == 2)' training-lab-account.yml account.yml network.yml
    • @Raj 你应该删除它,而不是添加它。
    • 不确定我理解您所说的“放下它”是什么意思。您介意输入我应该使用的实际命令吗?
    • yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' f1.yml f2.yml 就是你在没有--inplace的问题中给出的内容
    • 知道了,我什至没有意识到我原来的命令中有--inplace。无论如何,这是我对上述问题中的 yml 文件的尝试:yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1) * select(fileIndex == 2)' training-lab-account.yml account.yml network.yml 这最终会用 account.yml 和 network.yml 中的内容覆盖 training-lab-account.yml 中已经存在的内容。我正在寻找合并 - 您可以在我的问题中看到示例。
    猜你喜欢
    • 2017-09-21
    • 2020-10-26
    • 2020-06-22
    • 1970-01-01
    • 2014-07-26
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多