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

时间:2016-04-26 18:29:25

标签: puppet

我需要在一个目录中安装许多文件,而这个目录本身并不是由Puppet管理的。每个文件的source位于我的模块的files/子目录下。

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

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

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

有没有一种很好的方法,或者我是否需要精心枚举每个文件?谢谢!

1 个答案:

答案 0 :(得分: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",
}

这显然很快变得非常笨拙。

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

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,
  } 
}

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

但是,最简单,最干净的方法是通过允许文件资源利用其递归功能,并将所有必需的文件放入模块中自己的目录(假设您有其他文件)与此目标目录无关)。它确实要求您允许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),例如清除,以验证目的地中没有额外的文件。

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