Puppet 为 .erb 文件变量导出资源?

Jef*_*and 8 puppet

场景:我的配置文件由.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文件中的变量循环结合使用?

Kyl*_*ith 5

因此,为了直接回答您的问题,我认为无法直接从 erb获取导出资源的列表。这是由出口资源的性质决定的。对于 Puppet 来说,它们只是需要在主机上创建的更多资源。

但是,有一种方法可以完成您想要做的事情。我在我的环境中的几个地方这样做。

在这里,我们创建了一个文件目录,为我们想要标记为“bacula_client”的每个主机创建一个目录。我们使用purgeforcerecurse选项删除不受木偶管理的文件(例如,如果你想从这个“清单”中删除系统)。

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)


Jef*_*and 4

好吧,首先我放弃并设置@@实际的文件类型。好处是这仍然使用客户端主机上的变量。

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 类型,将所有内容填充到一个文件中,或者将文件收集到配置中的一种技巧。不过,它还不包括我在这个问题上寻找的内容。