Puppet EPP模板输出JSON格式哈希值报语法错误问题
Puppet使用EPP模板生成JSON配置报语法错误
问题场景
- Hiera中存储了定义用户组的哈希数组配置数据:
profiles::groups: - name: 'admins' type: 1 rights: [] - name: 'users' type: 2 rights: []
- 在.epp模板中编写如下代码,尝试读取配置生成格式化JSON:
..... groups = <%= require 'json'; JSON.pretty_generate scope['groups'] %> .....
- 预期在生成的配置文件中输出如下JSON内容:
....... groups = [ { "name": "admins", "type": 1, "rights": [] }, { "name": "users", "type": 2, "rights": [] } ] .....
- 实际运行时抛出如下错误:
Error Message: Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Function Call, epp(): Invalid EPP: Syntax error at 'json'
补充说明:完全相同的逻辑在.erb模板中可正常运行,能够输出符合预期的内容。
故障原因
EPP(Embedded Puppet)模板使用Puppet原生表达式语法渲染,不支持直接内嵌原生Ruby代码。你写的require 'json'; JSON.pretty_generate是ERB模板支持的Ruby写法,EPP解析器无法识别这段Ruby语法,扫描到json关键字时直接抛出语法错误,这也是相同逻辑在ERB中正常、EPP中报错的核心原因。
解决方法
直接使用Puppet标准库(puppetlabs/stdlib,绝大多数Puppet环境默认预装)提供的to_json_pretty函数生成格式化JSON,不需要手动引入Ruby的JSON库。
- 在Manifest中读取Hiera配置,调用EPP模板时显式传入变量,不要在模板里直接读scope:
# 读取Hiera中的组配置 $groups = lookup('profiles::groups') # 渲染配置文件 file { '/path/to/your/target/config': content => epp('yourmodule/config.conf.epp', { groups => $groups, }), }
- 修改EPP模板中的对应代码,替换掉原有的Ruby内嵌逻辑:
..... groups = <%= $groups.to_json_pretty %> .....
修改后重新编译catalog即可生成符合预期的格式化JSON配置,不会再触发语法错误。
注意:EPP和ERB是两套完全不同的模板体系,ERB基于Ruby实现支持任意Ruby语法,EPP仅支持Puppet原生语法,不要把ERB的Ruby写法直接照搬到EPP中使用。
内容的提问来源于stack exchange,提问作者sach
相关产品推荐
相关产品推荐

