我是厨师新手,所以我对条件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;已存在
对我而言,它似乎应该有效;但是,它仍然在运行执行。我错过了什么吗?
谢谢
答案 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
关于用户名,即使它已经存在,将密码更改为已知密码也不会导致问题。毕竟你知道密码。
仅供参考,您可以在一个资源中定义多个条件。
祝厨师好运!我非常喜欢它!