¿Es posible usar Puppet para garantizar que haya varios archivos en un directorio sin definirlos todos?

8

Tengo un par de cientos de servidores únicos que tienen diferentes archivos de configuración que deben estar presentes en un directorio. Las copias de los archivos residen en el titiritero.

Dentro de una de mis clases tengo un conjunto predeterminado de configuraciones que siempre se envían al nodo, así:

file { "/etc/someprogram/config/000-default":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/000-default",
}

Lo que me gustaría tener es algo como esto:

$filearray = directory listing of /etc/puppet/modules/someprogram/files/$fqdn
with each file as an element into array

$filearray.each(
file { "/etc/someprogram/config/$filename":
  ensure => "present",
  owner => "root",
  group => "root",
  mode =>  0764,
  source => "puppet:///modules/someprogram/files/$fqdn/$filename",
}
)

No estoy muy familiarizado con las marionetas, pero tengo la impresión de que no hay forma de hacerlo.

Freshy
fuente
1
¿Estaría bien con la administración recursiva del directorio en el que residen ( recurse => trueen el filetipo), en lugar de declarar cada archivo como un recurso separado?
Shane Madden

Respuestas:

8

Puedes hacer lo que estás intentando con esto:

file { "/etc/someprogram/config":
    ensure => directory,
    recurse => remote,
    source => "puppet:///modules/someprogram/files/$fqdn"
    #Other options
}

Esto copiará todos los archivos en $ fqdn a / etc / someprogram / config, sobrescribiendo si ya existen.

carne de res
fuente
1
También eche un vistazo a recurse => remotesi el directorio en cuestión tendrá archivos locales que no son empujados por el servidor de marionetas.
Zoredache
Es un buen consejo, no sabía que esto se había agregado a la especificación, editado original para reflejar esto.
bandera de carne
3

Si desea definir varios archivos en un directorio sin recurrir a todo el directorio, puede usar una matriz, como esta:

$myfiles = [ "/my/dir/file1", "/my/dir/file2", ]
file { $myfiles:
    ensure => "present",
    owner  => "root",
    group  => "root",
    mode   =>  0644,
    source => "puppet:///modules/someprogram/$fqdn/$name",
}

Por supuesto, con rutas largas a "/ my / dir" o muchos archivos, sería un poco difícil de manejar, por lo que en ese caso sería mejor crear una definición que incluyera la ruta del directorio, y simplemente pasar la matriz de nombres de archivo a la misma.

Paul Gear
fuente
desafortunadamente esto no funciona cuando tienes un aliasconjunto en el archivo: /
cweiske
1
Parece que tienes un error tipográfico $ myfiles -> $ files
Fabrizio Regini
1
Esto no funcionará. No puedes hacer referencia $nameaquí. Eso solo funciona si es un tipo definido.
falsificador
1

Aquí hay un ejemplo de cómo hago esto:

file {
        [
        '/sys/block/sda/queue/scheduler',
        '/sys/block/sdb/queue/scheduler',
        '/sys/block/sdc/queue/scheduler',
        '/sys/block/sdd/queue/scheduler',
        '/sys/block/sde/queue/scheduler',
        '/sys/block/sdf/queue/scheduler'
        ]:
  ensure  => 'file',
  content => 'deadline',
  group   => '0',
  mode    => '644',
  owner   => '0',
  type    => 'file',
}

En el ejemplo anterior, estoy asignando el planificador de E / S de fecha límite a cada uno de los discos en un servidor determinado a través de Puppet.

Sam Caldwell
fuente