7

我是厨师的新手,所以我对条件 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对资源“执行 [创建用户]”执行操作时出错

...

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

STDERR:createuser:创建新角色失败:错误:角色“用户”已经存在

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

谢谢

4

3 回答 3

4

我一直有同样的问题。但是,在我的情况下,“not_if”似乎由不同的用户(root)执行,并且未能正确检查条件。添加 [:user => "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

于 2014-01-12T11:43:11.800 回答
1

您正在检查是否存在:

node[:user]

如果它不存在,则创建:

node[:postgresql][:user]

除非这些恰好相等,否则您将继续尝试重复创建 node[:postgresql][:user] 。

于 2013-01-26T04:33:23.050 回答
0

首先,条件有错别字WHERE。它可能应该username代替usename.

无论如何,你应该这样做:

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

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

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

祝大厨好运!我非常爱它!

于 2013-02-01T05:39:03.307 回答