当我在机器(非守护进程)上运行 Puppet 客户端时,我会定期但随机地收到以下错误消息:
错误:无法创建:参数路径失败:文件路径必须完全限定 警告:未在失败的目录上使用缓存 警告:无法实例化配置:参数路径失败:文件路径必须完全限定
它的意思似乎比较清楚——我没有参数中的完全限定路径。然而,它并没有告诉我在哪里我可以找到这个来修复它,或者甚至是哪个参数是错误的:(
(如果我使用调试选项,它会一直有效,所以这似乎是清单缓存的问题......如果能在生产中使用摆脱这个问题那就更好了)
注意:我无法始终如一地实现这一点 :/
答案1
[在研究了一段时间的配置后回答自己的问题]
我设法将其追溯到我编写的一个模块(当然),但这是由于使用了一个没有按照我预期的方式工作的变量造成的。
事情是这样的:
$variable_dir = "/etc/puppet/bar"
class foo {
file { $variable_dir:
ensure => directory
}
}
define some-define() {
# Trimmed for brevity
exec { "some-$name":
# command, creates, timeout etc here
require => File[$variable_dir],
}
}
..这基本上导致了 File[] 使用变量的一些混淆。我现在已经用变量的显式值替换了它们,一切正常,但这有点令人惊讶!我假设我对范围以及何时可以定义/使用变量的理解与 Puppet 有些不一致,所以我将学习很多更好的...
这似乎导致了与在文件字符串上使用非完全限定路径相同的行为,即无法找到变量或无法获取值?无论如何,这很奇怪。
编辑:很有可能变量未在范围内找到,因此为空,并且肯定不是完全合格的路径。但是,这并不能解释为什么这不一致...
答案2
当你测试你的 Puppet 配置时,你可以通过运行
puppetd --test
这将为您提供更详细的输出,并会向您显示失败的位置。如果您真的绝望了,您可以继续--debug
获取更多输出。
如果你想查看你的.pp
文件,你应该搜索
file { "path/to/file":
...
}
其中缺少一个/
(即应改为/path/to/file
)
答案3
您可以将实际路径放入 path 属性,然后它就可以正常工作。这对我来说有效:
$variable_dir = "/etc/puppet/bar"
class foo {
file { 'variable_dir':
path => ${variable_dir},
ensure => directory
}
}
define some-define() {
# Trimmed for brevity
exec { "some-$name":
# command, creates, timeout etc here
require => File['variable_dir'],
}
}
答案4
除非使用path
参数,否则完整路径应该放在键名中。
例如:
file { '/full/path':
ensure => directory,
recurse => true,
}
或者:
file { 'my name':
path => "/full/path",
ensure => directory,
recurse => true,
}
如果您使用变量,请确保它已定义。如果它在不同的类中,请使用标准$class::variable
语法。如需更多信息,请使用-vd
(verbose+debug) 参数运行 puppet。