2016-04-05 11 views
0

Ich habe an einem kleinen Modul gearbeitet, das ein vorgefertigtes Kibana Puppet Modul verwendet (EDIT: 'lesaux/kibana4'), und enthält auch eine einfache exec, die das Shield Plugin für installiert Kibana. (Hinweis: In diesem Beispiel installiere ich auch java8 von einem anderen Modul, das in meinem Manifest enthalten ist)Marionette - Abhängigkeiten funktionieren nicht

Mein Problem ist, dass die exec weiterläuft, bevor kibana tatsächlich installiert wird. Ich möchte, dass kibana zuerst installiert wird und dann die exec. Also fügte ich ein 'require' hinzu, wie unten gezeigt, und fügte auch eine Kette hinzu, um sicherzustellen, dass der exec nachher passierte.

class test_kibana { 

    class { '::kibana4': 
    package_ensure    => '4.4.0-linux-x64', 
    package_provider   => 'archive', 
    config      => { 
     'server.host'   => 'localhost', 
     'elasticsearch.url'  => 'http://localhost:9200', 
     'elasticsearch.username' => 'testUserName', 
     'elasticsearch.password' => 'testPassword', 
     'shield.encryptionKey' => 'testencryptionkey', 
    } 
    } -> 

    exec { 'install kibana shield plugin': 
    require     => Class['::kibana4'], 
    path      => '/opt/kibana4/bin', 
    command     => 'kibana plugin --install kibana/shield/latest', 
    } 

} 

Die Anforderung und die Kette scheint nicht zu funktionieren. Daher weiß der Exec nicht, was der Befehl bedeutet, und es schlägt fehl, weil Kibana noch nicht existiert.

Warum installiert Marionette diese nicht in der von mir benötigten Reihenfolge?

Hier ist meine Ausgabe:

==> nat: Notice: Scope(Archive::Download[kibana-4.4.0-linux-x64.tar.gz]): No checksum for this archive 
==> nat: Notice: Compiled catalog for nat.test.com in environment production in 2.58 seconds 
==> nat: Notice: /Stage[main]/Apt/File[preferences]/ensure: created 
==> nat: Notice: /Stage[main]/test_java8/File[/tmp/java.preseed]/ensure: defined content as '{md5}fa13124e9e801dd42c91fa94ef7f1c1e' 
==> nat: Notice: /Stage[main]/test_java8/File[/tmp/jce]/ensure: created 
==> nat: Notice: /Stage[main]/test_java8/File[/tmp/jce/local_policy.jar]/ensure: defined content as '{md5}dabfcb23d7bf9bf5a201c3f6ea9bfb2c' 
==> nat: Notice: /Stage[main]/test_java8/File[/tmp/jce/US_export_policy.jar]/ensure: defined content as '{md5}ef6e8eae7d1876d7f05d765d2c2e0529' 
==> nat: Notice: /Stage[main]/Kibana4::User/Group[kibana4]/ensure: created 
==> nat: Notice: /Stage[main]/Kibana4::User/User[kibana4]/ensure: created 
==> nat: Error: Could not find command 'kibana' 
==> nat: Error: /Stage[main]/Smart_monitoring_kibana/Exec[install kibana shield plugin]/returns: change from notrun to 0 failed: Could not find command 'kibana' 
==> nat: Notice: /Stage[main]/Apt/Apt::Setting[conf-update-stamp]/File[/etc/apt/apt.conf.d/15update-stamp]/content: content changed '{md5}b9de0ac9e2c9854b1bb213e362dc4e41' to '{md5}0962d70c4ec78bbfa6f3544ae0c41974' 
==> nat: Notice: /Stage[main]/test_java8/Apt::Ppa[ppa:webupd8team/java]/Exec[add-apt-repository-ppa:webupd8team/java]/returns: executed successfully 
==> nat: Notice: /Stage[main]/Apt::Update/Exec[apt_update]: Triggered 'refresh' from 1 events 
==> nat: Notice: /Stage[main]/test_java8/Exec[apt-update]/returns: executed successfully 
==> nat: Notice: /Stage[main]/test_java8/Package[oracle-java8-installer]/ensure: created 
==> nat: Notice: /Stage[main]/test_java8/File[/etc/profile.d/set_java_home.sh]/ensure: defined content as '{md5}717258a243a8addc2506097f12cd611f' 
==> nat: Notice: /Stage[main]/test_java8/Exec[install-jce]/returns: executed successfully 
==> nat: Notice: /Stage[main]/Kibana4::Install/Archive[kibana-4.4.0-linux-x64]/Archive::Download[kibana-4.4.0-linux-x64.tar.gz]/Exec[download archive kibana-4.4.0-linux-x64.tar.gz and check sum]/returns: executed successfully 
==> nat: Notice: /Stage[main]/Kibana4::Install/Archive[kibana-4.4.0-linux-x64]/Archive::Extract[kibana-4.4.0-linux-x64]/Exec[kibana-4.4.0-linux-x64 unpack]/returns: executed successfully 
==> nat: Notice: /Stage[main]/Kibana4::Install/Exec[chown_kibana_directory]: Triggered 'refresh' from 1 events 
==> nat: Notice: /Stage[main]/Kibana4::Install/File[/opt/kibana4]/ensure: created 
==> nat: Notice: /Stage[main]/Kibana4::Config/File[kibana-config-file]/content: content changed '{md5}dacdab7bddd2bcede2cc7cd8c6948307' to '{md5}7c24ae699bfbfbb5314ce01bdcdc3b6d' 
==> nat: Notice: /Stage[main]/Kibana4::Config/File[kibana-config-file]/mode: mode changed '0644' to '0755' 
==> nat: Notice: /Stage[main]/Kibana4::Config/File[/var/run/kibana.pid]/ensure: created 
==> nat: Notice: /Stage[main]/Kibana4::Config/File[/var/log/kibana]/ensure: created 
==> nat: Notice: /Stage[main]/Kibana4::Service/File[/etc/init.d/kibana4]/ensure: defined content as '{md5}0c5c726cdabb5355276abc6394a868a7' 
==> nat: Notice: /Stage[main]/Kibana4::Service/File[/etc/default/kibana4]/ensure: defined content as '{md5}57b82a4af4f8872bfbc6488b0a85c652' 
==> nat: Notice: /Stage[main]/Kibana4::Service/Service[kibana4]/ensure: ensure changed 'stopped' to 'running' 
==> nat: Notice: Applied catalog in 644.11 seconds 

EDIT: Ich habe entdeckt, dass das lesaux/Kibana Modul vor kurzem aktualisiert wurde, und jetzt können Sie damit Plugins als Teil der Installation installieren. (Daher muss ich diese Exec-Funktion nicht mehr verwenden. Problem behoben!)

+0

ist es Lesaux-Kibana4 Sie verwenden? –

+0

Ja seine lesaux-kibana4 – Xenidious

Antwort

3

Sie haben ein containment Problem.

Klassen dienen als Container für alle Ressourcen, die sie direkt deklarieren. Wenn Sie eine Beziehung mit einer Klasse deklarieren, bedeutet dies die gleiche Beziehung mit all diesen Ressourcen.

Klassen sind keine Ressourcen, aber, und Klassen nicht automatisch als Container für die anderen Klassen dienen sie erklären. Dafür gibt es sehr gute Gründe, aber hier sind sie nicht wirklich relevant. Das Ergebnis für Sie ist, dass Sie keine Beziehung zwischen Exec und den Klassen kibana4::install, kibana4::exec und kibana4::service haben. Puppet ist nicht gezwungen, die Exec nach diesen drei zu synchronisieren.

Es ist üblich (aber keineswegs universell), dass eine Klasse einige oder alle anderen deklarierten Klassen enthalten soll. Dafür gibt es die contain Funktion/Anweisung (seit Puppet 3.4). Wenn Sie

contain 'kibana4::install' 
contain 'kibana4::exec' 
contain 'kibana4::service' 

am Ende hinzufügen des Körpers der Klasse Kibana4, dann werden Sie die Eindämmung Semantik erhalten Sie suchen.

Wenn Sie mit Puppet älter als v3.4 stecken (aktuell ist 4.4; das letzte in der v3-Struktur ist v3.8) dann gibt es andere Möglichkeiten, um die richtige Eindämmung zu gewährleisten, die Sie im manuellen Abschnitt I lesen können verlinkt.

+0

Danke für die Antwort. Um sicherzustellen, dass ich dies richtig implementiere: die Zeilen enthalten - sollten sie am Ende meiner Klasse {':: kibana4':} Block sein? Ich habe sie direkt nach dem Schließen meiner Config-Sektion dieser Klasse platziert - aber wenn ich die Vagrant-Box mit diesem Manifest hochfahre, bekomme ich einen 'Syntax Error at' contain '. – Xenidious

+0

@CameronMcAuley, nein, sie gehen am Ende der * Definition * der Klasse kibana4: 'Klasse kibana4 (...) {... enthält 'kibana4 :: service'}'. Das heißt, in demselben Gültigkeitsbereich, in dem Sie die internen Klassen 'kibana4 :: service', * etc * deklarieren.Ich empfehle, dass Sie den Handbuchabschnitt lesen, den ich verlinkt habe, da er viel mehr Details über das Problem und die Lösung bietet. –

+0

Danke für das Handbuch, das du verlinkt hast - das war mir vorher nicht bewusst, und das wird mir in Zukunft wirklich helfen, da diese Art von Problemen ziemlich viel für mich auftauchen. Ich habe versucht, die enthält (kibana4 :: install, kibana4 :: exec, kibana4 :: service) an der Stelle, die Sie vorschlagen, aber jetzt, wenn ich die Vagrant-Box booten die Parameter innerhalb der :: kibana4 interne Klasse sind jetzt nicht erkannt - 'Ungültiger Parameter:' package_ensure ' – Xenidious