
儘管我知道昨天遇到的問題的直接解決方案(感謝IRC #puppet 的人們),但我仍然不明白它是如何解決問題的,或者更確切地說,在這個特定的類別和定義之間的根本區別是什麼設想:
原來的定義是不正確的:
define srv($name,$enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){
exec {"sleep 5": path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}
service{"$name":
enable=>$enable,
ensure=>$ensure,
provider=>$provider,
hasstatus=>$hasstatus,
hasrestart=>$hasrestart,
}
}
錯誤:無法從遠端伺服器檢索目錄:伺服器上出現錯誤 400:重複定義:Exec[sleep 5] 已在檔案 /etc/puppet/modules/common/manifests/defines/srv.pp 第 4 行中定義;無法在節點testing.abc.def.com 上的 /etc/puppet/modules/common/manifests/defines/srv.pp:4 處重新定義
正確的定義:
define srv($enable="true",$ensure="running",$provider="runit",$hasstatus="true",$hasrestart="true"){
exec {"sleep 5 for $name": command=>"sleep 5", path=>"/usr/bin:/usr/sbin:/bin:/sbin", before=>Service["$name"],}
service{"$name":
enable=>$enable,
ensure=>$ensure,
provider=>$provider,
hasstatus=>$hasstatus,
hasrestart=>$hasrestart,
}
}
那麼,為什麼第一種情況會出現錯誤呢?我如何複製定義,或者換句話說,如果有一個模組使用此定義,那麼第一個定義會起作用?也許文件中的傀儡術語讓我感到困惑,但是編寫了大量(工作)模組並且不理解這對我來說聽起來很危險,希望我能得到一些明確的答案。
答案1
Puppet 中的資源必須是唯一的,即必須有唯一的名稱。
在所描述的情況下,您的定義中包含資源Exec["sleep 5"]
,並且每次調用 srv
(基本上與包含參數化類別相同)時,該資源Exec["sleep 5"]
也將包含在內,因此解析器會找到兩個或多個具有相同名稱的資源。
透過將$name
定義附加到資源名稱中Exec
,可以使其變得唯一。嗯,至少最有可能的唯一的,因為當您的清單中的其他位置有另一個具有相同名稱 ( Exec["sleep 5 for foo"
) 的資源時,您將再次遇到此錯誤。