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