/ / Looping thru 2 набор от данни в марионетка - оптимизация - apache, марионетка

Завъртане чрез 2 комплекта данни в марионетки - оптимизация - apache, puppet

Имам нужда от съвет за оптимизиране на кодекса ми. Като вход имам 2 вида данни - масив, който съдържа номера на портове и хеш, който съдържа подробности за vhost, и обичам да смесвам всеки от тях с друг (всеки vhost за всеки порт). Резултатът трябва да бъде apache :: vhost за всеки 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 define uniq (I "m добавя номер на порт към името на хоста във формата myhost1_80):

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,
}

}

Накрая създаването на apache :: vhost за всеки 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 клас не поддържа масивкато вход за стойността на пристанището и не мога да използвам по-нови версии на марионетката> 3.2 (доколкото си спомням - с всяка от въведените нови функции).

Отговори:

0 за отговор № 1

За куклен 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.