
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 file
der Ressourcentitel ein vollständig qualifizierter Pfad sein muss oder der vollständige Pfad mit path
Parameter 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',
}