Ist es möglich, mit Puppet sicherzustellen, dass mehrere Dateien in einem Verzeichnis vorhanden sind, ohne alle zu definieren?

8

Ich habe ein paar hundert einmalige Server mit unterschiedlichen Konfigurationsdateien, die in einem Verzeichnis vorhanden sein müssen. Kopien der Dateien befinden sich auf dem Puppenmeister.

Innerhalb einer meiner Klassen habe ich einen Standardsatz von Konfigurationen, die immer auf den Knoten übertragen werden, wie folgt:

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

Was ich gerne hätte, ist so etwas:

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

Ich bin mit Puppen nicht sehr vertraut, aber ich habe den Eindruck, dass es keinen Weg gibt, dies zu tun.

Frisch
quelle
1
Wäre es in Ordnung, das Verzeichnis, in dem sich diese befinden ( recurse => truefür den fileTyp), rekursiv zu verwalten , anstatt jede Datei als separate Ressource zu deklarieren?
Shane Madden

Antworten:

8

Sie können damit machen, was Sie versuchen:

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

Dadurch werden alle Dateien in $ fqdn nach / etc / someprogram / config kopiert und überschrieben, falls sie bereits vorhanden sind.

Fleischflagge
quelle
1
Überprüfen Sie auch, recurse => remoteob das betreffende Verzeichnis lokale Dateien enthält, die nicht vom Puppet-Server übertragen werden.
Zoredache
Das ist ein guter Tipp. Ich wusste nicht, dass dies der Spezifikation hinzugefügt wurde. Das Original wurde bearbeitet, um dies widerzuspiegeln.
Fleischflagge
3

Wenn Sie mehrere Dateien in einem Verzeichnis definieren möchten, ohne das gesamte Verzeichnis zu rekursieren, können Sie ein Array wie folgt verwenden:

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

Bei langen Pfaden zu "/ my / dir" oder vielen Dateien würde es natürlich etwas unhandlich werden. In diesem Fall ist es besser, eine Definition zu erstellen, die den Verzeichnispfad enthält, und einfach das Array von zu übergeben Dateinamen dazu.

Paul Gear
quelle
Dies funktioniert leider nicht, wenn Sie einen aliasSatz in der Datei haben: /
cweiske
1
Sieht aus wie Sie einen Tippfehler $ myfiles -> $ files
Fabrizio Regini
1
Dies wird nicht funktionieren. Sie können hier nicht referenzieren $name. Das funktioniert nur, wenn es sich um einen definierten Typ handelt.
Fälscher
1

Hier ist ein Beispiel, wie ich das mache:

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

Im obigen Beispiel weise ich über Puppet jedem Datenträger auf einem bestimmten Server den Deadline-E / A-Scheduler zu.

Sam Caldwell
quelle