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
是否为变量?(通常尽量避免将变量和符号命名为相同的名称,当出现错误且无法确定哪一个是错误时,这会带来麻烦。)@Tensibaiserver\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