Ich brauche einen Rat, um meinen Marionettencode zu optimieren. Als Eingabe habe ich zwei Arten von Daten - Arrays, die Portnummern und Hashwerte enthalten, die vhost-Details enthalten, und ich mag jeden von ihnen mit einem anderen (jeden vhost für jeden Port) mischen. Ergebnis sollte für jeden vhost und Port apache :: vhost sein. Nehmen wir an, diese Klasse:
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,
}
}
Jetzt muss ich ein wenig zaubern, um vhost als uniq definieren zu lassen.
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,
}
}
Zum Schluss erstellen Sie apache :: vhost für jeden vhost und Port nach dem Aufteilen des zuvor zusammengeführten Namens (so dass sich host1_80 in host1 und 80 aufteilt):
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"],
}
}
Leider unterstützt die Apache-Klasse kein Arrayals Eingabe für den Portwert, und ich kann keine neueren Versionen von Marionette> 3.2 verwenden (soweit ich mich erinnere - mit jeder und weiteren neuen Funktionen).
Antworten:
0 für die Antwort № 1Für Puppet 3 können Sie verwenden create_resources
, kombiniert mit etwas Rubin:
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
ist von stdlib. Es wäre schöner, wenn Sie eine Marionettenfunktion erstellen würden, anstatt sie zu verwenden inline_template
.