web-dev-qa-db-fra.com

Comprendre Chef only_if not_if

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é!

27
a.m.

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.

http://tickets.opscode.com/browse/CHEF-438

21
Darrin Holst

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.

19
Brad Knowles