Cómo iterar sobre una matriz en Puppet


Me gustaría iterar sobre una matriz que se almacena como un hecho Facter, y para cada elemento de la matriz crear un nuevo usuario del sistema y un directorio, y finalmente hacer llamadas API a AWS.

Ejemplo del hecho: my_env => [shared1,shared2,shared3]

Mi pregunta es ¿cómo iterar sobre un array en puppet ?

He probado el DSL Ruby pero aún no he tenido éxito para que funcione... ¡Gracias!

Author: PapelPincel, 2012-10-18

5 answers

Esto podría funcionar, dependiendo de lo que estés haciendo

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

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

Funcionará si sus requisitos son simples, si no, Puppet hace que esto sea muy difícil de hacer. Los desarrolladores de Puppet tienen prejuicios irracionales contra la iteración basados en un malentendido sobre cómo funcionan los lenguajes declarativos.

Si este tipo de recurso no funciona para usted, tal vez podría dar una mejor idea de qué propiedades de recurso está tratando de establecer desde su matriz?

EDITAR:

Con Puppet 4, este lamentable defecto fue finalmente arreglado. Situación actual documentada aquí. Como dice la documentación, encontrará un ejemplo de la solución anterior en un montón de código antiguo.

 70
Author: itsbruce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-22 13:47:17

A partir de puppet 3.2 esto es posible usando el analizador "future" de la siguiente manera:

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

Véase también: http://docs.puppetlabs.com/puppet/3/reference/lang_experimental_3_2.html#background-the-puppet-future-parser

 20
Author: ChrisRut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-18 18:58:28

Puppet 3.7 lanzado a principios de este mes tiene el nuevo DSL, que una característica es la iteración, compruebe la siguiente URL https://docs.puppetlabs.com/puppet/latest/reference/experiments_lambdas.html#enabling-lambdas-and-iteration

Estas nuevas características se pueden habilitar con:

Estableciendo parser = future en su puppet.archivo conf o añadiendo el conmutador de línea de comandos par parser = future

Espero que ayude

 3
Author: Walid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-18 20:27:34

La respuesta de Itsbruce es probablemente la mejor por ahora, pero hay una propuesta de iteración pasando por el proceso de armaduras de puppetlabs para una posible implementación en el futuro.

 1
Author: Philip Potter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 06:59:58

Hay una función "create_resources()" en puppet. eso será muy útil al iterar sobre la lista de itmes

 0
Author: vinodh kumar Basavani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-19 04:49:35