Chef infra 仅了解厨师长如果不了解厨师长如果

Chef infra 仅了解厨师长如果不了解厨师长如果,chef-infra,Chef Infra,我不确定我是否理解条件执行 我想根据Postgresql中是否存在数据库来执行一些有条件的执行 这是我的例子 execute "add_db" do cwd "/tmp" user "dbuser" command "createdb -T template_postgis mydb" not_if 'psql --list|grep mydb' end 运行psql--list | grepmydb返回数据库存在时所期望的结果(带有dbname条目的行),如果不存在,则完全不

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

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

这是我的例子

execute "add_db" do
  cwd "/tmp"
  user "dbuser"
  command "createdb -T template_postgis mydb"
  not_if 'psql --list|grep mydb'
end
运行
psql--list | grepmydb
返回数据库存在时所期望的结果(带有dbname条目的行),如果不存在,则完全不返回任何结果

那么,如果只是评估一下,你怎么不去做呢?对还是错?1还是0?如果成功,不是所有进程都返回0吗


任何人如有任何建议,将不胜感激

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

    % psql --list|grep mydb
    mydb-is-here
    % echo $?
    0
    % psql --list|grep mydb-not-here
    % echo $?
    1
如果你尝试了一些不存在的东西,你应该得到这样的东西:

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

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

我刚刚遇到了这个问题。我的问题是not_if命令是作为“root”而不是“dbuser”运行的。如果你把它改成

not_if 'psql --list|grep mydb', :user => 'dbuser'
然后你可能会得到你想要的结果


就像你给他们举了一个例子,告诉他们如何自己解决问题一样!我通常在将a-q添加到配方中时将其添加到grep调用中,这样chef客户端的输出就不会被grep生成的任何匹配项弄乱。我的情况有点不同,因此我将在这里为将来在类似情况下登陆此处的用户留下一条注释。假设你有一个属性
节点['myattr']=true
,那么如果你只写
如果节点['myattr']
,chef会抱怨。我发现您需要将语句用大括号括起来,即仅当{node['myattr']}