我正在尝试为文件创建一个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_template
与mod/templates
中的文件一起使用也会遇到与scope.function_file
相同的问题 - 如果文件丢失,操作将失败。
如何在不创建占位符文件的情况下执行此操作(例如此处为empty
)?
答案 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
来电。