Chef - создать шаблон с динамической переменной?

У меня проблемы с рецептом от шеф-повара. Я новичок в шеф-повара, поэтому, пожалуйста, потерпите меня.

Шаг 1: Мой рецепт шеф-повара устанавливает Ruby Passenger, затем компилирует модуль Passenger nginx вместе с 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.

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 компилирует шаблоны в начале запуска. Таким образом, в конечном итоге происходит то, что Шаг 2 фактически компилируется перед выполнением Шаг 1. Это означает, что переменная passenger_root пуста. Необходимо выполнить шаг 1, прежде чем можно будет получить passenger_root, а затем запустить шаблон.

Я попытался обернуть код шага 2 вruby_block но это не работаетundefined methodшаблон 'для Chef :: Resource :: RubyBlock`.

Не знаете, что здесь делать, или как лучше готовить шеф-повара для чего-то подобного?

Заранее спасибо,

Леонард

Ответы на вопрос(3)

Ваш ответ на вопрос