software language fnaf deployment automation puppet

deployment - language - puppet linux



¿Hay iteradores y bucles en el títere? (4)

Cuando defino (?) Un recurso, por ejemplo, para asegurar la estructura del directorio, ¿hay algún bucle disponible?

Como eso:

for X in [app1,app2] do: file { ''/opt/app/'' + X: ensure => directory, owner => ''root'', group => ''root'', mode => ''0644'', }

Tengo decenas de directorios y estoy realmente cansado de declararlo en títere ... Tomaría 15 LOC de bash.

¿Algunas ideas?


A partir de Puppet 4 (y el "futuro analizador" de las últimas versiones de Puppet 3), el Puppet DSL tiene funciones de iteración similares en forma y función a algunos de los métodos de las matrices y hashes de Ruby:

  • each - evalúa un bloque de código (formalmente, un lambda) para cada elemento de una matriz o hash
  • filter : aplica una lambda a cada elemento de una matriz o hash y devuelve una matriz o hash de aquellos para los que la lambda se evaluó como verdadera
  • map : aplica una lambda a cada elemento de una matriz o hash, y devuelve una matriz de los resultados
  • reduce : aplica una lambda a cada elemento de una matriz o hash para generar un solo resultado, que devuelve

No hay for bucle indexado for largo de las líneas de C o Java, pero puede combinar el corte de matriz con cualquiera de las funciones anteriores para lograr la iteración sobre un subconjunto de una estructura de datos. No hay iteración indefinida en la línea de C o Java while loop.

Por supuesto, puede seguir utilizando los enfoques centrados en los recursos que se describen en otras respuestas, y, a veces, uno de ellos es, de hecho, el mejor enfoque disponible. Sin embargo, ya no puedes usar Ruby DSL; se elimina por completo de Puppet 4. Entre las funciones de iteración, la capacidad de definir funciones personalizadas, la ascensión de los enfoques centrados en datos a favor y todas las características estándar históricas de Puppet, Ruby DSL parece no perderse mucho.


A partir de la versión 3.2 hay lambdas

Debe establecer el parser = future en puppet.conf .

$a = [1,2,3] each($a) |$value| { notice $value }

Otra opción para declarar múltiples tipos definidos es create_resources . Pásalo un hash de hashes:

create_resources(file, { ''/tmp/test1'' => { ensure => directory, owner => ''root'', group => ''root'', mode => ''0644'', }, ''/tmp/test2'' => { ensure => directory, owner => ''www-data'', group => ''www-data'', mode => ''0755'', }, })


Las versiones anteriores del lenguaje de títeres no tienen soporte para bucles.

Pero puede usar una matriz en lugar de una cadena simple para el título y declarar varios recursos al mismo tiempo con los mismos parámetros:

$b = ''/opt/app'' file { [ "$b/app1", "$b/app2" ]: ensure => directory, owner => ''root'', group => ''root'', mode => 0644, }

También puede declarar muchos recursos del mismo tipo con params diferentes terminando cada recurso con a ; , que es un poco más compacto que repetir el file y los { s y } s:

file { [ "$b/app1", "$b/app2" ]: ensure => directory, owner => ''root'', group => ''root'', mode => 0755; [ "$b/app1/secret", "$b/app2/secret" ]: ensure => directory, owner => ''root'', group => ''root'', mode => 0700; }

En el caso específico de archivos, puede configurar una fuente y usar la recursión:

file { "/opt/app": source => "puppet:///appsmodule/appsdir", recurse => true; }

(eso requeriría tener como origen una fuente de esa estructura de directorio para títeres)

Puede definir un nuevo tipo de recurso para reutilizar una porción del parámetro varias veces:

define foo { file { "/tmp/app/${title}": ensure => directory, owner => ''root'', mode => 0755; "/tmp/otherapp/${title}": ensure => link, target => "/tmp/app/${title}", require => File["/tmp/app/${title}"] } } foo { ["app1", "app2", "app3", "app4"]: }

Comenzando con Puppet 2.6, hay un DSL de Ruby disponible que tiene toda la funcionalidad de bucle que puede pedir: http://www.puppetlabs.com/blog/ruby-dsl/ (nunca lo he usado, sin embargo). En Puppet 3.2, introdujeron algunos bucles experimentales , sin embargo, esas características pueden cambiar o desaparecer en lanzamientos posteriores.


Sí. "Ruby DSL" podría ayudar, solo use la extensión de archivo ".rb" en lugar de ".pp" en el manifiesto y puede definir "tipo" de títere de la siguiente manera:

define ''myapps::structure'', :applist do @applist.each do |app| file( @name+''/''+app, :ensure => directory, :owner => ''root'', :group => ''root'', :mode => ''0644'') end end

Las clases y los nodos también se pueden definir de manera similar. Sin embargo, tenga en cuenta que esta característica está en deprecated desde la versión 3