time

Fabric : автоматизация административных задач на python

fabric-list.png 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, полный список приведен тут. Еще вкусности про которые хотелось бы упомянуть:

  • возможность передачи параметров в написанные команды
  • для каждой команды можно задать декораторы, которые будут ограничивать выполнение только для указанного хоста
  • проверка результата выполнения команды - если обнаружены ошибки, то прекращается выполнение остальных команд
  • возможность интерактивного запроса команд от пользователя
  • набор команд для работы с папками и файлами
  • гибкий набор аргументов для fab

Внутри самописных команд можно использовать такие встроенные функции 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 можно посмотреть тут.

Дополнительное чтиво

blog comments powered by Disqus