2013-03-07 9 views
19

Piszę niektóre moduły Lalki i posiada pakiet zdefiniowany w dwóch modułach stąd pojawia się następujący błąd:Lalka - sprawdź, czy pakiet jest już zdefiniowany?

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 

Dlatego chcemy zapewnić, że pakiet nie został jeszcze zdefiniowany, ale następujące nie działa:

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

Czy ktoś może zaproponować, jak rozwiązać ten problem, i na szerszą skalę, jakie jest "właściwe" podejście, aby uniknąć takich konfliktów w modułach?

+0

proszę pisać dokładnie, jak to nie zadziała. Czy otrzymujesz komunikat o błędzie, czy po prostu simplz nie robi tego, co powinien? Proszę również podać, której wersji Puppet używasz! – ppeterka

+0

Komunikat o błędzie zamieszczony w drugim wierszu powyżej - testuję, czy jest on już zdefiniowany w innym module i test nie wydaje się wykrywać tego, a zatem próbuje go przedefiniować, a uruchomienie agenta nie powiedzie się (zobacz err). Wersja 2.7.11 –

+0

Może jestem trochę nudny dzisiaj: więc otrzymasz błąd z 'if! zdefiniowany ... 'skrypt, prawda? – ppeterka

Odpowiedz

43

Brakuje Package [] wewnątrz defined(). Poprawny sposób to zrobić:

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

Pozdrawiam Gergo, to działa. –

+0

Dziękuję za tonę. To działa jak urok. –

+1

Należy zauważyć, że to nie działa we wszystkich przypadkach, ponieważ defined() jest [zależne od kolejności analiz] (https://docs.puppet.com/puppet/4.4/reference/function.html#defined) i jest [błąd ponieważ był długo otwarty] (https://tickets.puppetlabs.com/browse/PUP-1417). –

5

Aby odpowiedzieć na własne pytanie dotyczące podejścia "właściwego": Ten problem omówiono pod numerem https://groups.google.com/forum/?fromgroups=#!topic/puppet-users/julAujaVsVk, a jcbollenger oferuje rozwiązanie przypominające "najlepszą praktykę" - zasoby zdefiniowane wielokrotnie powinny zostać przeniesione do własnych moduł i włączone do klas, od których zależą. Zastosowałem to i rozwiązałem mój problem.

To faktycznie nie odpowiedzieć dlaczego "czy! Defined" nie powiedzie się jednak ...

11

najczystszy sposób, aby to zrobić jest użycie funkcji ensure_resource z puppetlabs-stdlib:

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

+5

jeszcze czystszą funkcją do wykonania tej czynności ze wspomnianej biblioteki jest 'ensure_packages (['pkg1', 'pkg2'])' – Zaroth

0

One czystszy sposób (pośród wielu sposobów) jest stworzenie wirtualny pakiet zasobów, a następnie zdaj sobie z tego sprawę. Możesz zrealizować ten sam wirtualny pakiet wiele razy bez błędów.

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

I wtedy, gdy jest potrzebny:

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