Мне интересно, как решить следующую проблему марионетки: я хочу создать несколько файлов на основе массива строк. Сложность в том, что я хочу создать несколько каталогов с файлами:
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, }
Как решить эту проблему без необходимости повторения самого файлового ресурса. Спасибо
Ты можешь использовать regsubst()
функция для изменения массива строк и возврата массива. Видеть Справочник по функциям марионетки.
$filenames = ['fileA', 'fileB', 'fileC']
$filepaths_dir1 = regsubst($filenames, '^', '/path/to/dir1/')
file {$filepaths_dir1:
ensure => present,
}
Имейте в виду, что file
название ресурса должно быть полностью определенным путем, или полный путь должен быть указан с path
параметр. Указание path => 'dir1'
для файлов наверное не то, что вы хотите.
Прошло некоторое время с тех пор, как я использовал это, но определение должно обрабатывать то, что вы хотите.
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',
}