2012-06-01 6 views
5

Ich versuche, das folgende Problem mit Puppet zu lösen:Puppet Run Bestellung für optionale Klassen

Ich habe mehrere Knoten. Jeder Knoten enthält eine Sammlung von Klassen. Zum Beispiel gibt es eine mysql Klasse und webserver Klasse. node1 ist nur ein Webserver, node2 ist Webserver + mysql.

Ich möchte angeben, dass, wenn ein Knoten sowohl Webserver als auch mysql hat, die Installation von mysql vor dem Webserver erfolgt.

Ich kann nicht Class[mysql] -> Class[webserver] Abhängigkeit haben, weil die MySQL-Unterstützung optional ist.

Ich habe versucht, Stufen zu verwenden, aber sie scheinen Abhängigkeiten zwischen meinen Klassen einzuführen, also wenn ich z. dies:

Stage[db] -> Stage[web] 
class { 
'webserver': 
    stage => web ; 
'mysql': 
    stage => db ; 
} 

und ich den Webserver Klasse sind in meinem Knoten

node node1 { 
    include webserver 
} 

.. die mysql-Klasse wird auch enthalten! Das ist nicht was ich will.

Wie kann ich die Reihenfolge für optionale Klassen definieren?

Edit: Hier ist die Lösung:

class one { 
    notify{'one':} 
} 

class two { 
    notify{'two':} 
} 

stage { 'pre': } 

Stage['pre'] -> Stage['main'] 

class { 
    one: stage=>pre; 
    # two: stage=>main; #### BROKEN - will introduce dependency even if two is not included! 
} 

# Solution - put the class in the stage only if it is defined 
if defined(Class['two']) { 
    class { 
      two: stage=>main; 
    } 
} 

node default { 
    include one 
} 

Ergebnis:

notice: one 
notice: /Stage[pre]/One/Notify[one]/message: defined 'message' as 'one' 
notice: Finished catalog run in 0.04 seconds 

~

+0

Warum entbindet Webserver Klasse auf Ihrer mySQL-Klasse überhaupt ab? Was ist die tatsächliche Abhängigkeit dort? –

+0

@CodeGnome Ich habe versucht, es sehr einfach zu erklären. Ich habe Stufe entspricht in etwa „bare Maschine“ - „alle die Vernetzung von bis“ - „alle verfügbaren Datenquellen“ - „verschiedene Werkzeuge Puppen Unterstützung installiert“ - „jetzt können wir die eigentliche Arbeit tun“. –

Antwort

5

Wenn Klasse [mysql] optional ist, dann können Sie die Überprüfung versuchen, wenn es vorhanden ist mit der definierten() Funktion:

if defined(Class['mysq'l]) { 
    Class['mysql'] -> Class['webserver'] 
} 

Hier ist ein Beispielcode I verwendet, um dies zu testen:

class optional { 
    notify{'Applied optional':} 
} 

class afterwards { 
    notify{'Applied afterwards':} 
} 

class another_optional { 
    notify{'Applied test2':} 
} 

class testbed { 

    if defined(Class['optional']) { 
      notify{'You should see both notifications':} 
      Class['optional'] -> Class['afterwards'] 
    } 


    if defined(Class['another_optional']) { 
      notify{'You should not see this':} 
      Class['another_optional'] -> Class['afterwards'] 
    } 
} 

node default { 
    include optional 
    include afterwards 
    include testbed 
} 

mit einer 'gelten Puppen test.pp' Nach der Ausführung, erzeugt er diese Ausgabe:

notice: You should see both notifications 
notice: /Stage[main]/Testbed/Notify[You should see both notifications]/message: defined 'message' as 'You should see both notifications' 
notice: Applied optional 
notice: /Stage[main]/Optional/Notify[Applied optional]/message: defined 'message' as 'Applied optional' 
notice: Applied afterwards 
notice: /Stage[main]/Afterwards/Notify[Applied afterwards]/message: defined 'message' as 'Applied afterwards' 
notice: Finished catalog run in 0.06 seconds 

I mit Puppen getestet 2.7 0,1 auf Ubuntu 11.10

+0

Das sieht sehr vielversprechend aus. Lassen Sie mich diesen Ansatz mit Stufen testen - wenn eine Klasse definiert ist, werde ich ihre Bühne aufstellen ... Ich denke, das würde großartig funktionieren! Ich werde die Lösung akzeptieren, sobald ich das getestet habe. –