Назад | Перейти на главную страницу

Работа с развертыванием при запуске экземпляра

Я не понимаю, как мне обрабатывать событие «Развертывание», которое происходит при запуске экземпляра. В стеке есть два уровня (Node.js и Rails) и два приложения с разными рецептами для обработки событий Deploy. Проблема в том, что при запуске экземпляра OpsWorks пытается развернуть оба этих приложения на экземпляре и, очевидно, терпит неудачу. На данный момент рецепт развертывания выглядит так:

search('aws_opsworks_app').each do |app|
  Chef::Log.info("Deploying app #{app.name}")
  app_dir = '/srv/www/js_app'

  application app_dir do
    git app['app_source']['url'] do
      revision app['app_source']['revision']
      deploy_key app['app_source']['ssh_key']
    end

    execute 'Install dependencies' do
      command 'npm install --dev'
      cwd app_dir
    end

    execute 'Build' do
      command 'npm run build'
      cwd app_dir
    end

    npm_start
  end
end

Ваш рецепт должен работать в обоих приложениях. Opsworks делает это намеренно: если экземпляр выключен и впоследствии запускается (как бы то ни было), он должен иметь возможность синхронизировать экземпляр с последними версиями любых приложений, атрибутов и т. Д., Которые требуются экземпляру для уровня, который его вводят до того, как он переводит его в онлайн.

Самое простое, что вы можете сделать, чтобы исправить свой рецепт, предполагая, что он app_dir что вызывает у вас горе, вы можете посмотреть настройку app_dir к чему-то уникальному для каждого приложения, например /srv/www/#{app['shortname']}. shortname - это подчеркнутая версия имени вашего приложения в нижнем регистре, которая подходит для создания каталога с.

Если ваши приложения различаются таким образом, что, например, одно приложение запускается npm install а другой нет, вы можете использовать app['environment'] hash для передачи дополнительных параметров вашего приложения, которые вы затем можете использовать в своем рецепте, чтобы определить, запускается ли конкретное действие или нет. Например;

execute "Install dependencies" do
  command "npm install --dev"
  cwd app_dir
  only_if do
    app['environment'].key?('do_npm_install')
  end
end

Затем перейдите в настройки своего приложения в консоли Opsworks, добавьте ключ «do_npm_install» и установите для него любое значение (неважно, что это такое, в приведенном выше примере проверяется только наличие ключа, а не его значение) , оставив другое приложение в исходном состоянии. Тогда будет запущен только execute заблокировать для приложений, у которых есть do_npm_install в их среде.