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

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

modules/apt_config/files我正在尝试使用定义的资源和要安装的文件数组来填充一些配置文件。

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

根据此错误报告$模块名称应该可用。这部分并没有让我感到悲伤。似乎有问题的是$文件当我调用资源时没有被填充;相反,我收到以下错误:

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

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

语法有点晦涩难懂。因此,为了以防万一我指定了相反的文件路径,我还尝试了以下方法:

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

结果相同。我知道我可以单独指定每个文件,但我需要做什么才能使此循环正常工作?

答案1

$file 是一个属性。如果您想使用定义实例的名称(声明 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 来自资源的标题/名称(define 本质上是一种自定义资源)。这适用于所有资源。声明资源文件 {['f1.txt', 'f2.txt']: } 时使用数组,您只是在压缩多个文件资源的声明...文件 {'f1.txt': }, 文件 {'f2.txt': }。主体内的 $name 是正在解析/处理时正在使用的资源声明的名称。

然后像你刚才那样调用它:

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

我发现自己只是使用 content => template('modulename/somefile.erb') 模板,即使我不需要模板功能,因为路径更合理(我认为额外开销最小)。期待 source => 采用相同更合理的路径用法。

标记

相关内容