Назад | Перейти на главную страницу

Ресурс, определенный марионеткой - выборочная параметризация?

В настоящее время я бью головой, пытаясь найти «лучший способ» достичь такого типа детализации для марионетки: у меня есть сервер, на котором запущен memcached в тестовой среде, а другой - в производственной среде.

Эти серверы работают с различными параметрами memcached, и я использую monit для мониторинга и перезапуска их при необходимости, monit управляется через марионетку, а он контролирует memcached через memcached.monitrc, до этого довольно просто.

Моя проблема: у меня есть определенный ресурс с именем "monit :: monitor", который получает имя и шаблон для этого ресурса, например

monit::monitor { 'memcached': }

Это код для monit :: monitor:

define monit::monitor($template_params = {}) {
    file { "/etc/monit/monit.d/${name}.monitrc":
            ensure => present,
            content => template("monit/${name}.monitrc.erb"),
    }
}

Это будет искать "memached.monitrc.erb" в каталоге modules / monit / templates и распечатывать его, но в этом файле мне нужно параметризовать параметр памяти для memcached, если он работает в тестовом env, он должен быть 64 м, если в производстве, 3072м.

templates / memcached.monitrc.erb выглядит так

 check process memcached with pidfile /var/run/memcached0.pid
  start program = "/usr/bin/memcached -d -p 11211 -U 11211 -u memcached -m <%= template_params['memory'] %> -t 4 -c 1024 -P /var/run/memcached/memcached0.pid"
  stop program = "/bin/kill -9 `cat /var/run/memcached0.pid`; rm /var/run/memcached0.pid"
  if failed host 127.0.0.1 port 11211 then restart
  group cache

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

Спасибо за внимание и извините, если это прозвучало неправильно: P

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

Так что в твоем случае я мог бы

extlookup / production.example.com.csv

memcache_memory, 3072m

extlookup / testing.example.com.csv

memcache_memory, 64 мб

Тогда ваша строка шаблона изменится на

запустить программу = "/ usr / bin / memcached -d -p 11211 -U 11211 -u memcached -m <% = extlookup ('memcache_memory')%> -t 4 -c 1024 -P / var / run / memcached / memcached0 .pid "

и значение будет автоматически установлено правильно для каждой машины.

Следует отметить, что некоторые разработчики марионеток считать что поиск данных в ваших манифестах или шаблонах - это плохо, и что вы должны иметь все свои данные, определенные в ваших узлах, и явно передавать их туда, где они должны пройти через параметризованные классы и определения. После прочтения этой цепочки рассылки я все еще думаю, что extlookup - лучшее решение на сегодняшний день, но вы можете прочитать его и решить для себя.

Ну, у меня не было бы хеша для параметров, я бы просто сделал параметры напрямую, например:

define monit::monitor($memory = "64m") {
  # ...
}

Вы даже можете сделать:

define monit::monitor::testing($memory = "64m") {
  # ...
}

И создайте несколько разных определений для каждого и используйте для них один и тот же файл шаблона. Таким образом, определение помечается именем (monit :: monitor :: testing, monit :: monitor :: prod и т. Д.), А параметры находятся в определении. Попросите их вызвать первичное определение, возможно, со всеми значениями, указанными для их обычных значений по умолчанию, или что-то в этом роде.

Думаю, это, наверное, было бы яснее.

Насколько мне известно, фундаментальная слабость шаблонов заключается в том, что к ним нужно обращаться, чтобы узнать, какие параметры им требуются. Лично я гарантирую, что в документации модуля четко указано, какие переменные требуются шаблону, а сам шаблон может содержать раздел комментариев с той же информацией.