在我们从Puppet 3.5.7升级之前以及从以下方面汇总信息之后:
How to include a subtemplate in a Puppet template
我可以在文件名中引用一个带有一些变量的子模板,如下所示:
<%= scope.function_template([File.dirname(__FILE__) + "/" + "subtemplate_" + @oscar_package + ".properties.erb"]) %>
启用未来的解析器后,我收到以下错误:
错误:无法从远程服务器检索目录:SERVER上的错误400:评估错误:评估函数调用时出错,无法解析模板oscar_mysql_tomcat / context / oscar_demo15.properties.e rb: Filepath:org / jruby / RubyString.java行:1172 细节:无法在节点bcmdit-devel-536-puppetclient上的/etc/puppet/environments/development/modules/oscar_mysql_tomcat/manifests/context.pp:11:18将nil转换为String警告:未在失败目录上使用缓存错误:无法检索目录;跳过运行
它在@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"]) %>
这会产生相同的错误。
我正在使用的类是另一个类的子节点,其中定义了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'],
}
}