单YAML文件内引用变量的正确方法:解决Groovy读取后变量未解析问题
原生YAML规范本身没有内置字符串内插的变量引用能力,你使用的$appname语法无法被YAML解析器识别,只会被当做普通字符串处理,因此Groovy读取后不会自动替换为对应变量值,才会出现路径中空的问题。
你可以根据场景选择以下三种实现方式:
方法1:YAML锚点与别名(仅支持完整值复用,不支持字符串拼接)
如果只需要复用完整的变量值,可以用原生YAML的锚点&和别名*语法,示例如下:
# 定义变量时加&锚点标记 appname: &appname delta configrepo: &configrepo dev development: clusterurl: "/sa1/demo/dfn" email: pseudo@my-fdn.com mount_dir: /mnt/tigers # 用*别名直接复用锚点的值 direct_use_appname: *appname
该方式是原生YAML支持的语法,但是无法满足你将变量拼接进路径字符串的需求。
方法2:Groovy读取后手动做模板替换(最适配你当前场景)
你可以统一在YAML中用自定义占位符标记需要替换的变量,读取后在Groovy层做替换,步骤如下:
- 修改YAML配置,统一标记占位符:
appname : delta configrepo : dev development: clusterurl : "/sa1/demo/dfn" email: pseudo@my-fdn.com mount_dir: /mnt/tigers app_config_dir: "/opt/tigers/{{appname}}/{{configrepo}}/svcaccount"
- Groovy读取后替换占位符,示例代码:
def appConfigDir = vardict.development.app_config_dir .replace("{{appname}}", vardict.appname) .replace("{{configrepo}}", vardict.configrepo) println appConfigDir
执行后即可得到你期望的输出/opt/tigers/delta/dev/svcaccount。如果有大量字段需要替换,可以写通用递归方法遍历所有值自动替换占位符即可。
方法3:使用支持插值的YAML扩展工具
部分上层工具会对YAML做扩展,支持内置变量插值,比如Ansible、Helm模板等,都可以直接在YAML中写占位符引用同文件变量,但这些都是工具层的扩展能力,不是原生YAML规范的内容,脱离对应工具就无法生效。
内容的提问来源于stack exchange,提问作者marc
相关产品推荐
相关产品推荐

