我想将django应用程序迁移到带有fabfile的多个主机。问题是所有主机都连接到同一个数据库(在另一个服务器中),并且为每个主机运行migrate
命令。
我可以选择一个主机作为主服务器并仅从主服务器运行migrate命令,但想知道是否有更优雅和适当的解决方案。
fabfile.py
def migrate():
virtualenv('python manage.py makemigrations')
virtualenv('python manage.py migrate')
def prod():
env.user = 'myuser'
env.hosts = ['X1', 'X2']
答案 0 :(得分:2)
您有三种选择。
您可以使用@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()功能相结合(如该部分的文档中所示)并制作{{1}为您调用其他任务的函数。看起来像这样:
deploy
叫做:
def deploy():
execute(migrate)
execute(update)