从 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
合并 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 的合并功能,我将不胜感激。
如果你给出--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
我一直在使用 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
合并 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 的合并功能,我将不胜感激。
如果你给出--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