我正在对 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.html和https://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}")