如何使用未来的解析器在人偶模板中包含子模板

时间:2018-08-10 22:39:18

标签: templates puppet upgrade erb

在我们从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"]) %>

这会产生相同的错误。

1 个答案:

答案 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'],
  }
}