我不明白我该如何处理实例启动时发生的“部署”事件。 该堆栈有两层(Node.js和Rails)和两个具有不同配方的应用程序来处理“部署”事件。 问题是,当实例启动时,OpsWorks试图将这两个应用程序部署到一个实例,显然失败。 目前部署configuration看起来像这样:
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通过devise来实现这一点,如果一个实例closures并随后启动(不过发生这种情况),它需要能够将实例与实例所需的最新版本的任何应用程序,属性等同步,它在它把它带到网上之前。
最简单的事情,你可以做,以解决你的食谱,假设它是app_dir导致你悲伤,你可以看看app_dir设置为每个应用程序独特的东西,例如/srv/www/#{app['shortname']} 。 shortname是应用程序名称的下划线,小写版本,适合用来创build目录。
如果您的应用程序有所不同,例如,一个应用程序运行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”并将其值设置为任何值(不pipe它是什么,上面的示例只检查是否存在键,而不检查其值) ,而另一个应用程序保持原状。 然后这将只运行在其环境中具有do_npm_install应用程序的execute块。