массивы в puppet

массивы в puppet

Мне интересно, как решить следующую проблему с марионеткой: я хочу создать несколько файлов на основе массива строк. Сложность в том, что я хочу создать несколько каталогов с файлами:

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

Связанный контент