使用 Fabric 部署 — Flask 文档
使用 Fabric 进行部署
Fabric 是一个类似于 Makefile 的 Python 工具,但能够在远程服务器上执行命令。 结合正确设置的 Python 包(Large Applications as Packages)和良好的配置概念(Configuration Handling),将 Flask 应用程序部署到外部服务器非常容易。
在我们开始之前,这里有一个我们必须预先确保的事项的快速清单:
- Fabric 1.0 必须在本地安装。 本教程假定最新版本的 Fabric。
- 应用程序必须是一个包并且需要一个有效的
setup.py
文件(Deploying with Setuptools)。 - 在以下示例中,我们将 mod_wsgi 用于远程服务器。 您当然可以在那里使用自己喜欢的服务器,但在本示例中,我们选择了 Apache + mod_wsgi,因为它非常易于设置,并且具有无需 root 访问即可重新加载应用程序的简单方法。
创建第一个 Fabfile
fabfile 是控制 Fabric 执行的内容。 它被命名为 fabfile.py
并由 fab 命令执行。 该文件中定义的所有函数都将显示为 fab 子命令。 它们在一台或多台主机上执行。 这些主机可以在 fabfile 或命令行中定义。 在这种情况下,我们将它们添加到 fabfile。
这是一个基本的第一个示例,它能够将当前源代码上传到服务器并将其安装到预先存在的虚拟环境中:
from fabric.api import *
# the user to use for the remote commands
env.user = 'appuser'
# the servers where the commands are executed
env.hosts = ['server1.example.com', 'server2.example.com']
def pack():
# build the package
local('python setup.py sdist --formats=gztar', capture=False)
def deploy():
# figure out the package name and version
dist = local('python setup.py --fullname', capture=True).strip()
filename = f'{dist}.tar.gz'
# upload the package to the temporary folder on the server
put(f'dist/{filename}', f'/tmp/{filename}')
# install the package in the application's virtualenv with pip
run(f'/var/www/yourapplication/env/bin/pip install /tmp/{filename}')
# remove the uploaded package
run(f'rm -r /tmp/{filename}')
# touch the .wsgi file to trigger a reload in mod_wsgi
run('touch /var/www/yourapplication.wsgi')
运行 Fabfile
现在你如何执行那个fabfile? 您使用 fab 命令。 要在远程服务器上部署当前版本的代码,您可以使用以下命令:
$ fab pack deploy
然而,这要求我们的服务器已经创建了 /var/www/yourapplication
文件夹,并且 /var/www/yourapplication/env
是一个虚拟环境。 此外,我们不是在服务器上创建配置或 .wsgi
文件。 那么我们如何将新服务器引导到我们的基础设施中呢?
这现在取决于我们要设置的服务器数量。 如果我们只有一个应用程序服务器(大多数应用程序都会有),那么在 fabfile 中为此创建一个命令是多余的。 但显然你可以做到这一点。 在这种情况下,您可能将其称为 setup 或 bootstrap,然后在命令行上明确传递服务器名称:
$ fab -H newserver.example.com bootstrap
要设置新服务器,您可以大致执行以下步骤:
在
/var/www
中创建目录结构:$ mkdir /var/www/yourapplication $ cd /var/www/yourapplication $ virtualenv --distribute env
上传一个新的
application.wsgi
文件到服务器和应用程序的配置文件(例如:application.cfg
)为
yourapplication
创建一个新的 Apache 配置并激活它。 确保激活监视.wsgi
文件的更改,以便我们可以通过触摸它来自动重新加载应用程序。 参见 mod_wsgi (Apache)。
那么现在的问题是,application.wsgi
和 application.cfg
文件从何而来?
WSGI 文件
WSGI 文件必须导入应用程序并设置环境变量,以便应用程序知道在哪里查找配置。 这是一个简短的例子,它正是这样做的:
import os
os.environ['YOURAPPLICATION_CONFIG'] = '/var/www/yourapplication/application.cfg'
from yourapplication import app
然后应用程序本身必须像这样初始化自己以在该环境变量中查找配置:
app = Flask(__name__)
app.config.from_object('yourapplication.default_config')
app.config.from_envvar('YOURAPPLICATION_CONFIG')
文档的 配置处理 部分详细解释了这种方法。
配置文件
现在如上所述,应用程序将通过查找 YOURAPPLICATION_CONFIG
环境变量来找到正确的配置文件。 因此,我们必须将配置放在应用程序能够找到它的地方。 配置文件在所有计算机上都具有不同的不友好特性,因此您通常不会对它们进行版本控制。
一种流行的方法是将不同服务器的配置文件存储在单独的版本控制存储库中,并在所有服务器上检出它们。 然后将服务器的活动文件符号链接到预期的位置(例如:/var/www/yourapplication
)。
无论哪种方式,在我们这里的情况下,我们只需要一两个服务器,我们可以手动提前上传它们。
第一次部署
现在我们可以进行我们的第一次部署。 我们已经设置了服务器,以便它们拥有虚拟环境并激活 apache 配置。 现在我们可以打包应用程序并部署它:
$ fab pack deploy
Fabric 现在将连接到所有服务器并运行 fabfile 中记录的命令。 首先它会执行 pack 以便我们准备好我们的 tarball,然后它会执行 deploy 并将源代码上传到所有服务器并安装在那里。 多亏了 setup.py
文件,我们将自动将所需的库拉入我们的虚拟环境中。
下一步
从那时起,可以做很多事情来使部署变得有趣:
- 创建用于初始化新服务器的 bootstrap 命令。 它可以初始化一个新的虚拟环境,适当地设置 apache 等。
- 将配置文件放入单独的版本控制存储库,并将活动配置符号链接到位。
- 您还可以将应用程序代码放入存储库并在服务器上查看最新版本,然后进行安装。 这样您也可以轻松返回到旧版本。
- 挂钩测试功能,以便您可以部署到外部服务器并运行测试套件。
使用 Fabric 很有趣,您会注意到键入 fab deploy
并看到您的应用程序自动部署到一个或多个远程服务器是非常神奇的。