it-swarm.com.de

Wie man ein Array in Puppet durchläuft

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!

24
PapelPincel

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.

70
itsbruce

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

20
ChrisRut

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

3
Walid

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.

1
Philip Potter

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 eachname__:

$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:

  • eachNAME _ - Wiederholt einen Codeblock mehrmals, wobei eine Sammlung von Werten verwendet wird, um jedes Mal andere Parameter bereitzustellen.

  • sliceNAME _ - Wiederholt einen Codeblock mehrmals, wobei Wertegruppen aus einer Auflistung als Parameter verwendet werden.

  • filterNAME _ - Verwendet einen Codeblock zum Transformieren einer Datenstruktur, indem nicht übereinstimmende Elemente entfernt werden.

  • mapNAME _ - Verwendet einen Codeblock, um jeden Wert in einer Datenstruktur zu transformieren.

  • reduceNAME _ - Verwendet einen Codeblock, um einen neuen Wert oder eine neue Datenstruktur zu erstellen, indem Werte aus einer bereitgestellten Datenstruktur kombiniert werden.

  • withNAME _ - 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.

0
Alex Harvey