Puppet 中的類別和定義

Puppet 中的類別和定義

儘管我知道昨天遇到的問題的直接解決方案(感謝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") 的資源時,您將再次遇到此錯誤。

相關內容