web-dev-qa-db-ja.com

Chef only_if not_ifを理解する

Chefの条件付き実行を理解しているのかわかりません。

データベースがPostgresqlに存在するかどうかに基づいて、いくつかの条件付き実行を行いたい

これが私の例です

execute "add_db" do
  cwd "/tmp"
  user "dbuser"
  command "createdb -T template_postgis mydb"
  not_if 'psql --list|grep mydb'
end

ランニング psql --list|grep mydb dbが存在する場合に期待するもの(dbnameエントリのある行)を返し、存在しない場合は何も返しません。

では、not_ifはそれをどのように評価するだけですか?正しいか間違っているか? 1または0?すべてのプロセスが成功すると0を返さないのですか?

だれでもアドバイスをいただければ幸いです!

27
a.m.

この問題に遭遇しました。私の問題は、not_ifコマンドが「dbuser」ではなく「root」として実行されていることでした。に変更した場合

not_if 'psql --list|grep mydb', :user => 'dbuser'

その後、あなたが探していた結果を得るかもしれません。

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

21
Darrin Holst

コマンドラインから自分でテストを実行し、デフォルトの戻り値(別名、「$?」)を確認します。あなたはこのようなものを得るはずです:

    % psql --list|grep mydb
    mydb-is-here
    % echo $?
    0

そこにないものを試すと、次のようなものが得られるはずです。

    % psql --list|grep mydb-not-here
    % echo $?
    1

シェフが注目するのは、$に詰め込まれる数値、つまり「0」または「1」です。つまり、「not_if」構文で示した例は正しいものです。

19
Brad Knowles