Fabric позволяет автоматизировать разные операции на удаленном хосте, наиболее яркий пример - развёртывание проекта: прогоняем тесты, пакуем нужные файлы и заливаем на сервер, развертываем архив, перезапускаем сервер.
Но одним лишь развертыванием проекта возможности fabric не ограничиваются, большинство административных задач можно реализовать на нем с разными ухищрениями. Для соединения с удаленным хостом используется Paramiko - python-библиотека реализующая протокол SSH2.
Для начала поставим сам fabric
pip install fabric
Следующим этапом надо составить список инструкций, которые хранятся в специально предназначенном файле fabfile.py. Например, напишем простую команду для бекапа папки www на разных серверах:
from fabric.api import * env.hosts = ['usr1@host1:22', 'usr2@host2:22'] def backup(): run("tar cfvz /tmp/backup.tar.gz /var/www/")
В env.hosts хранится список хостов к которым fabric будет последовательно подключатся и выполнять указанную команду, строка подключения представляют собой обычный адрес хоста, который используется в консольной команде SSH. Имя функции backup() и есть команда которую мы хотим выполнить, а функция run() запускает указанную shell-команду на удаленном хосте.
Запуск производится так:
fab backup
В конечном результате мы получим архив со всеми сайтами в файле /tmp/backup.tar.gz на каждом из указанных серверов. Дальше этот архив можно забрать на локальную машину с помошью функции get(), описана ниже.
Команде можно передать параметры:
code_dir = '/home/www/project' def migrate(app=""): with cd(code_dir): run('python manage.py migrate %s' % app)
Запуск fab migrate:app=basket
.
Словарь env содержит разные настроечные параметры для fabric, полный список приведен тут. Еще вкусности про которые хотелось бы упомянуть:
Внутри самописных команд можно использовать такие встроенные функции fabric:
sudo('ls /', user='root')
- запустить ls с привилегиями суперпользователя (по умолчанию root) на удаленном хосте
put('/local/path/file.tar.gz', '/remote/path/file.tar.gz')
- копирует локальный файл file.tar.gz на удаленном хост
run('ls /')
- запускает ls на удаленном хосте
get('/remote/path/file.tar.gz', '/local/path/file.tar.gz')
- копирует файл file.tar.gz на удаленном хосте на локальный хост
local('ls /', capture=False)
- запускает ls на локальном хосте, аргумент capture=False не подавляет вывод запускаемой команды
val = prompt('Really?')
- запрос данных и сохранение в переменную val
Выполнение команды перед запуском других команд в блоке with
def migrate(app=""): with prefix("source /path/to/venv/bin/activate"): run('python manage.py migrate %s' % app)
Раскрашивание текста команды
from fabric.api import * from fabric.colors import green def remote_pull(): print(green('PULLING ...')) with cd(code_dir): run('sudo -uwww git pull')
Рабочий пример fabfile.py можно посмотреть тут.
Дополнительное чтиво