Puppet - 从清单调用自定义函数(包含 case/when)

Puppet - 从清单调用自定义函数(包含 case/when)

我正在对 httpd 和 nginx vhost 配置进行木偶化。目前我有 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.htmlhttps://stackoverflow.com/questions/948135/how-to-write-a-switch-statement-in-ruby让我达到这一点。

当前环境:ruby 1.8.7 和 puppet 2.7.19

答案1

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}")

相关内容