Comment faire un fichier / dir existe conditionnellement dans Puppet?

18

J'essaie d'écrire une fonction dans la marionnette qui fera un failsi le chemin de répertoire passé n'existe pas.

if File["/some/path"]renvoie toujours vrai et if defined(File["/some/path"])ne renvoie vrai que si la ressource est définie dans marionnette, qu'elle existe réellement ou non.

Existe-t-il un moyen de le faire avec une simple ifdéclaration?

Merci

ddario
la source
2
N'oubliez pas: les manifestes sont compilés sur le maître. Ils ne savent rien du client, à l'exception des faits qu'il soumet. Donc, soit écrivez un fait qui contient ces informations, soit prenez du recul et dites-nous ce que vous essayez de résoudre afin que nous puissions trouver une meilleure approche qu'une instruction if.
Dennis Kaarsemaker

Réponses:

31

Solution de contournement pour cela: utilisez uniquement si sur un "test" exec et l'exigez dans votre action que vous souhaitez exécuter:

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

whatever {"foo...":
  .....
  require => Exec["check_presence"],
}
Pascal Schmiel
la source
5
Oh c'est mal, j'aime ça :-)
Dennis Kaarsemaker
1
Pourrait être encore plus simple: exec {"test -e / path / must / be / available":}
Dennis Kaarsemaker
1
Merci. Cela fonctionne très bien pour une vérification de dir unique. Cependant, j'essaie de valider un tableau de répertoires ... Si j'ajoute ceci à une fonction, j'obtiens une erreur "ne peut pas redéclarer".
ddario
6
Excellente idée, mais cela signifie qu'à chaque exécution de marionnettes, il y aura un avis "Exec [check_presence] / retours: exécuté avec succès", ce qui est vraiment ennuyeux! Mieux serait: exec {'check_presence': command => '/ bin / false', sauf => '/ usr / bin / test -e / path / must / be / available',} Cela fera de même, mais ne crée une erreur / notification que lorsque le chemin n'existe pas vraiment.
S0me0ne
2
Tout ce qui provoque l'échec du "require" donnera une erreur car tout ce qui a une dépendance a échoué, que ce soit uniquement si ou à moins ... Donc techniquement, cela fonctionne mais vous obtiendrez beaucoup d'erreurs enregistrées dans vos journaux de marionnettes ...
David Gardner
0

Moi aussi, j'avais du mal à comprendre comment empêcher un module de fonctionner si un répertoire n'était pas présent. C'est ce que j'ai trouvé qui a fonctionné pour moi.

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',
   }

Ajouter le chemin est ce qui a vraiment fait l'affaire pour moi. Pour une raison quelconque, même si j'ai ajouté le chemin d'accès à la commande de test tel /bin/testqu'il ne semble pas fonctionner correctement.

J'espère que cela aide d'autres personnes qui peuvent avoir le même problème.

Mike Taylor
la source
0

Vous pouvez également utiliser la fonction intégrée find_file () pour cela ... elle retourne undef lorsque le fichier / chemin n'existe pas et une chaîne si elle existe.

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

Mike
la source
1
Cela ne fonctionnera que sur le maître, et c'est pour trouver des fichiers dans les modules.
Bodgit
Merci, mais vous pouvez également l'utiliser pour rechercher des fichiers sur le système d'exploitation en fournissant ou non le chemin d'accès complet?
Mike
Uniquement sur la machine où le catalogue est en cours de compilation, c'est-à-dire le maître.
Bodgit
Oui c'est vrai.
Mike