Wie kann ich eine Datei / ein Verzeichnis in Puppet erstellen?

17

Ich versuche, eine Funktion in Puppet zu schreiben, die eine ausführt, failwenn der übergebene Verzeichnispfad nicht existiert.

if File["/some/path"]Gibt immer true zurück und if defined(File["/some/path"])nur dann true, wenn die Ressource in puppet definiert ist, unabhängig davon, ob sie tatsächlich vorhanden ist.

Gibt es eine Möglichkeit, dies mit einer einfachen ifAussage zu tun ?

Vielen Dank

ddario
quelle
2
Denken Sie daran: Manifeste werden auf dem Master kompiliert. Sie wissen nichts über den Klienten außer den Tatsachen, die er vorlegt. Schreiben Sie also entweder eine Tatsache, die diese Informationen enthält, oder treten Sie einen Schritt zurück und sagen Sie uns, was Sie tatsächlich zu lösen versuchen, damit wir einen besseren Ansatz als eine if-Anweisung finden können.
Dennis Kaarsemaker

Antworten:

30

Problemumgehung: Verwenden Sie onlyif für einen ausführbaren "Test" und fordern Sie ihn in Ihrer Aktion an, die Sie ausführen möchten:

exec {"check_presence":
  command => '/bin/true',
  onlyif => '/usr/bin/test -e /path/must/be/available',
}

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}
Pascal Schmiel
quelle
5
Oh, das ist böse, ich mag es :-)
Dennis Kaarsemaker
1
Könnte noch einfacher sein: exec {"test -e / path / must / be / available":}
Dennis Kaarsemaker
1
Vielen Dank. Dies funktioniert hervorragend für eine Prüfung mit einem Verzeichnis. Ich versuche jedoch, ein Array von Verzeichnissen zu validieren. Wenn ich dies zu einer Funktion hinzufüge, wird der Fehler "Kann nicht erneut deklariert werden" angezeigt.
Ddario
6
Tolle Idee, aber das bedeutet, dass bei jedem Puppet-Lauf die Meldung "Exec [check_presence] / returns: execute successful" angezeigt wird, was wirklich ärgerlich ist! Besser wäre: exec {'check_presence': command => '/ bin / false', es sei denn => '/ usr / bin / test -e / path / must / be / available',} Dies wird dasselbe tun, aber wird nur dann einen Fehler / Hinweis erzeugen, wenn der Pfad wirklich nicht existiert.
S0me0ne
2
Alles, was das "Erfordernis" zum Scheitern bringt, gibt einen Fehler aus, da das, was eine gescheiterte Abhängigkeit hat, ob mit onlyif oder without ... Also technisch funktioniert es, aber Sie werden eine Menge Fehler in Ihren Puppet-Protokollen protokollieren lassen ...
David Gardner
0

Auch ich hatte Schwierigkeiten herauszufinden, wie ich verhindern kann, dass ein Modul ausgeführt wird, wenn kein Verzeichnis vorhanden ist. Dies ist, was ich fand, dass für mich gearbeitet hat.

exec { 'module_name':
   command => "command to run with variables", # Double quotes for Variable interpolation
   path   => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:",
   onlyif => 'test -d /mydirectory',
   }

Das Hinzufügen des Pfades hat mir wirklich geholfen. Aus irgendeinem Grund, auch wenn ich den Pfad zum Testbefehl hinzugefügt habe, da /bin/tester anscheinend nicht richtig funktioniert hat.

Hoffe, dies hilft anderen, die möglicherweise das gleiche Problem haben.

Mike Taylor
quelle
0

Sie können dafür auch die integrierte Funktion find_file () verwenden. Sie gibt undef zurück, wenn die Datei / der Pfad nicht vorhanden ist, und eine Zeichenfolge, wenn sie vorhanden ist.

https://puppet.com/docs/puppet/5.5/function.html#findfile

Mike
quelle
1
Dies wird nur auf dem Master ausgeführt und dient zum Auffinden von Dateien in Modulen.
Bodgit
Danke, aber Sie könnten es auch verwenden, um Dateien auf dem Betriebssystem zu finden, indem Sie den vollständigen Pfad angeben oder nicht?
Mike
Nur auf der Maschine, auf der der Katalog erstellt wird, dh dem Master.
Bodgit
ja, das ist richtig.
Mike