Установка группы файлов с 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"]

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

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

1 ответ

Решение

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

Классический способ решения таких проблем состоит в том, чтобы полагаться на тот факт, что объявление ресурса, в котором заголовок является массивом (литерал или переменная со значением массива), объявляет отдельный ресурс для каждого элемента массива. Это часто сочетается с определенным типом в качестве ресурса для прямого объявления. Эта комбинация примерно эквивалентна циклу 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']: }
Другие вопросы по тегам