Понимание шеф-повара 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, если они успешны?
Любые любые советы будут очень признательны!
Ответы
Ответ 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", верен.