You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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库。

  1. 在Manifest中读取Hiera配置,调用EPP模板时显式传入变量,不要在模板里直接读scope:
# 读取Hiera中的组配置
$groups = lookup('profiles::groups')
# 渲染配置文件
file { '/path/to/your/target/config':
  content => epp('yourmodule/config.conf.epp', {
    groups => $groups,
  }),
}
  1. 修改EPP模板中的对应代码,替换掉原有的Ruby内嵌逻辑:
.....
groups = <%= $groups.to_json_pretty %>
.....

修改后重新编译catalog即可生成符合预期的格式化JSON配置,不会再触发语法错误。

注意:EPP和ERB是两套完全不同的模板体系,ERB基于Ruby实现支持任意Ruby语法,EPP仅支持Puppet原生语法,不要把ERB的Ruby写法直接照搬到EPP中使用。

内容的提问来源于stack exchange,提问作者sach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:15:30