2012-03-01 21 views
5

Mam ten węzeł.pp i zastanawiam się, jak marionetka zamierza go wykonać.Przepływ wykonywania lalek

node 'agent.puppet.demo' { 
    include ssh 
    include postfix 
    include mysql 
    include apache 
} 

Na węźle agenta, gdy uruchomię to:

$ puppetd -t -d 

Marionetka nie wykonuje ich kolejno znaczenie, to nie wykonuje ssh, potem postfix ...

Czy ktoś wie, dlaczego tak jest? Czy to dlatego, że nazywa się to "językiem deklaratywnym", w którym kolejność egzekucji naprawdę nie ma znaczenia?

Jeśli tak, to mogę w określony sposób zadeklarować, czego chcę, a lalka zorientuje się, jak to zrobić?

Odpowiedz

17

Nota prawna: Jestem jednym z twórców lalek.

Spowoduje to wykonanie go w spójnej, ale nieprzewidywalnej kolejności, z wyjątkiem wyraźnych lub niejawnych zależności w kodzie. Jawne zależności są określane za pomocą metaparametrów subscribe lub require. Niejawne zależności pochodzą z funkcji autorequire , która robi takie rzeczy, jak automatycznie stosuje zasoby plików w rozsądnej kolejności.

Powodem tego nie jest to, że język jest deklaratywny, ale język jest deklaratywny, ponieważ porządek nie ma znaczenia dla większości rzeczy leżących u podstaw problemu.

Na przykład, nie ma większego związku między zarządzaniem ssh a zarządzaniem postfixem dla większości ludzi - można wykonać pracę w dowolnej kolejności, a nawet w tym samym czasie, a wszystko będzie działać tak samo.

To uwalnia nas do ulepszania rzeczy na wiele sposobów, że "wszystko jest w porządku liniowym". Pracujemy, na przykład, nad zbiorami instalacji pakietów, zachowując jednocześnie wyraźne zależności poza pakietami.

Tak więc kolejność wykonania i zależności są zgodne z podstawowym problemem, a my zachowaliśmy tę właściwość, aby móc robić bardziej niesamowite rzeczy.

Cel jest dokładnie taki, jak mówisz na końcu: że deklarujesz to, co chcesz, a my zajmiemy się wszystkimi szczegółami, aby go uzyskać. Z czasem mamy nadzieję, że będziemy znacznie mądrzejsi w kwestii zależności logicznych, więc musisz powiedzieć jeszcze mniej, aby to osiągnąć.

+2

Czy możesz określić, co jest * spójnym, ale nieprzewidywalnym zamówieniem *? Mamy wiele problemów, gdy Puppet 2.6 po prostu ponownie zamawia kroki i z powodu pewnych brakujących zależności się nie powiedzie. To jest niewykonalne. Czy mogę wymusić jakieś przetasowanie, abyśmy mogli przetestować to poprawnie? Słyszałem też, że nowa wersja nadaje mu stałe zamówienie. – lzap

+0

Tak, na przykład, mam pakiet do zainstalowania, który zależy od istniejącego repozytorium w yum.repos.d. Jak mogę wymusić zainstalowanie repozytorium, zanim spróbuje zainstalować pakiet? – Mojo

3

Zastrzeżenie: Jestem jeszcze całkiem nowy lalek :)

Najważniejsze jest, aby myśleć o wszystkim w kategoriach zależności. Dla zależności klasowych lubię używać składni Class ['a'] -> Class ['b']. Powiedzmy, że masz klasę tomcat wymagającą klasy jdk, która pobiera/instaluje Sun jdk z Oracle. W swojej klasie tomcat, można określić to z

klasy [ 'jdk'] -> Class [ 'kocur']

Alternatywnie można zadeklarować klasę z wymagać meta parametru zamiast używać należą.

+0

Sądzę więc, że muszę dodać poniższe linie, aby upewnić się, że zależności są poprawnie zastosowane. Klasa ['apache'] -> Klasa ['mysql'] -> Klasa ['postfiks'] -> Klasa ['ssh'] Czy istnieje inne podejście do realizacji kolejności sekwencyjnej bez konieczności niezależnego współdziałania niezależnych modułów internal Require => Class ... – Maverick

+0

Masz to do tyłu. Klasa ["a"] -> Klasa ["b"] oznacza Klasa b wymaga klasy. Sposób, w jaki lubię to robić, to każda paczka w swoim własnym module. Każdy moduł określa własne zależności na innych klasach. Lubię używać podstawowej klasy uber dla rzeczy takich jak ssh, które są wymagane przez wszystko. Do tego używam etapów uruchamiania, aby zawsze był uruchamiany jako pierwszy. – czervik

+0

@czervik czy chcesz pokazać, w jaki sposób dołączasz swoją klasę uber do takich rzeczy jak ssh, aby była ona dołączana do każdej innej klasy? – memyself