28

我不确定我是否理解 Chef 条件执行。

我想根据 Postgresql 中是否存在数据库进行一些条件执行

所以这是我的例子

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

如果 db 存在(带有 dbname 条目的行),则运行psql --list|grep mydb返回您所期望的结果,如果不存在则什么都没有。

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

任何人的任何建议将不胜感激!

4

2 回答 2

23

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

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

那么你可能会得到你正在寻找的结果。

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

于 2012-07-08T13:07:17.447 回答
21

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

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

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

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

厨师将要查看的是填充到 $? 中的数值,即“0”或“1”。换句话说,您为“not_if”语法显示的示例是正确的。

于 2011-12-05T23:57:54.897 回答