Как запустить один и тот же класс несколько раз?
У меня есть модуль puppet, который развертывает файл JAR и записывает некоторые файлы свойств (с помощью шаблонов ERB). Недавно мы добавили в приложение функцию "mode", то есть приложение может работать в разных режимах в зависимости от значений, введенных в манифесте. Моя иерархия такова:
Настройка
* config
* * файлы
* установить
Настройки значение звонки классе config и класс установка. Класс install развертывает соответствующий файл RPM в соответствии с режимом(режимами)
Класс config проверяет режимы и для каждого режима вызывает класс files с определенными параметрами режима и каталога, причина такой структуры заключается в том, что значение свойств зависит от фактического режима.
Техническая проблема заключается в том, что если у меня есть несколько режимов в манифесте (что является моей целью) , мне нужно вызвать класс files дважды:
if grep($modesArray, $online_str) == [$online_str] {
class { 'topology::files' :
dir => $code_dir,
mode => $online_str
}
}
$offline_str = "offline"
$offline_suffix = "_$offline_str"
if grep($modesArray, $offline_str) == [$offline_str] {
$dir = "$code_dir$offline_suffix"
class { 'topology::files' :
dir => $dir,
mode => $offline_str
}
Однако в puppet нельзя объявлять один и тот же класс дважды.
Я пытаюсь ... выясните, как я могу вызвать класс дважды или, возможно, метод, который я могу получить доступ к его параметрам из моих ERB-файлов, но я не могу понять это
Документация говорит, что это возможно, но не говорит, как (я проверил здесь https://docs.puppetlabs.com/puppet/latest/reference/lang_classes.html#declaring-classes).
Итак, подведем итог, есть ли способ либо:
- вызовите один и тот же класс несколько раз с различными параметрами
- (какой-то другой способ) создать несколько файлов, основанных на одном файле ERB (с разными параметрами каждый раз)
2 ответа:
Вы можете просто объявить свой класс как define:
define topology::files($dir,$mode){ file{"${dir}/filename": content=> template("topology/${mode}.erb"), } }
, который будет применять различные шаблоны для каждого режима
А затем создавайте его столько раз, сколько захотите:
if grep($modesArray, $online_str) == [$online_str] { topology::files{ "topology_files_${online_str}" : dir => $code_dir, mode => $online_str } } $offline_str = "offline" $offline_suffix = "_$offline_str" if grep($modesArray, $offline_str) == [$offline_str] { $dir = "$code_dir$offline_suffix" topology::files{ "topology_files_${online_str}" : dir => $dir, mode => $offline_str }
Ваша интерпретация документации не соответствует действительности.
Классы в Puppet должны рассматриваться как синглетоны. Существует ровно один экземпляр каждого класса. Он является частью манифеста узла или нет. Манифест может объявлять класс так часто, как он хочет, используя ключевое словоinclude
.Остерегайтесь объявления с использованием ресурса, подобного синтаксису.
class { 'classname': }
Это может появитьсяСамое большее один раз в манифесте. Значения параметров теперь навсегда привязаны к вашим класс. Ваш узел выбрал, какую конкретную форму должен принять для него класс.
Не видя кода для вашего класса, ваш вопрос заставляет меня поверить, что вы пытаетесь использовать Puppet в качестве скриптового движка. Это не. Puppet позволяет только моделировать целевое состояние. Существует несколько мощных механизмов реализации сложных рабочих процессов для достижения этого состояния, но вы не можете использовать их для выполнения произвольных преобразований в произвольном порядке.
Если вы добавите код класса, мы можем попробовать и дайте несколько советов о том, как перестроить его, чтобы заставить марионетку делать то, что вам нужно. Но боюсь, что это невозможно. Если действительно необходимо синхронизировать один или несколько ресурсов с разными состояниями в разное время (скриптовый движок? ;- ) во время транзакции вы должны вместо этого реализовать весь этот рабочий процесс как реальный сценарий и заставить марионетку запускать его через ресурс
exec
, когда это уместно.