Comment utiliser not_if dans une recette chef
Je suis nouveau sur le chef, donc je suis un peu confus dans la façon dont le conditionnel not_if fonctionne à l'intérieur d'une exécution de ressources. Je comprends qu'il dit le chef, de ne pas exécuter une commande si la commande retourne 0 ou vrai; cependant, dans mon code, il est apparemment toujours en cours d'exécution de la commande.
Le code suivant est censé créer un utilisateur (et son mot de passe) et une base de données; toutefois, si l'utilisateur et la base de données existe déjà, il ne faut pas faire n'importe quoi. L'utilisateur, base de données et le mot de passe sont définis dans les attributs. Voici le code que j'ai:
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 me donne l'erreur suivante:
Erreur lors de l'exécution de l'action run
sur la ressource 'exécuter[créer de l'utilisateur]'
...
[2013-01-25T12:24:51-08:00] FATAL: Mixlib::ShellOut::ShellCommandFailed: execute[créer de l'utilisateur] (postgresql::initialize ligne 16) a une erreur: Mixlib::ShellOut::ShellCommandFailed: le processus Prévu à la sortie avec [0], mais il a reçu '1'
STDERR: createuser: création d'un nouveau rôle a échoué: ERREUR: le rôle "utilisateur" existe déjà
Il me semble que cela devrait fonctionner;cependant, elle est encore à l'exécution de l'exécuter. Ai-je raté quelque chose?
Merci
C'est bon @Matthieu Ratzloff
OriginalL'auteur svs | 2013-01-25
Vous devez vous connecter pour publier un commentaire.
J'avais eu le même problème. Mais, dans mon cas, "not_if" semble exécutés par différents utilisateur (root), et a omis de vérifier l'état correctement. Ajout de [:user => "postgres"] résolu le problème.
J'ai évoqué l'exemple de code suivant.
https://github.com/MarcinKoziuk/chef-postgres-dbsetup/blob/master/recipes/default.rb
OriginalL'auteur parroty
Vous êtes de vérifier l'existence d':
Si elle n'existe pas, à vous de créer:
Sauf si elles sont égales, vous aurez essaie de créer un nœud[:postgresql][:user] à plusieurs reprises.
OriginalL'auteur Christophe Biocca
Tout d'abord, il y a une faute de frappe dans le
WHERE
condition. Il devrait probablement êtreusername
au lieu deusename
.Anyawy, il faut faire:
Cela suppose que votre
psql -U postgres -c "select * from pg_user where username='#{node[:user]}'"
est correct.Même avec une base de données:
Concernant le nom d'utilisateur, même s'il existe déjà, en changeant le mot de passe connu que l'on ne devrait pas causer de problème. Après tout, vous connaissez le mot de passe.
Pour info, vous pouvez définir plusieurs conditions dans un délai d'une ressource.
Bonne chance avec le Chef! Je l'aime beaucoup!
Le un nom est le bon attribut!!
OriginalL'auteur Eye