如何选择在Puppet ERB模板中包含文件?

时间:2016-05-26 03:18:59

标签: ruby puppet erb

我正在尝试为文件创建一个Puppet ERB模板,其中包含一些默认内容和一个可选尾部。可选部分由Ppuppet客户端的主机名/ FQDN确定,不需要存在。目前,我有这个:

<%= scope.function_file(['mod/default']) %>
<%= scope.function_file(["mod/" + @hostname, "mod/" + @fqdn, 'mod/empty']) %>

mod是模块名称。我必须创建一个空mod/files/empty,以便scope.function_file如果找不到主机名或FQDN的文件,则不会失败。我觉得这很难看。

我尝试过各种变体:

<%= File.read('default') %>
<% if File.file?(@hostname) %>
<%= File.read(@hostname) %>
<$ elsif File.file?(@fqdn) %>
<%= File.read(@fqdn) %>
<& end %>

将文件放在mod/templates目录而不是mod/files中,但我通常会收到有关丢失文件的错误消息。将scope.function_templatemod/templates中的文件一起使用也会遇到与scope.function_file相同的问题 - 如果文件丢失,操作将失败。

如何在不创建占位符文件的情况下执行此操作(例如此处为empty)?

1 个答案:

答案 0 :(得分:1)

您应该考虑在清单中使用scope.function_file,而不是在erb模板中使用empty。以下内容应该足以阻止您创建“$default_content = file('mod/default') $tail = file( "mod/${::hostname}", "mod/${::fqdn}", "/dev/null" ) if $tail != "" { $real_content = "${default_content}\n${tail}" } else { $real_content = $default_content } ”文件。

template

然后在您的<%= @real_content %>中,您可以使用file { '/path/to/file': ensure => file, content => $real_content }

如果这是该文件的唯一内容,那么您可以完全跳过使用模板,只需使用文件资源,如下所示:

/dev/null

使用mod/${::hostname}如果mod/${::fqdn}/dev/null不存在,您将获得空内容。或者您可以坚持自己的路线,只需将scope.function_file添加到Gesture来电。