如何修复 Puppet 完全限定参数路径错误?

如何修复 Puppet 完全限定参数路径错误?

当我在机器(非守护进程)上运行 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。

相关内容