2017-10-12 3 views
0

ich eine lokale Manifest Anwendung ein testen exec und file Ressource:Puppet Datei-Ressource läuft trotz Exec, es sei denn

class test_file { 
    exec { "touch /tmp/testfile": 
    path => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"], 
    unless => "test -d /tmp 2>/dev/null", 
    } 

    file { "/tmp/success": 
    mode => "0777", 
    owner => "root", 
    group => "staff", 
    source => "file:///Users/Shared/success", 
    require => Exec["touch /tmp/testfile"], 
    } 
} 

Was ich geschehen erwarten: Die exec läuft und beendet, weil die unless Aussage gibt 0 zurück, so dass die Dateiressource nie ausgeführt wird und keine Datei in /tmp erstellt wird.

Was passiert eigentlich: Die file Ressource immer läuft, und kopiert die „Erfolg“ Datei zu /tmp

Ich habe die 4.10 und 5.3.2 auf macOS 10.11 und 10.12 mit beiden Puppen Agenten ausgeführt. .. mit den gleichen Ergebnissen. Ich versuche einfach, eine Bedingung auszuführen, die besagt, dass eine Datei nicht kopiert werden soll, wenn ein Befehl erfolgreich beendet wird. Alle Einsichten oder Richtungen würden geschätzt werden.

Antwort

1

Sie missverstehen, wie Marionette funktioniert. .

Die require metaparameter die Reihenfolge erklärt, in den Ressourcen angewandt werden sollten * In Anbetracht Ihr Manifests, Puppet verspricht nur, dass die Exec Ressource - , wenn es überhaupt angewandt wird - immer vor der Datei-Ressource angewandt werden.

Es gibt einen weiteren Metaparameter, subscribe. Wenn eine Ressource eine andere Ressource als abonniert, versucht Puppet, diese Ressource zu "aktualisieren", wenn die Ressource, für die sie abonniert ist, ihren Status ändert.

Leider können Sie das hier nicht verwenden, da Dateiressourcen "Ereignisse aktualisieren" ignorieren.

Was Sie tun können, obwohl es ein bisschen hässlich ist, ist:

class test_file() { 
    Exec { 
    path => ["/bin", "/usr/bin", "/sbin", "/usr/sbin"], 
    } 

    exec { "touch /tmp/testfile": 
    unless => "test -d /tmp 2>/dev/null", 
    } 

    exec { "cp /Users/Shared/success /tmp/success": 
    subscribe => Exec["touch /tmp/testfile"], 
    refreshonly => true, 
    } 
} 

* Die erfordern metaparameter verhindert auch eine zweite Ressource überhaupt angewendet werden, wenn die erste Ressource anzuwenden ausfällt. Siehe Abschnitt failed dependencies in den Dokumenten.

+0

Er tut dies nur für das Training, also weiß ich nicht, ob er dieses erfundene Szenario wirklich in einer realen Umgebung machen will. In dieser Situation würde er wahrscheinlich eine "Datei" für die erste Aktion und eine "Exec" für die zweite Aktion verwenden. –

+0

Das ist nicht ganz richtig. Die "Datei" mit einer "requirement" -Reqlationship auf dem "Exec" legt nicht nur die Reihenfolge der Anwendung fest, sondern verhindert auch, dass die "Datei" überhaupt angewendet wird, wenn ein Versuch unternommen wird, die "Exec" anzuwenden und fehlschlägt. Aber natürlich ist der Exec-Fehler anders, als wenn er nicht angewendet wird, weil er bereits synchron ist (wie in diesem Fall über seinen Befehl 'obwher' bestimmt). –

+0

Ich habe eine Fußnote dazu hinzugefügt. –

Verwandte Themen