Arrays 木偶阵

Arrays 木偶阵,arrays,file,resources,puppet,Arrays,File,Resources,Puppet,我想知道如何解决以下puppet问题:我想基于字符串数组创建几个文件。复杂的是,我想用以下文件创建多个目录: dir1/ fileA fileB dir2/ fileA fileB fileC 问题是文件资源标题必须是唯一的。因此,如果我将文件名保留在一个数组中,我需要以自定义方式迭代该数组,以便能够用目录名对文件名进行后缀: $file_names = ['fileA', 'fileB'] $file_names_2 = [$file_names, '

我想知道如何解决以下puppet问题:我想基于字符串数组创建几个文件。复杂的是,我想用以下文件创建多个目录:

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, }
如何解决这个问题而不必重复文件资源本身。
谢谢,我试过了。您可以以此为例,根据您的具体需要进行修改

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