在我们从Puppet 3.5.7升级期间以及将来自以下信息的信息拼凑在一起之后:
How to include a subtemplate in a Puppet template
我可以引用一个子模板,该子模板的文件名中带有一些变量,如下所示:
<%= scope.function_template([File.dirname(__FILE__) + "/" + "subtemplate_" + @oscar_package + ".properties.erb"]) %>
启用将来的解析器后,出现以下错误:
错误:无法从远程服务器检索目录:错误400 服务器:评估错误:评估函数调用时出错, 解析模板失败 oscar_mysql_tomcat / context / oscar_demo15.properties.e rb:
文件路径:org / jruby / RubyString.java 线:1172
详细信息:无法将nil转换为String 在/etc/puppet/environments/development/modules/oscar_mysql_tomcat/manifests/context.pp:11:18 在节点bcmdit-devel-536-puppetclient上警告:不使用缓存 失败的目录错误:无法检索目录。跳过运行
@oscar_package的解析失败,如何在将来的解析器中使用它?
更新1
咨询后: https://puppet.com/docs/puppet/5.4/lang_template_erb.html#calling-puppet-functions-from-templates 看来我应该使用scope.call_function:
<%= scope.call_function('template', [File.dirname(__FILE__) + "/" + "subtemplate_" + @oscar_package + ".properties.erb"]) %>
这会产生相同的错误。
答案 0 :(得分:1)
我正在使用的类是定义了oscar_package变量的另一个类的子级。
通过将变量传递给子类来解决,因此可以在调用erb模板中的函数的范围内直接对其进行访问。
因此在init.pp定义中,相关代码为:
if $sys_report::active_database_context_list != "" {
oscar_mysql_tomcat::context { "active_${sys_report::active_database_context_list}":
db_name => "$sys_report::active_database_context_list",
oscar_package => "$oscar_package",
oscar_package_build => "$oscar_package_build",
role => "link",
tomcat_site_seal => "$tomcat_site_seal",
tomcat_host_fqdn => "$tomcat_host_fqdn",
tomcat_port => "$tomcat_port",
twitter_feed => "$twitter_feed",
require => File['/etc/sys-report.var'],
}
}