Puppet 无法从环境生产源文件检索信息:///

Puppet 无法从环境生产源文件检索信息:///,puppet,Puppet,我有一个木偶类,定义如下: class etchostfile ( $hostfile ) file { $hostfile : ensure => file, source => "file:///var/www/cobbler/pub/hosts-${hostfile}.txt", path => '/root/hosts', } } 然后我定义了一个节点: node 'hostname.fqdn.com' { class { 'e

我有一个木偶类,定义如下:

class etchostfile
(
  $hostfile
)
  file { $hostfile :
    ensure => file,
    source => "file:///var/www/cobbler/pub/hosts-${hostfile}.txt",
    path => '/root/hosts',
  }
}
然后我定义了一个节点:

node 'hostname.fqdn.com'
{
  class { 'etchostfile' :
    hostfile => foo,
  }
}
我希望它将文件
/var/www/cobbler/pub/hosts foo.txt
安装到
/root/hosts
。但我得到了一个错误:

err: /Stage[main]/Etchostfile/File[foo]: Could not evaluate: Could not
retrieve information from environment production source(s)
file:///var/www/cobbler/pub/hosts-foo.txt
该文件存在且可读,并且指向它的每个目录至少都是r-x

我看到了这个错误应用于不正确的
puppet://
源代码的许多原因,但我使用的是
文件://
源代码。我还尝试在代理和主机上禁用SELinux。不走运


它在我的测试主机上正常工作,所以我认为这是防火墙问题。但是代理可以访问端口8140上的主机,而且我已经有了一个签名证书,而且看起来我至少得到了一个目录,所以我不明白为什么我也不能获得一个文件。

看起来你是在试图从你的傀儡主机获取文件?在这种情况下,您需要使用puppet://资源,而不是文件://资源

另外,请确保主服务器上的文件服务器设置正常工作

[编辑] 从上面链接的文档第一段:

如果文件资源声明的源中包含puppet:URI 属性,节点将从主机的文件服务器检索该文件

另外,还有一些关于文件源属性的文档

如果您试图引用本地文件(代理运行的节点的本地文件),您可以删除协议部分,只需使用:

file { $hostfile :
    ensure => file,
    source => "/var/www/cobbler/pub/hosts-${hostfile}.txt",
    path   => '/root/hosts',
}
如果您试图访问puppet主机上的文件,则需要使用
puppet://
协议(而不是文件)。这将带来一些额外的限制:通常不将puppet文件服务配置为服务主机上的所有文件(这将是一个安全问题),而只服务作为puppet模块一部分的文件

或者,您可以使用没有逻辑的模板而不是文件:

file { $hostfile :
    ensure  => file,
    content => template("my_module/hosts-${hostfile}.txt.erb"),
    path    => '/root/hosts',
}
这是违反直觉的,但使用没有逻辑的模板往往比尝试使用Puppet提供文件服务具有更好的性能