Ruby 如何在chef模板中设置变量?

Ruby 如何在chef模板中设置变量?,ruby,chef-infra,Ruby,Chef Infra,在官方文档中,模板的变量只有一个用例:调用者必须传入散列 然而对我来说,我有一个非常简单的用例。我只想在sensu客户端配置模板文件client.json.erb 以下是模板文件: { "client": { "name": "<%= @server_name %>", "address": "<%= node.ipaddress %>", "keepalive": { "thresholds": { "warnin

在官方文档中,模板的
变量
只有一个用例:调用者必须传入散列

然而对我来说,我有一个非常简单的用例。我只想在sensu客户端配置模板文件
client.json.erb

以下是模板文件:

{
  "client": {
    "name": "<%= @server_name %>",
    "address": "<%= node.ipaddress %>",
    "keepalive": {
      "thresholds": {
        "warning": 90,
        "critical": 180
      }
    },
    "subscriptions": [ "default" ]
  }
}
配置文件变成:

{
  "client": {
    "name": "{}",
    "address": "10.0.1.1",
    "keepalive": {
      "thresholds": {
        "warning": 90,
        "critical": 180
      }
    },
    "subscriptions": [ "default" ]
  }
}
如何将变量名正确地传递到模板中?

这解决了我的问题:

template "/etc/sensu/conf.d/client.json" do
  variables(
    'server_name': server_name
  )
  source "sensu-template/conf.d/client.json.erb"
end

这里显示的不够多,左侧的
server\u name
是否为变量?(通常尽量避免将变量和符号命名为相同的名称,当出现错误且无法确定哪一个是错误时,这会带来麻烦。)@Tensibai
server\u name
是其中的一个变量。我已经更新了问题,例如将您的变量重命名为sname,然后再试一次,我怀疑这里有自我赋值。(或者只是变量不是您所期望的字符串,而是一个空散列)我实际上在本地模式下运行了您的代码,它工作得很好。是否在代码中的任何其他位置再次分配服务器名称?我认为在呈现模板之前,变量会被重新分配到其他地方。(查看chef客户端运行的编译/运行阶段)有几种方法可以做到这一点,尽管根据样式COP,您展示的方法是“最正确的”。一些示例显示了您最初使用的
({
),如果您需要惰性求值而不是ruby惰性求值器,您可以使用
变量惰性{
将求值延迟到执行时而不是编译时。多个变量,可能是逗号分隔的?
变量如何(“服务器名称”:服务器名称,“文件路径”:文件路径)
template "/etc/sensu/conf.d/client.json" do
  variables(
    'server_name': server_name
  )
  source "sensu-template/conf.d/client.json.erb"
end