• en
  • Language: ru
  • Documentation version: 1.1.x

Развертывание с помощью Fabric

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

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

  • Fabric 1.0 должен быть установлен локально. В данном руководстве предполагается последняя версия Fabric.

  • Приложение уже должно быть пакетом и требует наличия рабочего файла setup.py (Развертывание с помощью инструментов Setuptools).

  • В следующем примере мы используем mod_wsgi для удаленных серверов. Конечно, вы можете использовать свой собственный любимый сервер, но для этого примера мы выбрали Apache + mod_wsgi, потому что он очень прост в настройке и имеет простой способ перезагрузки приложений без root-доступа.

Создание первого 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')

Запуск Fabfiles

Теперь как выполнить этот 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 и увидеть, как ваше приложение автоматически развертывается на одном или нескольких удаленных серверах.