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

Mik*_* T. 7 puppet

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

我想一次性安装它们,因为它们的所有权和权限都是一样的.但是我该怎么做source?我希望,只需指定目录即可:

  file {[
    "${rcdir}/foo", "${rcdir}/bar",
  ]:
    source => "puppet:///${module_name}/",
    group  => 'wheel',
    owner  => 'root',
    mode   => '0644'
  }
Run Code Online (Sandbox Code Playgroud)

但是,不幸的是,Puppet(在这里使用3.7.5)不够聪明,不能自动追加foobar适当的.

有没有一个很好的方法来做到这一点,还是我必须精心枚举每个文件?谢谢!

Jos*_*uza 7

有多种技术可以实现您在这里所做的工作,每种技术都有优点和缺点.

第一个也是最明确的,它使您能够独立配置每个文件以及查看您正在管理的文件的完整列表,是独立定义每个文件.要减少代码重复的数量,可以使用类型默认值(尽管这并不总是合适).这将类似于以下内容:

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",
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,这显然变得非常笨拙.

第二种策略是利用定义的类型.对于像这样的东西来说,这是一个很重要的工具,但它会做到这一点.这看起来像这样:

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,
  } 
}
Run Code Online (Sandbox Code Playgroud)

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

但是,执行您尝试的最简单,最干净的方法是允许文件资源利用其递归功能,并将所有必需的文件放入模块中自己的目录中(假设您有其他与此无关的文件)目的地目录).它确实要求您允许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
Run Code Online (Sandbox Code Playgroud)

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

还有其他技术,但希望其中一种可以帮到你.