Est-il possible d'utiliser Puppet pour s'assurer que plusieurs fichiers dans un répertoire sont présents sans les définir tous?

8

J'ai quelques centaines de serveurs uniques qui ont différents fichiers de configuration qui doivent être présents dans un répertoire. Des copies des fichiers résident sur le maître de marionnettes.

Dans l'une de mes classes, j'ai un ensemble de configurations par défaut qui sont toujours poussées vers le nœud, comme ceci:

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

Ce que j'aimerais avoir, c'est quelque chose comme ceci:

$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",
}
)

Je ne connais pas très bien la marionnette mais j'ai l'impression qu'il n'y a pas moyen de le faire.

Freshy
la source
1
Seriez-vous d'accord avec la gestion récursive du répertoire dans lequel ils résident ( recurse => truesur le filetype), au lieu de déclarer chaque fichier comme une ressource distincte?
Shane Madden

Réponses:

8

Vous pouvez faire ce que vous essayez avec ceci:

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

Cela copiera tous les fichiers de $ fqdn dans / etc / someprogram / config, écrasant s'ils existent déjà.

drapeau de viande
la source
1
Vérifiez également recurse => remotesi le répertoire en question aura des fichiers locaux qui ne sont pas poussés par le serveur de marionnettes.
Zoredache
C'est une bonne astuce, je ne savais pas que cela avait été ajouté à la spécification, l'original modifié pour refléter cela.
meatflag
3

Si vous souhaitez définir plusieurs fichiers dans un répertoire sans récurer tout le répertoire, vous pouvez utiliser un tableau - comme ceci:

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

Bien sûr, avec de longs chemins vers "/ mon / dir" ou beaucoup de fichiers, cela deviendrait un peu lourd, donc dans ce cas, vous feriez mieux de créer une définition qui inclurait le chemin du répertoire, et de simplement passer le tableau de les noms de fichiers.

Paul Gear
la source
cela ne fonctionne malheureusement pas lorsque vous avez un aliasensemble sur le fichier: /
cweiske
1
On dirait que vous avez une faute de frappe $ myfiles -> $ files
Fabrizio Regini
1
Cela ne fonctionnera pas. Vous ne pouvez pas faire référence $nameici. Cela ne fonctionne que si c'est un type défini.
faker
1

Voici un exemple de la façon dont je fais cela:

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',
}

Dans l'exemple ci-dessus, j'affecte le planificateur d'E / S d'échéance à chacun des disques d'un serveur donné via Puppet.

Sam Caldwell
la source