Arrays in Puppet

Arrays in Puppet

Ich frage mich, wie ich das folgende Puppet-Problem lösen kann: Ich möchte mehrere Dateien basierend auf einem Array von Zeichenfolgen erstellen. Die Komplikation besteht darin, dass ich mehrere Verzeichnisse mit den Dateien erstellen möchte:

dir1/
    fileA
    fileB
dir2/
    fileA
    fileB
    fileC

Das Problem besteht darin, dass die Dateiressourcentitel eindeutig sein müssen. Wenn ich also die Dateinamen in einem Array speichere, muss ich das Array auf benutzerdefinierte Weise durchlaufen, um den Dateinamen den Verzeichnisnamen voranstellen zu können:

$file_names = ['fileA', 'fileB']
$file_names_2 = [$file_names, 'fileC']

file {'dir1': ensure => directory }
file {'dir2': ensure => directory }

file { $file_names: path = 'dir1', ensure =>present, }
file { $file_names_2: path = 'dir2', ensure =>present, }

Dies funktioniert nicht, da die Dateiressourcentitel kollidieren. Ich muss also z. B. den Verzeichnisnamen an den Dateititel anhängen. Dies führt jedoch dazu, dass das Dateiarray verkettet und nicht als mehrere Dateien behandelt wird ...

arghh..

file { "${file_names}-dir1": path = 'dir1', ensure =>present, }
file { "${file_names_2}-dir2": path = 'dir1', ensure =>present, }

Wie kann man dieses Problem lösen, ohne die Dateiressource selbst wiederholen zu müssen? Danke

Antwort1

Sie können regsubst()die Funktion verwenden, um ein Array von Zeichenfolgen zu ändern und ein Array zurückzugeben. SiehePuppet-Funktionsreferenz.

$filenames = ['fileA', 'fileB', 'fileC']
$filepaths_dir1 = regsubst($filenames, '^', '/path/to/dir1/')

file {$filepaths_dir1:
    ensure => present,
}

Beachten Sie, dass fileder Ressourcentitel ein vollständig qualifizierter Pfad sein muss oder der vollständige Pfad mit pathParameter angegeben werden muss. Die Angabe path => 'dir1'für die Dateien führt wahrscheinlich nicht zu dem gewünschten Ergebnis.

Antwort2

Es ist eine Weile her, seit ich dies verwendet habe, aber eine Definition sollte das erledigen, was Sie wollen.

define myfiles::config ($directory_name, $file_name) {
  ; add command to create directories if needed

  file { "myfiles/conf.d/$directory_name/$file_name":
    ensure  => present,
    ...
  }

}

$directory_name= <from array>
$file_name= <from array>
; loop the following statement 
myfiles::config { "$directory_name-$file_name":
  directory_name => 'dir1',
  file_name   => 'file',
}

verwandte Informationen