如何在厨师食谱中使用not_if

时间:2013-01-25 21:36:53

标签: ruby postgresql chef

我是厨师新手,所以我对条件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

Chef给我以下错误:

在资源上执行操作run时出错&#39;执行[create-user]&#39;

...

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

STDERR:createuser:新角色的创建失败:ERROR:role&#34; user&#34;已存在

对我而言,它似乎应该有效;但是,它仍然在运行执行。我错过了什么吗?

谢谢

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。但是,在我的情况下,“not_if”似乎由不同的用户(root)执行,并且未能正确检查条件。添加[:user =&gt; “postgres”]解决了这个问题。

execute "create-database-user" do
    user "postgres"
    exists = <<-EOH
    psql -U postgres -c "select * from pg_user where usename='#{settings[:username]}'" | grep -c #{settings[:username]}
    EOH
    command "createuser -U postgres -sw #{settings[:username]}"
    not_if exists, :user => "postgres"
end

我已经参考了以下代码示例。

https://github.com/MarcinKoziuk/chef-postgres-dbsetup/blob/master/recipes/default.rb

答案 1 :(得分:1)

您正在检查是否存在:

node[:user]

如果它不存在,则创建:

node[:postgresql][:user]

除非这些恰好相同,否则你会不断尝试重复创建节点[:postgresql] [:user]。

答案 2 :(得分:0)

首先,WHERE条件中存在拼写错误。它应该是username而不是usename

Anyawy,你应该这样做:

execute "create-user" do
    user "postgres"
    command "createuser -s #{node[:user]}"
    not_if "psql -U postgres -c \"select * from pg_user where username='#{node[:user]}'\" | grep -c #{node[:user]}"
end

这假设您的psql -U postgres -c "select * from pg_user where username='#{node[:user]}'"是正确的。

与数据库相同:

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

关于用户名,即使它已经存在,将密码更改为已知密码也不会导致问题。毕竟你知道密码。

仅供参考,您可以在一个资源中定义多个条件。

祝厨师好运!我非常喜欢它!