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 можно посмотреть тут.
Дополнительное чтиво