我的最终目标是将特定于站点的配置片段包含到通用基础模板中。我的第一个想法是从基础模板中调用模板函数,例如:
显现:
...
$domain = "www.example.com"
...
模板:
server {
# Common configuration items here.
...
# Load site-specific configurations here.
<%= scope.function_template("sites/$domain/config.erb") %>
}
但是,似乎不可能在函数调用中使用变量(如果我错了,请纠正我)。还有一个问题是必须存在特定于站点的模板。
因此,我的下一个想法是使用清单中的变量,其中包含从模板加载的站点特定配置内容。
显现:
...
$domain = "www.example.com"
$site_specific_content = template("sites/$domain/config.erb")
....
模板:
server {
# Common configuration items here.
...
# Load site-specific configurations here.
<%= site_specific_content %>
}
但是,我还没有找到一种方法来呈现模板(如果模板存在),但如果模板不存在,则将变量设置为空字符串。(虽然有点不雅,但我想这里的解决方法可能是为不需要额外配置的站点创建一个空的站点特定模板。)
有任何想法吗?
答案1
但是,似乎不可能在函数调用中使用变量(如果我错了,请纠正我)。还有一个问题是必须存在特定于站点的模板。
可以在函数调用中使用变量,但请记住,函数参数是 ruby 字符串,而不是 Puppet 模板。您可以这样做:
<%= scope.function_template("sites/" + domain + "/config.erb") %>
或者使用 Ruby 的字符串替换:
<%= scope.function_template("sites/#{domain}/config.erb") %>
...但如果定义的模板不存在,这仍会产生错误。
为了防止出现错误,您可以在模板内部使用 Ruby 的异常处理机制,如下所示:
<%=
begin
scope.function_template("sites/#{domain}/config.erb")
rescue
end
%>
太棒了!也许有更好的方法可以做到这一点;我既不是 Ruby 专家也不是 Puppet 专家,我只是刚刚才想出来的。