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

Puppet - Вызов пользовательской функции (которая содержит case / when) из манифеста

Я работаю над куколизацией моих 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}")