Я работаю над куколизацией моих httpd и nginx vhost confs. Прямо сейчас у меня есть 5 серверов, каждый из которых имеет свой порт и работает на server1, а nginx работает на server2. Очевидно, мне нужно разделить манифестные вызовы httpd и nginx, потому что они могут выполняться на разных серверах.
Что я пытаюсь сделать, так это разделить порты между обоими манифестами, поэтому все, что мне нужно сделать, это передать имя виртуального хоста, который я хочу, либо httpd, либо nginx, и он будет искать порт в центральном месте. Я пытаюсь реализовать пользовательскую функцию, и в настоящее время она настроена следующим образом:
# /path/to/puppet/modules/global/lib/puppet/parser/functions/app_to_port.rb
module Puppet::Parser::Functions
newfunction(:app_to_port, :type => :rvalue) do |args|
case args[0]
when app_1
return 27960
when app_2
return 27961
end
end
end
# /path/to/puppet/modules/httpd/manifests/vhost/conf.pp
...
$vhost_port = app_to_port($name)
...
Я постоянно сталкиваюсь с различными проблемами, с именем $ name я все время получаю undefined local variable or method 'app_1'
ошибок, и если я передам int, $vhost_port
переменная никогда не получает значения. Я новичок в Ruby и Puppet, что заставляет меня думать, что мне не хватает какого-то языка или конструкции приложения. Я побежал ruby -rpuppet /path/to/app_to_port.rb
без ответа, что наводит меня на мысль, что код синтаксически правильный.
Для справки, я читал http://docs.puppetlabs.com/guides/custom_functions.html и https://stackoverflow.com/questions/948135/how-to-write-a-switch-statement-in-ruby чтобы довести меня до этого момента.
Текущее окружение: ruby 1.8.7 и марионетка 2.7.19
Hiera входит в Puppet 3.0 - в 2.7 вам нужно будет установить его отдельно на ваших мастерах.
Поскольку похоже, что вы хотите, чтобы отображение было глобальным, вы захотите поместить его в файл Hiera, который применяется ко всем системам. Итак, в вашем hiera.yaml
, вам нужно что-то вроде ..
:backends:
- yaml
:hierarchy:
- common
:yaml:
:datadir: /etc/puppet/hieradata
Затем в /etc/puppet/hieradata/common.yaml
, настройте сопоставление портов:
port_app_1: "27960"
port_app_2: "27961"
Имея это на месте, вы можете найти его в своей конфигурации vhost.
$vhost_port = hiera("port_${name}")