2013-03-07 84 views
19

我正在寫一些傀儡模塊,並具有在兩個模塊中定義的包,因此得到以下錯誤:Puppet - 測試包是否已經定義?

err: Could not retrieve catalog from remote server: Error 400 on SERVER: Duplicate definition: Package[gnome-session-fallback] is already defined in file /etc/puppet/modules/vnc4server/manifests/init.pp at line 3; cannot redefine at /etc/puppet/modules/vino/manifests/init.pp:7 on node l 

因此,要確保程序包尚未確定,但下面不工作:

if ! defined ('gnome-session-fallback') { 
    package { 'gnome-session-fallback': 
     ensure => installed, 
    } 
} 

任何人都可以提出如何解決這個問題,在更廣泛的範圍內,什麼是「適當」的方法來避免這種模塊中的衝突?

+0

請張貼究竟如何,這並不工作。你是否收到錯誤消息,或者它只是簡單地做了它應該做的事情?還請包括你正在使用哪個版本的Puppet! – ppeterka 2013-03-07 08:35:34

+0

發佈在上面第二行的錯誤消息 - 我正在測試它是否已經在另一個模塊中定義,並且測試似乎沒有檢測到這一點,因此試圖重新定義它,並且代理程序運行失敗(請參閱err)。版本2.7.11 – 2013-03-07 08:44:48

+0

也許今天我有點沉悶:所以你得到'如果!定義......腳本,對吧? – ppeterka 2013-03-07 08:47:04

回答

43

你缺少包[]內定義()。正確的方法做到這一點:

if ! defined(Package['gnome-session-fallback']) { 
    package { 'gnome-session-fallback': 
     ensure => installed, 
    } 
} 
+0

乾杯Gergo,那工作。 – 2013-05-08 22:15:14

+0

謝謝。這就像一個魅力。 – 2013-05-20 07:10:46

+1

請注意,它並不適用於所有情況,因爲defined()是[依賴於解析順序](https://docs.puppet.com/puppet/4.4/reference/function.html#defined),並且存在[bug因爲它打開了很長時間](https://tickets.puppetlabs.com/browse/PUP-1417)。 – 2016-04-13 19:08:52

5

回答我自己關於什麼是「正確」方法的問題:這個問題在https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk討論,jcbollenger提供看起來像「最佳實踐」解決方案的東西 - 多次定義的資源應該移入他們自己的模塊幷包含在他們所依賴的類中。我應用這個並解決了我的問題。

這實際上並沒有回答爲什麼「如果!定義」,然而失敗...

11

做到這一點,最徹底的方法是使用從puppetlabs-stdlibensure_resource功能:

ensure_resource('package', 'gnome-session-fallback', {'ensure' => 'present'})

+5

一個更清潔的函數可以從庫中執行這個操作,就是'ensure_packages(['pkg1','pkg2'])' – Zaroth 2015-07-15 11:43:07

0

一個更清潔的方式(多種方式中)是創建虛擬包資源然後實現它。您可以多次實現相同的虛擬包,而不會出錯。

@package { 'gnome-session-fallback': 
    ensure => installed, 
} 

然後在你需要它:

realize(Package[ 'gnome-session-fallback' ]) 
相關問題