2013-10-10 112 views
1

使用木偶实例资源类型时,得到$名字,我需要创建三个文件,与此内容:傀儡,一个数组

/tmp/f1.txt: hello /tmp/f1.txt 
/tmp/f2.txt: hello /tmp/f2.txt 
/tmp/f3.txt: hello /tmp/f3.txt 

我尝试如下:

$path="/tmp/" 
$my_files = ["$path/f1.txt", "$path/f2.txt", "$path/f3.txt"] 
file { $my_files: 
    ensure => file, 
    content => "hello $name\n", 
} 

但是这不起作用,因为$ name是未定义的。

是否有一个变量被实例化为每个'迭代',我可以使用?

PS:我知道,我如下可以创建一个新的资源类型:

define file_with_content { 
    file { $name: 
    ensure => file, 
    content => "hello $name\n", 
    } 
} 
$path="/tmp/" 
$my_files = ["$path/f1.txt", "$path/f2.txt", "$path/f3.txt"] 
file_with_content { $my_files: } 

但这需要创建一个新的资源类型, ,我不能在我的情况下做到这一点(不解释这里)。

问题是,如何修改第一个代码以使其工作,而不需要定义新的资源类型,也不需要执行shell代码?

回答

2

您只能访问namevar定义的类型。对于Puppet的资源,结果是不可预知的 - 例如,$nameFile会给你main或当前stage。另外,你不能传递/使用额外的参数给Puppet的资源,因为它们已经有了自己的一套参数。

标准解决方案已经将File声明包装为定义类型like here,就像您的第一个。也许你可以解释为什么不能使用,所以可以设计一些其他的解决方案?

+0

我不能在这里使用一个定义,因为我已经在一个定义,并且似乎我们不能有嵌套的定义。 –

+0

嵌套类/定义通常是一个坏主意:http://docs.puppetlabs.com/puppet/3/reference/lang_classes.html。他们可以放在外面没有太多的麻烦,然后在另一个班级内引用。什么东西阻止你? – xiankai

+0

你可以在一个类中有一个定义或类。但是你不能在define中定义。它是否正确? –