Ich würde gerne über ein Array iterieren, das als Fact-Fakt gespeichert ist, und für jedes Element des Arrays einen neuen Systembenutzer und ein Verzeichnis erstellen und schließlich API-Aufrufe an AWS vornehmen.
Beispiel für den Fakt: my_env => [shared1,shared2,shared3]
Meine Frage ist, wie man ein Array in der Marionette durchläuft?
Ich habe das Ruby DSL ausprobiert, aber es ist mir noch nicht gelungen, es zum Laufen zu bringen ... Danke!
Dies kann funktionieren, je nachdem, was Sie tun
// Assuming fact my_env => [ shared1, shared2, shared3 ]
define myResource {
file { "/var/tmp/$name":
ensure => directory,
mode => 0600,
}
user { $name:
ensure => present,
}
}
myResource { $my_env: }
Es wird funktionieren, wenn Ihre Anforderungen einfach sind. Wenn nicht, macht Puppet dies sehr schwer. Die Puppet-Entwickler haben irrationale Vorurteile gegen die Iteration, basierend auf einem Missverständnis darüber, wie deklarative Sprachen funktionieren.
Wenn diese Art von Ressource für Sie nicht funktioniert, können Sie vielleicht eine bessere Vorstellung davon machen, welche Ressourceneigenschaften Sie in Ihrem Array festlegen möchten.
EDIT:
Mit Puppet 4 wurde dieser beklagenswerte Fehler endlich behoben. Aktueller Stand dokumentiert hier . Wie aus der Dokumentation hervorgeht, finden Sie ein Beispiel für die obige Lösung in viel altem Code.
Ab Marionette 3.2 ist dies mit dem "zukünftigen" Parser wie folgt möglich:
$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
file { "/var/tmp/$value":
ensure => directory,
mode => 0600,
}
user { $value:
ensure -> present,
}
}
Siehe auch: http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html#background-the-puppet-future-parser
Marionette 3.7, die Anfang des Monats veröffentlicht wurde, verfügt über die neue DSL-Funktion. Eine Funktion ist die Iteration. Überprüfen Sie die folgende URL https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and -iteration
diese neuen Funktionen können aktiviert werden mit:
Setzen Sie parser = future in Ihrer puppet.conf-Datei Oder fügen Sie den Befehlszeilenschalter --parser = future hinzu
hoffentlich hilft das
die Antwort von itsbruce ist im Moment wahrscheinlich die beste, aber es gibt einen Iterationsvorschlag , der den Ankerprozess von Puppetlabs durchläuft, um eine mögliche zukünftige Implementierung zu ermöglichen.
Es gibt eine "create_resources ()" Funktion in der Marionette. das wird sehr hilfreich sein, wenn ich die Liste der iterieren durchläuft
Seit Puppet (6.4.2) und seit Puppet 4 wird die Iteration über Arrays auf verschiedene Arten unterstützt:
$my_arr = ['foo', 'bar', 'baz']
Jede Funktion:
$my_arr.each |$v| {
notice($v)
}
Alternative Syntax für jede Funktion:
each($my_arr) |$v| {
notice($v)
}
So erhalten Sie den Index:
Übergeben Sie ein zweites Argument an each
name__:
$my_arr.each |$i, $v| {
notice("Index: $i, value: $v")
}
Vergleich mit Ruby:
Beachten Sie, dass diese Grammatik von Ruby inspiriert ist, sich jedoch geringfügig unterscheidet. Es ist hilfreich, die beiden nebeneinander anzuzeigen, um Verwechslungen zu vermeiden. Ruby würde erlauben:
my_arr.each do |v|
notice(v)
end
Oder:
my_arr.each { |v|
notice(v)
}
Andere Iterationsfunktionen:
Beachten Sie, dass Puppet eine Reihe weiterer Iterationsfunktionen bietet:
each
NAME _ - Wiederholt einen Codeblock mehrmals, wobei eine Sammlung von Werten verwendet wird, um jedes Mal andere Parameter bereitzustellen.
slice
NAME _ - Wiederholt einen Codeblock mehrmals, wobei Wertegruppen aus einer Auflistung als Parameter verwendet werden.
filter
NAME _ - Verwendet einen Codeblock zum Transformieren einer Datenstruktur, indem nicht übereinstimmende Elemente entfernt werden.
map
NAME _ - Verwendet einen Codeblock, um jeden Wert in einer Datenstruktur zu transformieren.
reduce
NAME _ - Verwendet einen Codeblock, um einen neuen Wert oder eine neue Datenstruktur zu erstellen, indem Werte aus einer bereitgestellten Datenstruktur kombiniert werden.
with
NAME _ - Wertet einen Codeblock einmal aus und isoliert ihn in seinem eigenen lokalen Bereich. Es wird nicht iteriert, hat jedoch eine Ähnlichkeit mit den Iterationsfunktionen.
Puppe 3 und früher:
Wenn Sie alten Code noch mit Puppet 3 geerbt haben, ist die akzeptierte Antwort immer noch korrekt:
define my_type {
notice($name)
}
my_type { $my_arr: }
Beachten Sie jedoch, dass dies in modernen Puppets normalerweise als schlechter Stil angesehen wird.