web-dev-qa-db-fra.com

Comment itérer sur un tableau dans Puppet

J'aimerais parcourir un tableau stocké en tant que fait Facter. Pour chaque élément du tableau, créez un nouvel utilisateur système et un répertoire, puis effectuez des appels d'API à AWS.

Exemple de fait: my_env => [shared1,shared2,shared3]

Ma question est de savoir comment parcourir un tableau de marionnettes?

J'ai essayé le Ruby DSL mais je n'ai pas encore réussi à le faire fonctionner ... Merci!

24
PapelPincel

Cela pourrait fonctionner, selon ce que vous faites

// Assuming fact my_env => [ shared1, shared2, shared3 ]

define myResource {
  file { "/var/tmp/$name":
    ensure => directory,
    mode   => 0600,
  }
  user { $name:
    ensure => present,
  }
}
myResource { $my_env: }

Cela fonctionnera si vos exigences sont simples, sinon, Puppet rend cela très difficile à faire. Les développeurs de Puppet ont des préjugés irrationnels contre les itérations basés sur un malentendu sur le fonctionnement des langages déclaratifs.

Si ce type de ressource ne fonctionne pas pour vous, vous pourriez peut-être donner une meilleure idée des propriétés de la ressource que vous essayez de définir à partir de votre tableau?

MODIFIER:

Avec Puppet 4, ce défaut regrettable a finalement été corrigé. Situation actuelle documentée ici . Comme le dit la documentation, vous trouverez un exemple de la solution ci-dessus dans beaucoup de code ancien.

70
itsbruce

A partir de marionnette 3.2, cela est possible en utilisant le "futur" analyseur comme ceci:

$my_env = [ 'shared1', 'shared2', 'shared3', ]
each($my_env) |$value| {
  file { "/var/tmp/$value":
    ensure => directory,
    mode => 0600,
  }
  user { $value:
    ensure -> present,
  }
}

Voir aussi: http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html#background-the-puppet-future-parser

20
ChrisRut

Puppet 3.7 publié plus tôt ce mois-ci a la nouvelle DSL, dont l'une des fonctionnalités est l'itération, vérifiez l'URL suivante https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and- itération

ces nouvelles fonctionnalités peuvent être activées avec le:

Définition de l'analyseur = future dans votre fichier puppet.conf .__ ou ajout du commutateur de ligne de commande --parser = future

j'espère que cela pourra aider

3
Walid

la réponse d’isbruce est probablement la meilleure pour l’instant, mais il existe une proposition de itération qui passe par le processus d’armatures de puppetlabs en vue d’une possible mise en œuvre à l’avenir.

1
Philip Potter

Il existe une fonction "create_resources ()" dans puppet. ce sera très utile en parcourant la liste des itmes

0

Depuis la dernière version de Puppet (6.4.2) et depuis Puppet 4, l'itération sur les tableaux est prise en charge de plusieurs manières:

$my_arr = ['foo', 'bar', 'baz']

Chaque fonction:

$my_arr.each |$v| {
  notice($v)
}

Syntaxe alternative à chaque fonction:

each($my_arr) |$v| {
  notice($v)
}

Pour obtenir l'index:

Passez un deuxième argument à each:

$my_arr.each |$i, $v| {
  notice("Index: $i, value: $v")
}

Comparaison avec Ruby:

Notez que cette grammaire est inspirée de Ruby mais légèrement différente, et il est utile de montrer les deux côte à côte pour éviter toute confusion. Ruby permettrait:

my_arr.each do |v|
  notice(v)
end

Ou:

my_arr.each { |v|
  notice(v)
}

Autres fonctions d'itération:

Notez que Puppet fournit un certain nombre d’autres fonctions d’itération:

  • each - Répète un bloc de code plusieurs fois en utilisant une collection de valeurs pour fournir différents paramètres à chaque fois.

  • slice - Répète un bloc de code plusieurs fois en utilisant comme paramètres des groupes de valeurs d'une collection.

  • filter - Utilise un bloc de code pour transformer une structure de données en supprimant les éléments non correspondants.

  • map - Utilise un bloc de code pour transformer chaque valeur en structure de données.

  • reduce - Utilise un bloc de code pour créer une nouvelle valeur ou structure de données en combinant des valeurs à partir d'une structure de données fournie.

  • with - Évalue un bloc de code une fois, en l'isolant dans sa propre portée locale. Il n’est pas itéré, mais a une ressemblance familiale avec les fonctions d’itération.

Marionnette 3 et antérieure:

Si vous avez hérité de l'ancien code en utilisant encore Puppet 3, la réponse acceptée est toujours correcte:

define my_type {
  notice($name)
}

my_type { $my_arr: }

Notez cependant que cela est généralement considéré comme un mauvais style dans Puppet moderne.

0
Alex Harvey