Como usar não se em uma receita de chef

Sou novo no chef por isso estou um pouco confuso em como o not_if condicional funciona dentro de um recurso de execução. Eu entendo que ele diz ao chef para não executar um comando se o comando retorna 0 ou verdadeiro; no entanto, no meu código, aparentemente ainda está executando o comando.

o seguinte código é suposto criar um utilizador (e a sua senha) e uma base de dados; no entanto, se o utilizador e a base de dados já existirem, não deve fazer nada. O utilizador, a base de dados e a senha são: definido nos atributos. O seguinte é o código que eu tenho:

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

O chefe dá-me o seguinte erro:

erro ao executar a acção run no recurso 'Executar[Criar-Utilizador]'

...

[2013-01-25T12:24:51-08:00] FATAL: Mixlib::shell-out::ShellCommandFailed: execute[criar usuário] (postgresql::initialize linha 16) teve um erro: Mixlib::shell-out::ShellCommandFailed: Esperado do processo para sair com a [0], mas recebeu '1'

STDERR: createuser: criação de um novo papel falha: erro: o papel "utilizador" já existe

Parece-me que deve funcionar, mas continua a executar. Está a escapar-me alguma coisa?

Obrigado

Author: John Topley, 2013-01-25

3 answers

Eu tinha tido o mesmo problema. Mas, no meu caso, "not_if" parece executado por diferentes usuários (root), e não conseguiu verificar a condição corretamente. Adicionar [: user = > "postgres"] resolveu o problema.
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
Citei o seguinte exemplo de código.

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

 4
Author: parroty, 2014-01-12 11:43:11

Estás a verificar a existência de:

node[:user]

Se não existe, você cria:

node[:postgresql][:user]

A menos que estes sejam iguais, você vai continuar a tentar criar o nó[:postgresql][:utilizador] repetidamente.

 1
Author: Christophe Biocca, 2013-01-26 04:33:23
Primeiro, há um erro de digitação na condição. Provavelmente deveria ser {[3] } em vez de usename.

Anyawy, devias fazer:

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
Isto assume que o seu psql -U postgres -c "select * from pg_user where username='#{node[:user]}'" está correcto.

O mesmo com uma base de dados:

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

Em relação ao nome de utilizador, mesmo que já exista, mudar a senha para a conhecida não deve causar problemas. Afinal, sabes a senha.

Para tua informação, podes definir vários condicionalismos dentro de um recurso.

Boa sorte com Chef! Adoro-o muito!
 0
Author: Eye, 2013-02-01 05:59:14