2012-10-18 128 views
0

我想知道如何解决以下傀儡问题:我想基于字符串数组创建几个文件。复杂的是,我想用这些文件创建多个目录:在木偶阵列

dir1/ 
    fileA 
    fileB 
dir2/ 
    fileA 
    fileB 
    fileC 

问题是文件资源标题必须是唯一的。所以,如果我把文件名中的数组,我需要遍历一个自定义的方式在阵列上能够与目录名与postfix的文件名:

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

这不会工作,因为文件资源标题冲突。所以我需要附加例如该目录名文件标题,但是,这会造成文件的阵列要连接,而不是为多个文件处理...

arghh ..

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

如何不解决这个问题重复文件资源本身的必要性。 谢谢

回答

0

我试过了。

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 
您可以根据您的实际需要

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

测试成功把这个作为一个例子,并修改