私はシェフが初めてなので、条件付きの not_if が実行リソース内でどのように機能するかについて少し混乱しています。コマンドが0またはtrueを返す場合、コマンドを実行しないようにchefに指示することを理解しています。ただし、私のコードでは、まだコマンドを実行しているようです。
次のコードは、ユーザー (およびそのパスワード) とデータベースを作成することになっています。ただし、ユーザーとデータベースが既に存在する場合は、何もしないでください。ユーザー、データベース、およびパスワードは、属性で定義されます。以下は私が持っているコードです:
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
リソース 'execute[create-user]' でアクションを実行中にエラーが発生しました
...
[2013-01-25T12:24:51-08:00] 致命的: Mixlib::ShellOut::ShellCommandFailed: execute[create-user] (postgresql::initialize 行 16) にエラーがありました: Mixlib::ShellOut::ShellCommandFailed : プロセスは [0] で終了するはずですが、'1' を受け取りました
STDERR: createuser: 新しいロールの作成に失敗しました: エラー: ロール "user" は既に存在します
私にはうまくいくはずですが、実行はまだ実行されています。何か不足していますか?
ありがとうございました