シェフのレシピに少し挑戦しています。私はシェフが初めてなので、ご容赦ください。
ステップ 1: 私のシェフのレシピでは、Ruby Passenger をインストールしてから、Nginx と共に Passenger 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
ステップ 2: その後、テンプレートを使用して nginx 構成ファイルを作成します。この構成には、手順 1 の完了に依存する Passenger の場所が必要です。
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
問題: 実行の開始時に Chef がテンプレートをコンパイルしているように見えます。したがって、最終的には、ステップ 1 が実行される前にステップ 2 が実際にコンパイルされます。これは、passenger_root 変数が空白であることを意味します。Passenger_root を取得してテンプレートを実行するには、ステップ 1 を完了する必要があります。
ステップ 2 のコードを a でラップしようとしましたruby_block
が、うまくいきません: undefined method
template' for Chef::Resource::RubyBlock`.
ここで何をすべきかわからない、またはこのような場合の Chef のベストプラクティスは何ですか?
前もって感謝します、
レナード