是否存在类似CloudFormation内置函数的YAML/JSON通用引用功能库?
有大量无AWS绑定的成熟工具和规范可以实现你需要的配置增强能力,以下是匹配你需求的常见选项:
专门的配置生成工具
这类工具原生支持参数定义、内置函数、配置映射能力,无需二次开发即可直接使用:
- ytt:完全基于YAML扩展的模板工具,支持自定义函数、参数注入、映射查询,语法和你示例中的写法高度相似,不需要学习全新的DSL,直接在YAML中添加注释级指令即可实现逻辑。你示例中的需求可以直接通过顶层参数控制不同环境的配置输出,不需要修改业务配置段。
- Jsonnet:谷歌推出的配置生成语言,支持变量、自定义函数、条件判断、映射取值,最终可以编译为YAML或JSON,生态成熟,大量运维工具原生支持Jsonnet格式的配置。
- CUE:侧重类型安全的配置语言,支持参数引用、模板渲染、逻辑判断,除了实现你需要的动态配置切换能力外,还可以额外做配置合法性校验,避免写错配置值。
轻量无侵入方案
如果你不想引入新的配置DSL,可以选择更轻量的方案:
- Jinja2 + j2cli:用通用模板引擎Jinja2扩展YAML,你可以把环境参数单独存放到变量文件,在配置文件中直接用
{{ options.url[env] }}这类语法写映射逻辑,再通过j2cli工具一键渲染出对应环境的最终配置,学习成本极低,只要会基础的模板语法就能上手。 - 自定义YAML Tag扩展:如果你是要在自己开发的工具中内嵌这个能力,几乎所有语言的YAML解析库都支持自定义Tag解析逻辑,你可以自己实现
!Get、!GetFromMap这类你示例中写的自定义函数,完全匹配你预期的语法,不需要依赖任何第三方工具链。
以下是用ytt实现你需求的示例代码,逻辑和你写的预期语法几乎一致:
#@data/values params: env: DEV #@ load("@ytt:data", "data") options: url: DEV: "example.dev" PROD: "example.com" isLive: DEV: no PROD: yes serverSettings: env: #@ data.values.params.env url: #@ options.url[data.values.params.env] isLive: #@ options.isLive[data.values.params.env]
渲染时只需要修改params下的env值,就可以直接生成对应环境的完整配置。
内容的提问来源于stack exchange,提问作者A Poor
相关产品推荐
相关产品推荐

