如何在厨师食谱中使用not_if

svs*_*svs 7 ruby postgresql chef-infra

我是厨师的新手所以我对条件not_if如何在执行资源中工作感到困惑.据我所知,如果命令返回0或true,它告诉厨师不要执行命令; 但是,在我的代码中,它显然仍在运行命令.

以下代码应该创建用户(及其密码)和数据库; 但是,如果用户和数据库已存在,则不应执行任何操作.用户,数据库和密码在属性中定义.以下是我的代码:

execute "create-user" do

        code = <<-EOH
        psql -U postgres -c "select * from pg_user where usename='#{node[:user]}'" | grep -c #{node[:user]}
        EOH
        user "postgres"
        command "createuser -s #{node[:user]}"
        not_if code
end


execute "set-user-password" do
    user "postgres"
    command  "psql -U postgres -d template1 -c \"ALTER USER #{node[:user]} WITH PASSWORD '#{node[:password]}';\""
end


execute "create-database" do
    exists = <<-EOH
    psql -U postgres -c "select * from pg_database WHERE datname='#{node[:database]}'" | grep -c #{node[:database]}}
    EOH
    user "postgres"
    command "createdb #{node[:database]}"
   not_if exists

end
Run Code Online (Sandbox Code Playgroud)

厨师给我以下错误:

run在资源'execute [create-user]'上执行操作时出错

...

[2013-01-25T12:24:51-08:00]致命:Mixlib :: ShellOut :: ShellCommandFailed:执行[create-user](postgresql :: initialize第16行)出错:Mixlib :: ShellOut :: ShellCommandFailed :预期进程以[0]退出,但收到'1'

STDERR:createuser:新角色的创建失败:ERROR:角色"user"已存在

对我来说似乎它应该工作;但是,它仍然运行执行.我错过了什么吗?

谢谢

Chr*_*cca 1

您正在检查是否存在:

node[:user]
Run Code Online (Sandbox Code Playgroud)

如果不存在,则创建:

node[:postgresql][:user]
Run Code Online (Sandbox Code Playgroud)

除非它们恰好相等,否则您将继续尝试重复创建节点[:postgresql][:user]。