Содержание
Описание, установка
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.
Попозже добавлю пример использования.