我有一个像这样定义的木偶类:
ifelse(x %in% c("Sat", "Sun"), "Weekend", "Weekday")
# [1] "Weekday" "Weekday" "Weekday" "Weekday" "Weekday" "Weekend" "Weekend"
然后我定义了一个节点:
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
该文件存在,可读,并且每个通向它的目录至少为r-x。
我看到了这个错误适用于不正确的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
来源的一些原因,但我使用的是puppet:///
来源。我也尝试在代理和主服务器上禁用SELinux。没有运气。
它在我的测试主机上运行正常,所以我认为这是一个防火墙问题。但是代理可以通过端口8140到达主服务器,并且我已经有了签名证书,看来我至少得到了一个目录,所以我不明白为什么我也无法获取文件。
答案 0 :(得分:3)
看起来你正试图从木偶大师那里获取文件?在这种情况下,您需要使用puppet:// resource而不是file:// resource。
另外,请确保您在master上的文件服务器设置正常工作。
https://docs.puppetlabs.com/guides/file_serving.html#file-server-configuration
[编辑] 从上面链接的doc第一段开始:
如果文件资源声明在其源中包含puppet:URI 属性,节点将从主文件服务器
中检索该文件
另外,还有一些doc讨论文件源属性 https://docs.puppetlabs.com/references/latest/type.html#file-attribute-source
答案 1 :(得分:0)
如果您尝试引用本地文件(运行代理程序的节点的本地文件),则可以删除协议部分并使用:
file { $hostfile :
ensure => file,
source => "/var/www/cobbler/pub/hosts-${hostfile}.txt",
path => '/root/hosts',
}
如果您尝试访问puppet master上的文件,则需要使用puppet:///
协议(而不是文件)。这将带来一些额外的限制:通常你不配置puppet文件服务来提供master上的所有文件(这将是一个安全问题),而只是提供作为puppet模块一部分的文件。
或者您可以使用没有逻辑的模板而不是文件:
file { $hostfile :
ensure => file,
content => template("my_module/hosts-${hostfile}.txt.erb"),
path => '/root/hosts',
}
反直觉,但使用没有逻辑的模板往往会有更好的性能,试图使用Puppet进行文件服务。