如何使用单个文件资源安装多个文件

How to install multiple files with a single File-resource

我需要将一些文件安装到一个目录中,该目录本身不是 Puppet 管理的。每个文件的 source 在我模块的 files/ 子目录下。

我想一次性全部安装好,因为它们的所有权和权限都是一样的。但是我要为 source 放什么呢?我希望,只需指定目录即可:

  file {[
    "${rcdir}/foo", "${rcdir}/bar",
  ]:
    source => "puppet:///${module_name}/",
    group  => 'wheel',
    owner  => 'root',
    mode   => '0644'
  }

但是,不幸的是,Puppet(这里使用 3.7.5)不够智能,无法自动适当地附加 foobar

有什么好的方法吗,还是我必须煞费苦心地枚举每个文件?谢谢!

有多种技术可以实现您在这里所做的事情,每种技术各有优缺点。

第一个也是最明确的,它使您能够独立配置每个文件以及查看您正在管理的文件的完整列表,即独立定义每个文件。为了减少代码重复的数量,您可以使用类型默认值(尽管这并不总是合适的)。这看起来像下面这样:

File {
  group  => 'wheel',
  owner  => 'root',
  mode   => '0644',
}
file { "${rcdir}/foo":
  source => "puppet:///modules/${module_name}/foo",
}
file { "${rcdir}/bar":
  source => "puppet:///modules/${module_name}/bar",
}

这显然很快就会变得非常笨重。

第二种策略是使用定义的类型。对于这样的事情,使用它有点笨重,但它可以解决问题。这看起来像这样:

define myclass::file_array (
  $dest_base,
  $source_base,
  $group = 'wheel',
  $owner = 'root',
  $mode  = '0644',
) {
  file { "${dest_base}/${name}":
    source => "${source_base}/${name}",
    group  => $group,
    owner  => $owner,
    mode   => $mode,
  }
}
class myclass (){
  $files_to_manage = ['foo', 'bar', 'baz']
  myclass::file_array { $files_to_manage:
    source_base => "puppet:///modules/${module_name}",
    dest_base   => $rcdir,
  } 
}

这需要您添加一个相对任意的定义类型,如果您想传递核心文件类型可用的所有属性,最终需要您添加许多其他参数,但是对于您的情况来说就足够了.

然而,最简单、最简洁的方法是允许文件资源利用其递归功能,并将所有必需的文件放入模块中它们自己的目录中(假设您有其他文件与此目标目录无关)。它确实需要您允许 Puppet 管理目录的存在,但很难想象这对您来说是个问题(因为如果目标目录无论如何都不存在,那么任何这段代码都会失败)。这看起来像这样:

file { $rcdir:
  ensure  => directory,
  recurse => true,
  source  => "puppet:///modules/${module_name}/rc_files",
  owner   => 'root',
  group   => 'wheel',
  mode    => '0644',
}
// module directory 'files/rc_files' is where foo and bar would exist

我很确定最后一个是您理想的解决方案,您可以利用文件资源的其他方面 (https://docs.puppet.com/puppet/latest/reference/type.html#file-attribute-recurse),例如清除以验证没有额外的文件最终到达您的目的地。

还有其他技术,但希望其中之一能为您解决问题。