如何从外部文件向YAML文件传递数组?
问题描述
我有如下数组:
[ 'value1','value2','value3' ]
希望将该数组从另一文件传入我的YAML文件,YAML文件需要在如下字段接收数组:
parameters: arrayExpected: arrayValueFromAnotherFile
本来可以直接写成:
parameters: arrayExpected: [ 'value1','value2','value3' ]
但因为特定原因不能这么做——YAML文件不能被大量数组值充斥。我知道YAML本身没有导入语句,请问有没有解决这类问题的方案?
可行解决方案
用yq工具注入外部数组(推荐)
yq是专门处理YAML的命令行工具,可以轻松实现外部数据的注入:- 把数组单独存为一个YAML文件,比如
array-data.yaml:
arrayExpected: ['value1', 'value2', 'value3']- 主YAML文件(比如
main.yaml)保持原有结构,执行命令合并:
yq eval '.parameters += load("array-data.yaml")' main.yaml > output.yaml执行后,
output.yaml中的parameters.arrayExpected就会被替换为外部文件的数组内容。- 把数组单独存为一个YAML文件,比如
模板引擎生成YAML
将主YAML写成模板,通过模板渲染工具填充数组:- 创建模板文件
main.yaml.j2:
parameters: arrayExpected: {{ array_content }}- 使用jinja2-cli渲染模板,若数组存在文件
array.txt中,直接读取内容传入:
jinja2 main.yaml.j2 -D array_content="$(cat array.txt)" > main.yaml如果数组是脚本生成的,也可以直接把生成结果作为参数传入。
- 创建模板文件
拆分YAML后合并
把主配置和数组配置拆分成两个独立文件,再通过工具合并:- 主配置文件
base.yaml:
parameters: otherParameter: "example-value"- 数组配置文件
array-config.yaml:
parameters: arrayExpected: ['value1','value2','value3']- 用yq合并两个文件,合并时会自动覆盖或补充字段:
yq eval-all '. as $item ireduce ({}; . * $item)' base.yaml array-config.yaml > final.yaml- 主配置文件
内容的提问来源于stack exchange,提问作者Danielius Polujanskis
相关产品推荐
相关产品推荐

