gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:49:23 25 4
gpt4 key购买 nike

我需要将一些文件安装到一个目录中,该目录本身不是 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) 的其他方面,例如清除来验证目标中没有多余的文件。

那里还有其他技术,但希望其中一种可以为您解决问题。

关于puppet - 如何使用单个文件资源安装多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36872987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com