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(), описана ниже.
Словарь env содержит разные настроечные параметры для fabric, полный список приведен тут. Еще вкусности про которые хотелось бы упомянуть:
Внутри самописных команд можно использовать такие встроенные функции fabric:
sudo('ls /') - запустить 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 не подавляет вывод запускаемой команды
Дополнительное чтиво: