Подтвердить что ты не робот

Понимание шеф-повара only_if not_if

Я не уверен, что понимаю условное исполнение шеф-повара.

Я хотел бы выполнить некоторое условное выполнение на основе того, существует ли база данных в 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) и вообще ничего, если это не так.

Итак, как это сделать не только для оценки? Правда или ложь? 1 или 0? Не все процессы возвращают 0, если они успешны?

Любые любые советы будут очень признательны!

4b9b3361

Ответ 1

Я просто столкнулся с этой проблемой. Моя проблема заключалась в том, что команда not_if запускалась как "root", а не "dbuser". Если вы измените его на

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

то вы можете получить результаты, которые искали.

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

Ответ 2

Запустите тест для себя, из командной строки и посмотрите на возвращаемое по умолчанию значение (a.k.a., "$?" ). Вы должны получить что-то вроде этого:

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

Если вы попробуете что-то, чего там нет, вы должны получить что-то вроде этого:

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

Какой шеф-повар будет смотреть на это числовое значение, которое будет забито в $?, то есть либо "0", либо "1". Другими словами, ваш пример, который вы показываете для синтаксиса "not_if", верен.