场景:我的配置文件由.erb包含以下代码段的文件定义。
<% backupclients.each do |backup_files| -%>
Job {
Name = "Server"
JobDefs = "DefaultJob"
Client = <%= backup_files %>-fd
Pool = TeraMonth
Write Bootstrap = "/var/lib/bacula/<%= backup_files %>.bsr"
}
<% end -%>
Run Code Online (Sandbox Code Playgroud)
服务器的配置文件需要为每个客户端主机重复输入。如果我要创建一个简单的数组,这将毫无问题地工作。然而,我想要做的是让每个主机注册自己,然后使用<<| |>>类似于处理nagios_*类型的编译指示收集数据。
对此的标准示例涉及导出类型。
class ssh {
@@sshkey { $hostname: type => dsa, key => $sshdsakey }
Sshkey <<| |>>
}
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何编写类型或以允许我从.erb模板中读取该值数组的方式引用它。有没有一种方法可以将导出的资源与.erb文件中的变量循环结合使用?
因此,为了直接回答您的问题,我认为无法直接从 erb获取导出资源的列表。这是由出口资源的性质决定的。对于 Puppet 来说,它们只是需要在主机上创建的更多资源。
但是,有一种方法可以完成您想要做的事情。我在我的环境中的几个地方这样做。
在这里,我们创建了一个文件目录,为我们想要标记为“bacula_client”的每个主机创建一个目录。我们使用purge,force和recurse选项删除不受木偶管理的文件(例如,如果你想从这个“清单”中删除系统)。
class bacula::client {
@@file { "/etc/bacula_clients/$fqdn":
ensure => present,
content => "",
require => File['/etc/bacula_clients'],
tag => "bacula_client",
}
}
class bacula::server {
#
# .. include whatever else the server requires, like package {} file {} service {}
#
file { "/etc/bacula_clients":
ensure => directory,
purge => true,
recurse => true,
force => true,
}
# Populate directory of client files.
File <<| tag == "bacula_client" |>>
}
Run Code Online (Sandbox Code Playgroud)
接下来,我们使用 .erb 中的一些 Ruby 代码来扫描此目录中的文件,并对其进行操作:
<%
bacula_clients_dir = '/etc/bacula_clients'
d = Dir.open(bacula_clients_dir)
# Remove directories from the list of entries in the directory (specifically '.' and '..'):
backupclients = d.entries.delete_if { |e| File.directory? "#{bacula_clients_dir}/#{e}" }
backupclients.each do |backup_files|
-%>
Job {
Name = "Server"
JobDefs = "DefaultJob"
Client = <%= backup_files %>-fd
Pool = TeraMonth
Write Bootstrap = "/var/lib/bacula/<%= backup_files %>.bsr"
}
<% end -%>
Run Code Online (Sandbox Code Playgroud)
好吧,首先我放弃并设置@@实际的文件类型。好处是这仍然使用客户端主机上的变量。
class bacula-client ($database = false) {
@@file { "${hostname}-bacula-client.conf":
mode => 600,
owner => bacula,
group => root,
path => "/etc/bacula/conf.d/${hostname}-client.conf",
content => template("bacula-dir-cliententry.erb"),
tag => 'bacula-client',
notify => Service[bacula-director]
}
...
}
Run Code Online (Sandbox Code Playgroud)
这让我可以使用 erb 文件中的条目,例如:
<% if has_variable?("database") and database== "true" %>
...
<% end -%>
Run Code Online (Sandbox Code Playgroud)
以及我的 site.pp 文件中的声明,例如:class { bacula-client: database => "true" }
处理目录本身:
class bacula-director {
file { '/etc/bacula/conf.d':
ensure => directory,
owner => bacula,
group => root,
mode => 600,
purge => true,
recurse => true
}
...
}
Run Code Online (Sandbox Code Playgroud)
清除和递归会清除任何未定义的内容。当我使主机脱机时,puppetstoredconfigclean $hostname将清除事实,并且下次在director上运行puppet将适当地重置配置。
最后,Bacula directer 软件本身允许我在 bacula-dir.conf 文件末尾执行以下操作:
@|"sh -c 'for f in /etc/bacula/conf.d/*.conf ; do echo @${f} ; done'"
Run Code Online (Sandbox Code Playgroud)
因此,似乎仍然没有一种直接的方法可以在一组收集的资源上使用 ERB 模板,但可以收集类型。这可以包括 Augeas 类型,将所有内容填充到一个文件中,或者将文件收集到配置中的一种技巧。不过,它还不包括我在这个问题上寻找的内容。