0

次のパペットの問題を解決する方法を考えています: 文字列の配列に基づいて複数のファイルを作成したいです。複雑なのは、ファイルを含む複数のディレクトリを作成したいということです:

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

ファイルリソースのタイトルが衝突するため、これは機能しません。したがって、たとえばディレクトリ名をファイルタイトルに追加する必要がありますが、これにより、ファイルの配列が連結され、複数のファイルとして扱われなくなります...

ああ..

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

ファイル リソース自体を繰り返す必要なく、この問題を解決する方法。ありがとう

4

1 に答える 1

0

これを試してみました。これを例として取り上げ、正確なニーズに応じて変更することができます

class common_setup::test {                                                                                                                                                             

   file {'/var/tmp/dir1': ensure => directory }                                                                                                                                         
   file {'/var/tmp/dir2': ensure => directory }                                                                                                                                         

   $file_names = ['fileA', 'fileB']                                                                                                                                                     
   $file_names_2 = unique(flatten([$file_names, 'fileC']))                                                                                                                              
   common_setup::makeDirs { $file_names_2 :}                                                                                                                                            
}                                                                                                                                                                                      

define common_setup::makeDirs {                                                                                                                                                        
   include common_setup::test                                                                                                                                                           

   if ($name in $file_names) and ($name in $file_names_2) {                                                                                                                             
      file { "/var/tmp/dir1/$name" :                                                                                                                                                     
        ensure => present,                                                                                                                                                               
      }                                                                                                                                                                                  

      file {"/var/tmp/dir2/$name" :                                                                                                                                                      
        ensure => present,                                                                                                                                                               
      }                                                                                                                                                                                  
   }                                                                                                                                                                                    
   else {                                                                                                                                                                               
     file {"/var/tmp/dir2/$name" :                                                                                                                                                      
       ensure => present,                                                                                                                                                               
     }                                                                                                                                                                                  
   }                                                                                                                                                                                    
}                 

テストは成功しました:

notice: /Stage[main]/Common_setup::Test/File[/var/tmp/dir2]/ensure: created
notice:   /Stage[main]/Common_setup::Test/Common_setup::Makedirs[fileA]/File[/var/tmp/dir2/fileA]/ensure: created
notice: /Stage[main]/Common_setup::Test/Common_setup::Makedirs[fileC]/File[/var/tmp/dir2/fileC]/ensure: created
notice: /Stage[main]/Common_setup::Test/Common_setup::Makedirs[fileB]/File[/var/tmp/dir2/fileB]/ensure: created
notice: /Stage[main]/Common_setup::Test/File[/var/tmp/dir1]/ensure: created
notice: /Stage[main]/Common_setup::Test/Common_setup::Makedirs[fileB]/File[/var/tmp/dir1/fileB]/ensure: created
notice: /Stage[main]/Common_setup::Test/Common_setup::Makedirs[fileA]/File[/var/tmp/dir1/fileA]/ensure: created
notice: Finished catalog run in 1.97 seconds

そして、ファイルと一緒にディレクトリが作成されます:

ls /var/tmp/dir*/
/var/tmp/dir1/:
fileA  fileB

/var/tmp/dir2/:
fileA  fileB  fileC
于 2012-10-26T13:32:07.893 に答える