Установка группы файлов с puppet и hiera

У меня есть конфиг марионетки, который правильно устанавливает файл. Я хочу, чтобы он установил несколько файлов. Конфиг выглядит примерно так (в той части, которая здесь актуальна):

$stuff = hiera('stuff')
$site_filename = $stuff['site_file']

file { "/path/to/my/file/called/$site_filename":
  ensure  => present,
  owner   => 'the-owner',
  group   => 'the-group',
  mode    => 644,
  source  => "puppet:///modules/this-module/$site_filename",
  require => [Package['something'],
      User['someone']]
}
file { "/path/to/my/symlink/called/$site_filename":
  ensure  => 'link',
  target  => "/path/to/my/file/called/$site_filename",
  require => Package['something'],
}

Работает отлично, нужный файл установлен на правильный хост. Но теперь я хотел бы установить переменное количество (очень похожих) файлов, количество которых будет разным на каждом хосте.

Мои файлы hiera в настоящее время выглядят так:

stuff:
  site_file: "hey-i-am-the-site-file-on-host-awesomeness"

В принципе, я хочу сказать примерно следующее:

stuff:
  site_file: ["hey-i-am-the-site-file-on-host-awesomeness",
              "i-am-also-a-site-file-for-awesomeness",
              "do-not-forget-me-too",
              "someday-you-will-want-me-as-well"]

И здесь я достиг предела своих знаний о марионетках и иерах. Я понимаю, что, когда я думаю, что должен повторить в марионетке, я, вероятно, ошибаюсь, но я немного запутался, как это сделать.

Любые указатели на то, как это сделать или что прочитать, чтобы узнать?


person jma    schedule 13.07.2016    source источник
comment
Трудно поверить, что то, что вы представляете, прекрасно работает, когда оно синтаксически неверно и представляет дублирующиеся ресурсы. Давайте начнем с чего-то, что действительно может сработать, не так ли?   -  person John Bollinger    schedule 13.07.2016
comment
Кроме того, для какой версии Puppet это предназначено? Ответ для Puppet 3 (с отключенным синтаксическим анализатором будущего) может существенно отличаться от ответа для Puppet 4.   -  person John Bollinger    schedule 13.07.2016
comment
Это марионетка 3.7.2. Учитывая, что я сказал, что это фрагмент манифеста, что здесь синтаксически неверно? (Ах, для упрощения я продублировал имя файла, исправил.)   -  person jma    schedule 13.07.2016
comment
Вы не упомянули, используете ли вы будущий парсер или нет.   -  person Matt Schuchard    schedule 13.07.2016
comment
Ах, извините. Я нет.   -  person jma    schedule 13.07.2016


Ответы (1)


Puppet 4 и имеет некоторые функции итерации, которые можно было бы применить здесь, и они доступны также в недавнем Puppet 3 с включенным синтаксическим анализатором будущего. Однако они недоступны в Puppet 3 без парсера future, поэтому вам нужно другое решение.

Классический подход к таким проблемам заключается в том, чтобы полагаться на тот факт, что объявление ресурса, в котором заголовок является массивом (литералом или переменной со значением массива), объявляет отдельный ресурс для каждого элемента массива. Это часто сочетается с определенным типом в качестве ресурса для прямого объявления. Эта комбинация примерно эквивалентна циклу foreach по элементам массива с телом определенного типа в качестве его тела. Пример:

define mymodule::sitefile() {
    file { "/path/to/my/file/called/$title":
      ensure  => present,
      owner   => 'the-owner',
      group   => 'the-group',
      mode    => 644,
      source  => "puppet:///modules/mymodule/$title",
      require => [Package['something'], User['someone']]
    }

    file { "/path/to/my/symlink/called/$title":
      ensure  => 'link',
      target  => "/path/to/my/file/called/$title",
      require => Package['something']
    }
}

# ...

$stuff = hiera('stuff')
mymodule::sitefile { $stuff['site_file']: }
person John Bollinger    schedule 13.07.2016
comment
Это определенно распространенный шаблон для итерации до лямбда в Puppet (определить с переданным хэшем). Этот ответ будет полезен, чтобы потенциально указать другим в будущем. - person Matt Schuchard; 13.07.2016
comment
Спасибо, это делает именно то, что я хочу, а также демистифицирует элемент марионетки, который явно поможет в будущем. - person jma; 14.07.2016