理解Chef only_if not_if

a.m*_*.m. 27 chef-infra

我不确定我理解Chef条件执行.

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

所以这是我的榜样

execute "add_db" do
  cwd "/tmp"
  user "dbuser"
  command "createdb -T template_postgis mydb"
  not_if 'psql --list|grep mydb'
end
Run Code Online (Sandbox Code Playgroud)

psql --list|grep mydb如果db存在(具有dbname条目的行),则运行返回您期望的内容,如果不存在则返回任何内容.

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

任何建议将不胜感激!

小智 22

我刚遇到这个问题.我的问题是not_if命令是以'root'运行,而不是'dbuser'.如果你改成它

not_if 'psql --list|grep mydb', :user => 'dbuser'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我的情况有点不同,所以我会在这里留下一个注释,以便在类似情况下未来的用户登陆这里.假设你有一个属性`node ['myattr'] = true`,那么如果你写'only_if node ['myattr']`,厨师会抱怨.我发现你需要将语句括在花括号中,即.`only_if {node ['myattr']}` (5认同)

小智 20

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

    % psql --list|grep mydb
    mydb-is-here
    % echo $?
    0
Run Code Online (Sandbox Code Playgroud)

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

    % psql --list|grep mydb-not-here
    % echo $?
    1
Run Code Online (Sandbox Code Playgroud)

厨师将要看的是数字值会被塞进$ ?,即"0"或"1".换句话说,您为"not_if"语法显示的示例是正确的.

  • 我通常在将grep调用放入配方时将-q添加到grep调用中,因此chef-client输出不会因grep生成的任何匹配而混乱. (6认同)