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