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


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"],
}

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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.