7

私はシェフが初めてなので、条件付きの 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" は既に存在します

私にはうまくいくはずですが、実行はまだ実行されています。何か不足していますか?

ありがとうございました

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

ユーザー名については、既に存在していても、既知のパスワードに変更しても問題ありません。結局のところ、あなたはパスワードを知っています。

参考までに、1つのリソース内で複数の条件を定義できます。

シェフと頑張ってください!私はそれが大好きです!

于 2013-02-01T05:39:03.307 に答える