Python: модуль Fabric

Автор: | 17/06/2015

PythonОписание, установка

Fabric – система для управления и развёртывания приложений.

Управляющие скрипты (аналог рецептов в Chef) пишутся на Python. И сам Fabric написан на Python.

Особое значение (по крайней мере – для меня) имеет то, что Fabric отлично работает с SSH, позволяя выполнять любые действия на удалённой машине.

При этом, в отличии от paramiko, имеет намного более приятный API. paramiko является составной частью Fabric, который его использует для выполнения собственных команд.

Установка – стандартно, через PIP:

# pip install fabric

В CentOS Fabric можно установить из репозитория Epel:

# yum install fabri

Доступны так же пакеты для Debian/Ubuntu.

Основные функции Fabric-API

run()

Используется для выполнения команд на удалённых хостах. Вывод можно сохранить в переменную.

Узнать выполнена ли команда успешно или нет – можно с помощью атрибутов failed и succeeded.

Например:

# создать диреткорию
run("mkdir /tmp/trunk/")

# проверить uptime
run("uptime")

# сохранить вывод команды в переменную
result = run("ls -l /var/www")

# проверить успешно ли выполнена команда
result.failed

sudo()

Как и run() – позволяет выполнять удалённые команды под sudo.

Если пользователь указан явно – то команда будет выполнена не от root, а от него (правда, на RHEL AWS не сработало).

Например:

# создать диреткорию
sudo("mkdir /var/www")

# создать диреткорию под пользователем web-admin
sudo("mkdir /var/www/web-app-one", user="web-admin")

# сохранить вывод в переменную
result = sudo("ls -l /var/www")

local()

Скрипты Fabric могут использоваться для выполнения действий как на удалённых хостах – так и на локальном хосте. Для выполнения действий локально – Fabric предоставляет функцию local().  В отличии от run() или sudo() – вывод можно только либо подавить – либо вывести на консоль. Для этого используется аргумент capture.

Примеры:

# создать tar-архив пакета (для приложения Python)
local("python setup.py sdist --formats=gztar", capture=False)

# извлечь содержимое архива
local("tar xzvf /tmp/trunk/app.tar.gz")

# удалить файл
local("rm /tmp/trunk/app.tar.gz")

get()

Функция get() позволяет загружать файлы с удалённого хоста на локальный, по аналогии с утилитой scp. Удалённый путь можно указать с помощью аргумента remote_path, а локальный (куда сохранять) – с помощью local_path.

Примеры:

# загрузить логи
get(remote_path="/tmp/log_extracts.tar.gz", local_path="/logs/new_log.tar.gz")

# загрузить бекап базы данных
get("/backup/db.gz", "./db.gz")

put()

put() используется для загрузки локальных файлов на удалённый хост, по аналогии с get(). Результат выполнения можно проверить с помощью атрибутов failed и succeeded.

  • local_path – путь на локальном хосте;
  • remote_path – путь на удалённом хосте;
  • mode – установить права доступа на загруженном файле/директории;
  • mirror_local – установить права доступа аналогично локальнмоу файлу.

Примеры:

# загрузить архив на удалённый хост
put("/local/path/to/app.tar.gz", "/tmp/trunk/app.tar.gz")

# использование менеджера контекста cd
# вместо аргумента "remote_path"
# эта команда загрузит файл app.tar.gz в /tmp/trunk/
with cd("/tmp"):
    put("local/path/to/app.tar.gz", "trunk")

# загрузить файл и установить права доступа
upload = put("requirements.txt", "requirements.txt", mode=664)

# проверить успешность загрузки
upload.succeeded

promt()

Когда требуется дополнительная гибкость в работе с Fabric – вам поможет функция promt(). Она предоставляет возможность задать вопрос у пользователя, который выполняет крипт Fabric.

Примеры:

# уточнить номер порта и сохранить его в переменную
port_number = prompt("Which port would you like to use?")

# то же, но с указанием значения по умолчанию и проверкой ввода
port_number = prompt("Which port?", default=42, validate=int)

reboot()

Выполняет перезагрузку удалённой операционной системы. По умолчанию – задаёт интервал перед перезагрузкой в 2 минуты.

Примеры:

# выполнить перезагрузку
reboot()

# выполнить перезагрузку через 30 секунд
reboot(wait=30)

Менеджеры контекста Fabric

cd()

cd() – смена текущего каталога.

Примеры:

# cd выполняет заданные команды в заданном каталоге
# например - в /tmp/trunk
with cd("/tmp/trunk"):
    items = sudo("ls -l")

# можно использовать "цепочку" для переходов
# например - ls в этом примере будет выполнен в /tmp/trunk
with cd("/tmp"):
    with cd("/trunk"):
        run("ls")

lcd()

Работает аналогично cd(), но на локальной файловой системе.

Пример:

# перейти в локальный каталог и загрузить архив из него
with lcd("~/projects/my_project"):
    print "Uploading the project archive"
    put("app.tar.gz", "/tmp/trunk/app.tar.gz")

path()

path() может менять значение переменной окружения PATH.

settings()

Если вам требуется временно (например – только для одной команды изменить значение env) изменить настройки – вы можете использовать функцию settings().

Например:

# выполнить команду cmd от имени другого пользователя
with settings(user="user1"):
    sudo("cmd")

Использование fabfile для автоматизации задач

Создайте файл fabfile.py с таким содержимым:

# Fabfile для:
#    - обновления удалённой системы или систем
#    - загрузить и установить приложение

# импортируем API модули
from fabric.api import *

# создаём список хостов
env.hosts = [
    'server.domain.tld',
  # 'ip.add.rr.ess
  # 'server2.domain.tld',
]
# указываем имя пользователя
env.user   = "root"

# указываем пароль [НЕ РЕКОМЕНДУЕТСЯ]
# env.password = "passwd"

def update_upgrade():

    """Обновить установленные пакеты"""

    run("aptitude    update")
    run("aptitude -y upgrade")

def install_memcached():

    """ Загрузить и установить приложение memcached"""

    run("aptitude install -y memcached")

def update_install():

    # запустить обновление
    update_upgrade()

    # запустить установку
    install_memcached()

Теперь вы можете запустить скрипт на выполнение с помощью утилиты fab:

$ fab update_install

Оригинал статьи – https://www.digitalocean.com.

Попозже добавлю пример использования.