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



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

yq m <yaml_file> <yaml_file2> <yaml_file3>

命令的工作方式如下所示

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

基本上,帐户。和网络。Yml被合并为training-lab-account。不覆盖training-lab-account.yml中的内容。

yq v4不支持" "标志合并。事实上,我觉得yq@4是一个全新的软件,与yq@3完全不同。

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

不幸的是,这会覆盖f1中的内容。Yml从f2。Yml -这不是yq@3中的merge行为。

由于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 eval-all --inplace 'select(fileIndex == 0) * select(fileIndex == 1)' f1.yml f2.yml

f2。Yml覆盖f1.yml中存在的所有值。这对应于yq m -ix f1.yml f2.yml

的yq v3行为如果您想保留f1中的值。您可以简单地切换顺序:

yq eval-all --inplace 'select(fileIndex == 1) * select(fileIndex == 0)' f1.yml f2.yml

注意,我们在select命令中交换了顺序,但保留了给定文件名的顺序。这确保了f1。Yml是就地重写的文件。

我很确定,你可以在选择命令中定义顺序,这样你的3个文件合并也可以按你想要的方式工作。

最新更新