Chef - créer un modèle avec variable dynamique?
Je vais avoir un peu de défi sur une recette Chef. Je suis nouveau sur le Chef, de sorte s'il vous plaît garder avec moi.
Étape 1: Ma recette chef installe Ruby Passager, compile les Passagers nginx module avec Nginx.
# Install passenger and nginx module
bash "Install Passenger" do
code <<-EOF
source /usr/local/rvm/scripts/rvm
gem install passenger
EOF
user "root"
not_if { `gem list`.lines.grep(/^passenger \(.*\)/).count > 0 }
end
# Install passenger
# Note that we have to explicitly include the RVM script otherwise it won't setup the environment correctly
bash "Install passenger nginx module and nginx from source" do
code <<-EOF
source /usr/local/rvm/scripts/rvm
passenger-install-nginx-module --auto --prefix=/opt/nginx --auto-download
EOF
user "root"
not_if { File.directory? "/opt/nginx" }
end
Étape 2: Après cela, j'ai créer le fichier de configuration de nginx l'aide d'un modèle. Cette configuration nécessite l'emplacement des Passagers, qui dépend de l'étape 1 à la fin.
template "/opt/nginx/conf/nginx.conf" do
source "nginx.conf.erb"
action :create
variables(
deploy_user: deploy_user,
passenger_root: `bash -c "source /usr/local/rvm/scripts/rvm; passenger-config --root"`.chomp,
passenger_ruby: `bash -c "source /usr/local/rvm/scripts/rvm; which ruby"`.chomp,
passenger: node[:passenger]
)
end
Problème: le Chef s'affiche pour compiler des modèles au th ebeginning de la course. Donc, ce qui finit par arriver, c'est que l'Étape 2 est en fait réalisée avant l'Étape 1 est exécuté. Cela signifie que le passenger_root variable est vide. Il a besoin de l'Étape 1 à accomplir avant de pouvoir obtenir le passenger_root, puis d'exécuter le modèle.
J'ai essayé d'emballage de l'étape 2 du code dans un ruby_block
mais cela ne fonctionne pas: undefined method
modèle " pour le Chef:::: RubyBlock`.
Ne savez pas quoi faire ici, ou quelle est la meilleure pratique pour le Chef de quelque chose comme cela?
Merci d'avance,
Leonard
OriginalL'auteur Leonard Teo | 2013-04-01
Vous devez vous connecter pour publier un commentaire.
Un nettoyant et une méthode recommandée consiste à utiliser Attribut Lazy Évaluation.
Aussi, je vous suggère de l'aide
strip
au lieu dechomp
[merci Draco].OriginalL'auteur Greg
Dès que vous enveloppez de votre code de
ruby_block
vous ne pouvez pas utiliser ordinaire recette des ressources de la déclaration de plus. Vous devez écrire pur ruby code:PS. Et je suppose que vous voulez utiliser
strip
au lieu dechomp
pour supprimer l'espace.OriginalL'auteur Draco Ater
Ouais, le Chef est une bête. Je pense qu'une partie du problème est qu'il y a un million de façons de faire la même choses, mais il n'y a vraiment pas de documentation détaillant de la meilleure manière. Ce que vous voulez probablement, c'est d'utiliser Les Notifications, de sorte que le bloc 1 s'exécute d'abord que avise le bloc 2 à exécuter. Cela signifie que le bloc 2 besoins
action :none
de sorte qu'il ne déclenche pas jusqu'à ce qu'il est notifié.J'ai ajouté le notifier à votre exemple, dans le bloc 1 et ajouté de l'action :aucun pour le bloc 2.
OriginalL'auteur mguymon