我不明白我该如何处理实例启动时发生的“部署”事件。堆栈有两层(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