是否可以使用 Puppet 来确保目录中存在多个文件而无需定义所有文件?

是否可以使用 Puppet 来确保目录中存在多个文件而无需定义所有文件?

我有几百台一次性服务器,它们有不同的配置文件,需要放在一个目录中。文件的副本位于 Puppet Master 上。

在我的一个类中,我有一组默认的配置,这些配置始终被推送到节点,如下所示:

file { "/etc/someprogram/config/000-default":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/000-default",
}

我想要的是这样的:

$filearray = directory listing of /etc/puppet/modules/someprogram/files/$fqdn
with each file as an element into array

$filearray.each(
file { "/etc/someprogram/config/$filename":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/files/$fqdn/$filename",
}
)

我不太熟悉 puppet,但我感觉没有办法做到这一点。

答案1

你可以用这个做你正在尝试的事情:

file { "/etc/someprogram/config":
    ensure => directory,
    recurse => remote,
    source => "puppet:///modules/someprogram/files/$fqdn"
    #Other options
}

这会将 $fqdn 中的所有文件复制到 /etc/someprogram/config,如果它们已经存在则覆盖。

答案2

如果您想在目录中定义多个文件而不递归整个目录,则可以使用数组 - 如下所示:

$myfiles = [ "/my/dir/file1", "/my/dir/file2", ]
file { $myfiles:
    ensure => "present",
    owner  => "root",
    group  => "root",
    mode   =>  0644,
    source => "puppet:///modules/someprogram/$fqdn/$name",
}

当然,如果“/my/dir”的路径很长或者文件很多,那么就会有点难以处理,所以在这种情况下,最好创建一个包含目录路径的定义,然后将文件名数组传递给它。

答案3

下面是我如何做到这一点的一个例子:

file {
        [
        '/sys/block/sda/queue/scheduler',
        '/sys/block/sdb/queue/scheduler',
        '/sys/block/sdc/queue/scheduler',
        '/sys/block/sdd/queue/scheduler',
        '/sys/block/sde/queue/scheduler',
        '/sys/block/sdf/queue/scheduler'
        ]:
  ensure  => 'file',
  content => 'deadline',
  group   => '0',
  mode    => '644',
  owner   => '0',
  type    => 'file',
}

在上面的例子中,我通过 Puppet 为给定服务器上的每个磁盘分配截止 I/O 调度程序。

相关内容