¿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.


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.


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.