Spec-Zone.ru › Flask 0.12

Развёртывание с Fabric

Fabric — это инструмент для Python, похожий на Makefiles, но с возможностью выполнения команд на удалённом сервере. В сочетании с правильно настроенным пакетом Python (Приложения большего размера) и хорошей концепцией конфигураций (Обработка конфигураций) развёртывание приложений Flask на внешних серверах очень просто.

Прежде чем начать, вот быстрый контрольный список вещей, которые нужно проверить:

  • Fabric 1.0 должен быть установлен локально. Этот учебник предполагает использование последней версии Fabric.
  • Приложение должно быть уже пакетом и потребовать функционирующего файла setup.py (Развёртывание с помощью 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 = '%s.tar.gz' % dist

    # upload the package to the temporary folder on the server
    put('dist/%s' % filename, '/tmp/%s' % filename)

    # install the package in the application's virtualenv with pip
    run('/var/www/yourapplication/env/bin/pip install /tmp/%s' % filename)

    # remove the uploaded package
    run('rm -r /tmp/%s' % 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

Для настройки нового сервера вы примерно выполните следующие шаги:

  1. Создайте структуру каталогов в /var/www:

    $ mkdir /var/www/yourapplication
    $ cd /var/www/yourapplication
    $ virtualenv --distribute env
    
  2. Загрузите новый файл application.wsgi на сервер и файл конфигурации приложения (например: application.cfg)
  3. Создайте новую конфигурацию Apache для yourapplication и активируйте её. Убедитесь, что включено отслеживание изменений файла .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 и увидеть, как ваше приложение автоматически развёртывается на одном или нескольких удалённых серверах, — это очень полезно.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/0.12.x/patterns/fabric/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API