我在AWS OpsWorks上设置了一些Rails堆栈,我主要使用OpsWorks控制台Web应用程序将我的代码从GitHub部署到堆栈。
在'部署应用程序'在OpsWorks上,有一个'迁移数据库'开关默认为关闭。 Rails中的数据库迁移是幂等的,因此运行迁移永远不会受到伤害,但如果您在需要运行时忘记运行迁移,它肯定会受到伤害。
我有什么方法可以让开关默认为'是'总是运行迁移?我不想使用自定义配方来执行此操作,因为我希望迁移在部署期间在一个且仅一个实例上运行。我是否缺少一些配置选项,以便在通过OpsWorks控制台将代码部署到堆栈时自动运行数据库迁移?
答案 0 :(得分:1)
您可以通过在自定义堆栈json中配置它来尝试这个:
http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-json-override.html
似乎你必须设置deploy - > app_name - >在自定义json中迁移为true。 App_name可能是图层的名称,但您应该尝试查看是否属于这种情况。
答案 1 :(得分:1)
虽然Mircea的答案有效,但它对我的用例并不理想,因为它在部署期间在堆栈中的所有实例上运行迁移。如果您的堆栈中定义了大量实例,这将会破坏您的数据库。
最终我最终做的是使用一个自定义的食谱,它只覆盖migrate属性,将其设置为true
一个且只有一个节点。 this forum post给了我灵感。
我已经为我的堆栈启用了自定义cookbook,并且要使用此方法,您需要执行相同操作。然后我在我的自定义cookbook存储库中定义了一个deploy
食谱,它只有一个文件:deploy/attributes/customize.rb
包含:
migrate_node = 'rails-app1'
current_hostname = node[:opsworks][:instance][:hostname]
application = <your application short name>
if migrate_node == current_hostname
normal[:deploy][application][:migrate] = true
else
normal[:deploy][application][:migrate] = false
end
该代码只是硬编码'rails-app1'作为运行迁移的节点,然后检查当前节点是否是那个节点。如果是,则将该节点的迁移排队。如果不是,则确保迁移不在该节点上运行。