/ / Looping durch 2 Datensätze in Marionettenoptimierung - Apache, Marionette

Looping durch 2 Daten in Marionette - Optimierung - Apache, Puppe

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 № 1

Fü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.