使用yq转换并合并数组:如何将结果写入file1.yaml?
解决yq合并YAML数组并写入文件的问题
问题分析
你的核心问题是处理多文件时错误地在单文件处理阶段跨文件引用数据——yq默认逐文件处理,当处理第二个文件(fi==1)时,select(fi==0)会返回null,导致赋值失败。需要先将两个文件内容加载到变量中,再执行合并操作。
正确实现步骤
1. 提取并转换File2的端口数据
从File2中提取traefik.ports下的所有nodePort,转换为仅包含hostPort字段的对象数组:
$file2.traefik.ports[] | {hostPort: .nodePort}
执行后得到:
- hostPort: 32555 - hostPort: 30000
2. 合并到File1的数组中
将转换后的数组追加到File1的nodes[0].extraPortMappings数组末尾:
$file1.nodes[0].extraPortMappings += ($file2.traefik.ports[] | {hostPort: .nodePort})
3. 完整执行命令
使用--slurp(或-s)参数将两个文件加载为数组,通过索引访问文件内容:
yq -s ' $file1 = .[0] | $file2 = .[1] | $file1.nodes[0].extraPortMappings += ($file2.traefik.ports[] | {hostPort: .nodePort}) | $file1 ' file1.yaml file2.yaml
4. 写入File1原文件
添加-i参数直接修改原文件(建议先备份原文件):
yq -i -s ' $file1 = .[0] | $file2 = .[1] | $file1.nodes[0].extraPortMappings += ($file2.traefik.ports[] | {hostPort: .nodePort}) | $file1 ' file1.yaml file2.yaml
验证结果
执行命令后,file1.yaml会生成你期望的输出:
kind: Cluster apiVersion: kind,x-k8s.io/v1alpha4 nodes: - role: control-plane extraPortMappings: - containerPort: 1234 hostPort: 31234 - hostPort: 32555 - hostPort: 30000
内容的提问来源于stack exchange,提问作者Arikael
相关产品推荐
相关产品推荐

