Je ne suis pas sûr de comprendre l'exécution conditionnelle de Chef.
Je voudrais faire une exécution conditionnelle basée sur l'existence ou non d'une base de données dans Postgresql
Voici donc mon exemple
execute "add_db" do
cwd "/tmp"
user "dbuser"
command "createdb -T template_postgis mydb"
not_if 'psql --list|grep mydb'
end
Fonctionnement psql --list|grep mydb
retourne ce que vous attendez si le db existe (la ligne avec l'entrée dbname) et rien du tout si ce n'est pas le cas.
Alors, comment not_if évalue-t-il seulement cela? Vrai ou faux? 1 ou 0? Tous les processus ne renvoient-ils pas 0 s'ils réussissent?
N'importe quel conseil serait grandement apprécié!
Je viens de rencontrer ce problème. Mon problème était que la commande not_if était exécutée en tant que 'root', pas 'dbuser'. Si vous le changez en
not_if 'psql --list|grep mydb', :user => 'dbuser'
vous obtiendrez alors les résultats que vous recherchiez.
Exécutez le test par vous-même, à partir de la ligne de commande, et jetez un œil à la valeur de retour par défaut (a.k.a., "$?"). Vous devriez obtenir quelque chose comme ceci:
% psql --list|grep mydb
mydb-is-here
% echo $?
0
Si vous essayez quelque chose qui n'est pas là, vous devriez obtenir quelque chose comme ceci:
% psql --list|grep mydb-not-here
% echo $?
1
Ce que le chef va regarder, c'est la valeur numérique qui serait fourrée en $?, C'est-à-dire soit un "0" soit un "1". En d'autres termes, votre exemple que vous montrez pour la syntaxe "not_if" est correct.