
次のパペットの問題をどうやって解決するか考えています: 文字列の配列に基づいて複数のファイルを作成したいのですが、複雑なのは、ファイルを含む複数のディレクトリを作成したいということです:
dir1/
fileA
fileB
dir2/
fileA
fileB
fileC
問題は、ファイル リソースのタイトルが一意でなければならないことです。したがって、ファイル名を配列に保存する場合は、ファイル名の後にディレクトリ名を付けられるように、配列をカスタムの方法で反復処理する必要があります。
$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, }
ファイル リソースのタイトルが競合するため、これは機能しません。そのため、たとえば dir 名をファイル タイトルに追加する必要がありますが、これによりファイルの配列が連結され、複数のファイルとして扱われなくなります...
あぁ。
file { "${file_names}-dir1": path = 'dir1', ensure =>present, }
file { "${file_names_2}-dir2": path = 'dir1', ensure =>present, }
ファイルリソース自体を繰り返すことなくこの問題を解決する方法を教えてください。
答え1
関数を使用しregsubst()
て文字列の配列を変更し、配列を返すことができます。Puppet 関数リファレンス。
$filenames = ['fileA', 'fileB', 'fileC']
$filepaths_dir1 = regsubst($filenames, '^', '/path/to/dir1/')
file {$filepaths_dir1:
ensure => present,
}
file
リソース タイトルは完全修飾パスである必要があるか、またはpath
パラメータを使用して完全パスを指定する必要があることに注意してください。path => 'dir1'
ファイルを指定しても、おそらく目的の動作は実行されません。
答え2
これを使用してからしばらく経ちますが、define を使用すれば必要な処理を実行できるはずです。
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',
}