处理实例启动时的部署

处理实例启动时的部署

我不明白我该如何处理实例启动时发生的“部署”事件。堆栈有两层(Node.js 和 Rails)和两个应用程序,它们具有不同的配方来处理“部署”事件。问题是,当实例启动时,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

答案1

您的配方需要能够适用于这两个应用程序。Opsworks 的设计就是如此,如果某个实例已关闭并随后启动(无论如何),它需要能够将该实例与该实例所在层所需的任何应用程序、属性等的最新版本同步,然后才能将其联机。

修复配方最简单的方法是假设这是app_dir导致您痛苦的原因,您可以考虑app_dir为每个应用程序设置一些唯一的内容,例如/srv/www/#{app['shortname']}shortname是您的应用程序名称的下划线小写版本,适合用于创建目录。

如果您的应用程序有所不同,例如,一个应用程序运行npm install而另一个不运行,则可以使用哈希app['environment']传递有关应用程序的其他参数,然后可以在配方中使用这些参数来确定是否运行特定操作。例如;

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

相关内容