理解Chef only_if not_if

时间:2011-12-05 22:45:17

标签: chef

我不确定我理解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会返回数据库存在时所期望的内容(带有dbname条目的行),如果不存在则返回任何内容。

那么not_if只评估那个?对或错? 1还是0?如果成功,所有进程都不会返回0吗?

任何建议都会非常感谢!

2 个答案:

答案 0 :(得分:21)

我刚遇到这个问题。我的问题是not_if命令是以'root'运行,而不是'dbuser'。如果将其更改为

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

那么你可能会得到你想要的结果。

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

答案 1 :(得分:19)

从命令行为自己运行测试,并查看默认返回值(a.k.a.,“$?”)。你应该得到这样的东西:

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

如果你尝试不存在的东西,你应该得到这样的东西:

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

将要看的主厨是将数字填入$ ?,即“0”或“1”。换句话说,您为“not_if”语法显示的示例是正确的。