9

シェフのレシピに少し挑戦しています。私はシェフが初めてなので、ご容赦ください。

ステップ 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 methodtemplate' for Chef::Resource::RubyBlock`.

ここで何をすべきかわからない、またはこのような場合の Chef のベストプラクティスは何ですか?

前もって感謝します、

レナード

4

3 に答える 3