
當我在機器(非守護程式)上運行木偶客戶端時,我經常但隨機地收到以下錯誤訊息:
錯誤:無法建立:參數路徑失敗:檔案路徑必須完全限定 警告:不對失敗的目錄使用緩存 警告:無法實例化配置:參數路徑失敗:檔案路徑必須完全限定
這意味著什麼似乎很清楚——我在參數中沒有完全限定的路徑。然而,它並沒有告訴我在哪裡我可以找到這個來修復它,甚至哪個參數是錯誤的:(
(如果我使用調試選項,它始終有效,所以這似乎是清單快取的問題......在生產使用中擺脫它會很好,仍然)
注意:我無法始終如一地做到這一點 :/
答案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
當您測試您的木偶配置時,您可以透過運行來完成
puppetd --test
這將為您提供更詳細的輸出,並且應該向您顯示失敗的位置。如果你真的很絕望,你可以繼續--debug
獲得更多的輸出。
如果您想查看您的.pp
文件,您應該搜索
file { "path/to/file":
...
}
其中缺少一個/
(即應該/path/to/file
改為讀取)
答案3
您可以將實際路徑放入路徑屬性中,然後就可以了。這對我有用:
$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。