我需要建议优化我的木偶代码。作为输入,我有两种类型的数据 - 包含端口号的数组和包含vhost详细信息的哈希,我喜欢将它们与另一个混合(每个端口的每个vhost)。每个vhost和端口的结果应该是apache :: vhost。让我们假设这些课程:
class proxy(
$ports = ['80', '8080'],
) {
class { 'apache':
default_vhost => false,
}
$vhosts = {
'myhost1' => {
serveraliases => ['page.myhost1', ],
proxy_pass => [
{
'path' => '/url/',
'url' => 'http://localhost:8088/anotherurl/'
},
],
},
'myhost2' => {
serveraliases => ['page.myhost2', ],
proxy_pass => [
{
'path' => '/url/',
'url' => 'http://localhost:8088/anotherurl/'
},
],
},
proxy::vhosts { $ports:
vhosts => $vhosts,
}
}
现在我需要做一些魔术来使vhost定义uniq(我将端口号附加到形式为myhost1_80的vhost名称):
define proxy::vhosts (
$vhosts,
) {
$vhosts_keys = keys($vhosts)
$servername_port_string = join($vhosts_keys, "_${title},")
$servername_port_string_full = "${servername_port_string}_${title}"
$servername_port_array = split($servername_port_string_full, ',')
proxy::vhost { $servername_port_array:
vhosts => $vhosts,
port => $name,
}
}
最后在拆分之前为每个vhost和端口创建apache :: vhost定义名称之前已合并(因此host1_80拆分为host1和80):
define proxy::vhost (
$vhosts,
$port,
) {
$servername_and_port = split($name, '_')
apache::vhost { $name:
servername => $servername_and_port[0],
serveraliases => $vhosts[$servername_and_port[0]]['serveraliases'],
docroot => '/var/www',
port => $servername_and_port[1],
directories => [
{ 'path' => '/var/www',
'provider' => 'files',
'deny' => 'from all'
},
],
proxy_pass => $vhosts[$servername_and_port[0]]['proxy_pass'],
}
}
不幸的是,apache类不支持数组作为端口值的输入,我不能使用更新版本的puppet> 3.2(据我记得 - 引入了每个和其他新功能)。这些可以用更简单的方式完成吗?
答案 0 :(得分:0)
对于Puppet 3,你可以使用create_resources
,结合一些红宝石:
define b(
$port,
$vhost)
{
notice("created ${vhost}:${port}")
}
class a(
$all_ports,
$all_vhosts,
) {
$y = inline_template("<%= require 'yaml'; \
t = @all_ports.product(@all_vhosts).map { |(port, vhost)| \
[\"#{port}:#{vhost}\", { port: port, vhost: vhost }] \
}; \
YAML.dump(Hash[t]) %>")
$spec = parseyaml($y)
create_resources('b', $spec)
}
class { 'a':
all_ports => [8080, 80],
all_vhosts => ['one.example.com', 'two.example.com'],
}
parseyaml
来自stdlib。如果你创建一个木偶函数而不是使用inline_template
,那会更漂亮。