我想知道如何解决以下木偶问题:我想基于字符串数组创建多个文件。复杂之处在于我想用这些文件创建多个目录:
dir1/
fileA
fileB
dir2/
fileA
fileB
fileC
问题是文件资源标题必须是唯一的。因此,如果我将文件名保存在数组中,则需要以自定义方式遍历该数组,以便能够使用目录名作为文件名的后缀:
$file_names = ['fileA', 'fileB']
$file_names_2 = [$file_names, 'fileC']
file {'dir1': ensure => directory }
file {'dir2': ensure => directory }
file { $file_names: path = 'dir1', ensure =>present, }
file { $file_names_2: path = 'dir2', ensure =>present, }
这行不通,因为文件资源标题冲突。所以我需要将目录名称附加到文件标题,但是,这会导致文件数组被连接起来,而不是被视为多个文件……
啊……
file { "${file_names}-dir1": path = 'dir1', ensure =>present, }
file { "${file_names_2}-dir2": path = 'dir1', ensure =>present, }
如何解决这个问题而不需要重复文件资源本身。谢谢
答案1
您可以使用regsubst()
函数修改字符串数组并返回一个数组。请参阅Puppet 功能参考。
$filenames = ['fileA', 'fileB', 'fileC']
$filepaths_dir1 = regsubst($filenames, '^', '/path/to/dir1/')
file {$filepaths_dir1:
ensure => present,
}
请记住,file
资源标题需要是完全限定路径,或者必须使用参数指定完整路径。为文件path
指定可能达不到您想要的效果。path => 'dir1'
答案2
我已经有一段时间没有用过它了,但是定义应该可以处理你想要的东西。
define myfiles::config ($directory_name, $file_name) {
; add command to create directories if needed
file { "myfiles/conf.d/$directory_name/$file_name":
ensure => present,
...
}
}
$directory_name= <from array>
$file_name= <from array>
; loop the following statement
myfiles::config { "$directory_name-$file_name":
directory_name => 'dir1',
file_name => 'file',
}