Развертывание Django-проектов c помощью Fabric

В одном из проектов необходимо регулярно выкладывать код из ветки stage на staging сервер. Начали делать это вручную — входишь через ssh, делаешь git push origin stage, если нужно — обновляешь базу и затем перезапускаешь apache. К концу этой недели решили, что хорошо бы все эти действия выполнять одной командой. Я прошерстил блоги — сейчас очень активно пишут про использования для этих целей библиотеки Fabric (это аналог Capistrano из Ruby on Rails).

Как установить


Установите библиотеку fabric через pip или easy_install, затем создайте символическую ссылку для приложения fab, либо добавьте папку с bin файлами в вашем Python-дистрибутиве в PATH. Ниже — краткая инструкция для Mac OS X + ports.

sudo pip-2.6 install fabric
sudo ln -s /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin/fab /usr/bin/fab


Что делает Fabric


Fabric позволяет выполнять самые разнообразные действия по ssh на целой группе серверов. Действия описываются в файле fabfile.py и представляют собой обычные питоновские функции. Обычно fabfile.py кладут в корневую папку проекта (рядом с manage.py, settings.py, urls.py, ...).

from fabric.api import *

env.hosts = ['moodbox.com']
        
def deploy():
    local('hg push')
    with cd('hgreps/vorushin_ru'):
        run('hg update')
        run('/etc/init.d/apache2 reload')


Теперь если я запускаю fab deploy из папки с проектом vorushin_ru (код этого блога, написанного на Django), то сначала с моей локальной машины произойдет push, затем по ssh на сервере будет сделан update с последующим перезапуском апача.

Всякие тонкости


Во-первых, работа по ssh должна идти через сертификаты. См. ssh-keygen, ssh authorized keys.

Во-вторых, если необходимо делать pull с другого сервера, то нужно добавлять параметр -A при вызове ssh. Подробности — lincolnloop.com/blog/2009/sep/22/easy-fabric-deployment-part-1-gitmercurial-and-ssh/

В-третьих, если развертывание делает поочередно команда разработчиков, то у файлов проекта должны быть права на запись всей группой разработчиков. Подробности — lincolnloop.com/blog/2009/oct/7/easy-fabric-deployment-part-2/

В-четвертых, если под апачем запущено несколько проектов, то его лучше перестартовывать через touch your.wsgi (если mod_wsgi настроен для работы в daemon_mode).

Оригинальная статья в моем блоге — vorushin.ru/blog/10-razvertyvanie-django-proektov-c-pomoshyu-fabric/
+31
27 ноября 2009, 20:32
51
vorushin 43,9

комментарии (11)

0
Ferroman #
Да, хороший инструмент.
+1
oleg_podsadny #
Единственное — они так быстро меняют формат, не успеваю переписывать fabfile от версии к версии
+1
Ferroman #
Ну, 0.9 изменений не так много
Думаю с 1 версии синтаксис перестанет сильно «блуждать»
+1
kmike #
hg up от рута как-то некошерно делать) ну и для простого push, up+touch django.wsgi права рута не нужны.

я в env.hosts прописываю обычного пользователя, а для действий, которые требуют root-доступа, пишу что-то вроде


env.hosts = ['user@mysite.ru']

@hosts('root@mysite.ru')
def restart_memcached():
    run('/etc/init.d/memcached restart') 
0
l0rda #
рутом ходить по ssh это ужос
+1
ESQUELETO #
Если вы используете рестарт мемкеша для обнуления кеша, вам понравится:

echo flush_all | nc localhost 11211
0
vorushin #
да, согласен
0
joymax #
А как насчет
ssh user@moodbox.com "hg push && cd hgreps/vorushin_ru && hg update && /etc/init.d/apache2 reload"?
0
vorushin #
У Fabric есть пара преимуществ:
1. Команды выполняются на всех серверах, указанных в env.hosts
2. В типичном fabfile.py как правило лежит десяток функций, которые порой вызывают друг друга — лично для меня в bash скрипте оформлять отдельные функции непросто, всегда соблазн создать несколько отдельных скриптов, которые несколько захламляют корневую директорию
3. Из Fabric очень удобно выполнять питоновский код твоего приложения
0
joymax #
согласен, я сам пользователь fabric :). Для примера из статьи ее использование несколько нецелесообразно.
0
asux #
Спасибо. Изучаю Ruby on Rails, и начал искать аналоги из мира рельсов — rake, capistrano. Похоже для последнего аналог нашелся.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.