2013-03-07 7 views
19

Bazı kukla modülleri yazma ve sahip iki modülde tanımlanan bir paket dolayısıyla aşağıdaki hatayı alıyorum ediyorum:Kukla - önceden tanımlanmış bir paket olup olmadığını test edin?

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 

Dolayısıyla paket zaten tanımlanmış edilmediğini sağlamak istiyoruz ama çalışmıyor şu:

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

Bunu nasıl düzeltebileceğimizi öneren herkes ve daha geniş ölçekte, bu modüllerdeki çatışmaların önlenmesi için "uygun" yaklaşım nedir?

+0

Bu işe yaramazsa tam olarak nasıl gönderin. Bir hata mesajı alıyor musunuz, yoksa sadece simplz olması gereken şeyi yapmıyor mu? Ayrıca hangi kukla kullandığınızı lütfen ekleyin! – ppeterka

+0

Yukarıdaki ikinci satırda gönderilen hata mesajı - Başka bir modülde zaten tanımlanmış olup olmadığını test ediyorum ve test bunu algılamıyor gibi görünüyor ve dolayısıyla yeniden tanımlama girişimleri başarısız oluyor ve aracı çalıştırılamıyor (bkz. Err). Sürüm 2.7.11 –

+0

Belki bugün biraz sıkıcıyım: bu yüzden hatayı 'if! tanımlı ... 'betik, değil mi? – ppeterka

cevap

43

Sen eksik Paketi [] tanımlanan iç(). Doğru şekilde yapmak: Bir oluşturmak için

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

+0

Şerefe Gergo, işe yarıyor. –

+0

Bir ton teşekkürler. Bu bir çekicilik gibi çalışır. –

+1

Tüm durumlarda çalışmadığına dikkat edin çünkü tanımlı() [ayrıştırma sırasına bağlı] (https://docs.puppet.com/puppet/4.4/reference/function.html#defined) ve bir [hata var. Bunun için uzun bir süre açıldı] (https://tickets.puppetlabs.com/browse/PUP-1417). –

5

"Uygun" yaklaşımın ne olduğuyla ilgili kendi sorumu yanıtlamak için: Bu sorun, https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk numaralı telefondan ele alındı ​​ve jcbollenger, "en iyi uygulama" çözümüne benzeyen bir teklif sunuyor - birden çok kez tanımlanmış kaynaklar kendi başlarına taşınmalıdır modül ve bağlı oldukları sınıflara dahil edilir. Bunu uyguladı ve problemimi çözdüm.

"tanımlı! Eğer" Ancak başarısız Bu yüzden aslında cevap vermez ...

11

Bunu yapmanın en temiz yolu puppetlabs-stdlib den ensure_resource fonksiyonunu kullanmaktır sanal paket kaynağı ve daha sonra bunu gerçekleştirin. Aynı sanal paketi hata olmadan birçok kez gerçekleştirebilirsiniz.

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

Sonra da onu gereken yere:

realize(Package[ 'gnome-session-fallback' ]) 
+5

, bu kitaplıktan bunu yapmak için daha da temiz bir işlevdir 'warranty_packages (['pkg1', 'pkg2'])' – Zaroth

0

Bir temizleyici yolu (çoklu yollar arasından) olduğu:

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