为什么我定义的资源拒绝复制数组中列出的源文件?

我试图从modules/apt_config/files使用一个已定义的资源和要安装的一组文件来填充一些configuration文件。

 define aptfile($file) { file { $file: source => "puppet:///modules/${module_name}/etc/apt/${file}", } } aptfile{ [ 'apt.conf', 'sources.list', ]: } 

根据这个错误报告 , $ module_name应该是可用的。 那部分不是让我悲伤。 什么似乎被打破是这样的, $文件没有被填充时,我打电话给资源; 相反,我得到以下错误:

必须将文件传递给节点vagrant.home上的/tmp/vagrant-puppet/modules-0/apt_config/manifests/init.pp:10上的Apt_config :: Aptfile [apt.conf]

请注意,第10行是包含define aptfile定义的行。

语法有点神秘。 所以,以防万一我反向指定文件path,我也试过这个:

 define aptfile($file) { file { "/etc/apt/${file}": source => "puppet:///modules/${module_name}/${file}", } } aptfile{ [ 'apt.conf', 'sources.list', ]: } 

具有相同的结果。 我知道我可以单独指定每个文件,但是我需要做些什么来使这个循环正常工作?

$文件是一个属性。 如果要使用定义实例的名称(声明aptfile时使用的数组中的项目之一),则使用$ name。

所以,如果你保持原样,你会做这样的事情:

 aptfile {'somename': file => ['apt.conf', 'sources.list'], } 

不过,你可能要找的是这样的:

 define aptfile( $base_path = '/etc/apt', ) { file {"${base_path}/${name}": source => "puppet:///modules/${module_name}/files/${name}", } } 

请注意,$ name在声明时源自资源的标题/名称(定义本质上是一种自定义资源)。 适用于所有资源。 当你在声明一个资源文件{['f1.txt','f2.txt']:}}时使用一个数组,你只是压缩多个文件资源的声明… file {'f1.txt':},file {'f2.txt':}。 体内的$ name是正在分析/处理的资源声明的名称。

然后像你这样称呼它:

 aptfile {['apt.conf', 'sources.list']: } 

我发现自己只是使用content => template('modulename / somefile.erb')的模板,即使我不需要模板function只是因为path更加理智(我想象的是额外的额外开销)。 期待来源=>采用相同的更合理的path使用。

标记