我想使用 fabfile 将 Django 应用程序迁移到多个主机。问题是所有主机都连接到同一个数据库(在另一台服务器中)并且 migrate 命令为每个主机运行。
我可能会选择一个主机作为主控并仅从主控运行迁移命令,但想知道是否有更优雅和更合适的解决方案。
fabfile.py
def migrate():
virtualenv('python manage.py makemigrations')
virtualenv('python manage.py migrate')
def prod():
env.user = 'myuser'
env.hosts = ['X1', 'X2']
请您参考如下方法:
您有大约三个选项。
您可以使用 @runs_once 装饰器。已记录 here .您只需执行以下操作:
@runs_once
def migrate():
virtualenv('python manage.py makemigrations')
virtualenv('python manage.py migrate')
def prod():
env.user = 'myuser'
env.hosts = ['X1', 'X2']``
像这样调用:
$ fab -R myRole migrate update
您也可以只应用特定角色以用于显示的所述任务 here :
from fabric.api import run, roles
env.roledefs = {
'db': ['db1'],
'web': ['web1', 'web2', 'web3'],
}
@roles('db')
def migrate():
# Database stuff here.
pass
@roles('web')
def update():
# Code updates here.
pass
像这样调用:
$ fab migrate update
如果您想获得更细粒度的功能,可以将这些相同的功能与 execute() 结合使用函数(如该部分的文档中所示)并创建一个 deploy 函数来为您调用其他任务。看起来像这样:
def deploy():
execute(migrate)
execute(update)
像这样调用:
$ fab deploy
