如何为YAML数组中每个值拼接前缀?避免配置重复冗余
可行实现方案
YAML本身没有原生支持这种动态数组转换的语法,得靠外部工具来实现,下面是几个实用的方案:
1. 用 yq 命令行工具快速处理
yq 是专门用来操作YAML的命令行工具,能轻松搞定这个需求。如果你已经装了yq(v4版本),直接跑下面的命令就行:
yq eval '.city_map = [.cities[] | "city_" + .]' service.yaml > packages/city-package.yaml
执行完之后,packages/city-package.yaml里就会生成你要的city_map数组。要是目标文件原本就有其他内容,还可以调整命令来合并现有配置。
2. 用Jinja2模板预渲染
如果你的配置是通过模板生成的,用Jinja2模板就能实现:
先写一个city-package.yaml.j2模板文件:
city_map: {% for city in cities %} - city_{{ city }} {% endfor %}
之后用Jinja2的渲染工具,把service.yaml里的cities数组作为变量传进去,就能生成最终的配置文件。
3. 借助Ansible这类配置管理工具
要是你用Ansible管理配置,可以在playbook里这么写:
- name: 生成带前缀的城市映射数组 copy: content: | city_map: {% for city in cities %} - city_{{ city }} {% endfor %} dest: packages/city-package.yaml vars: cities: "{{ lookup('file', 'service.yaml') | from_yaml | json_query('cities') }}"
Ansible会自动读取service.yaml里的cities数组,渲染后生成目标文件。
总的来说,核心思路就是用外部工具读取原数组,通过字符串拼接生成新数组后写入目标文件,YAML本身做不到这种动态转换。
内容的提问来源于stack exchange,提问作者Jeroen de Beer
相关产品推荐
相关产品推荐

