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
3 answers
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
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.
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!