Для развёртывания ПО применяется библиотека Fabric поверх Invoke и Paramiko. Процесс обмена данными с удалённой машиной происходит по протоколу SSH.
Задачи, выполняемые Fabric, располагаются в файле fabfile.py
. Запуск производится
командой fab root@server task_name --arg1 val1 --arg2 val2
. Для удобства
написан скрипт PowerShell fabr.ps
, который считывает параметры подключения к
серверу из файла settings.json
, а также подставляет имя задачи по умолчанию.
Например:
fabr server_alias -s test_scenario.json
- запуск сценария из файлаtest_scenario.json
на сервере с именемserver_alias
Задача по умолчанию выполняет сценарий из файла формате JSON или YAML,
передаваемого в качестве аргумента --scenario [scenario.yaml]
.
Использование:
fab root@server main --scenario scenario.yaml
fabr server_alias -s test_scenario.json
Находит публичный ключ на локальной машине в директории ~/.ssh и добавляет его в список авторизованных ключей на удалённой машине.
Использование: fab root@server install-ssh-key
Включение/отключение доступа к интернету на сервере. Реализовано через подмену шлюза по умолчанию. Используется при разработке для моделирования ситуации, когда на продакшн-сервере отсутствует доступ в интернет.
Использование: fab root@server internet off
Аргументы:
on
|off
- включить/выключить доступ к интернету
Стадии - это команды сценария, которые выполняются после запуска задачи main
.
Стадии задаются в разделе stages
в файле сценария. Каждая стадия описана словарём
со следующими полями:
name: Имя стадии (информационное поля)
cmd: Команда для выполнения
context: Список контекстных команд
test: Список контекстных команд для тестирования результата стадии.
Автоматически добавляется в конец списка `context`, но могут быть помещены
в список `context` вручную.
Аргументы команды, указанной в `cmd` (см. ниже)
Контекстные команды формируются из стадий, поддерживающих выполнение в контексте. Поведение одной и той же команды на уровне стадии и контекста может отличаться. Контекстные команды поддерживаются только на уровне стадий и не могут быть вложены в другие контекстные команды. Контекстные команды выполняют действия перед началом стадии и по завершении. Например, команда тестирования может проверить наличие некоторого файла до и после выполнения стадии.
Создаёт пользователя с указанным именем и домашним каталогом. Если пользователь уже существует, но домашний каталог не совпадает, выводится предупреждение
Аргументы:
username
: имя пользователяhome
: домашний каталог пользователя
Производит установку пакетов из системных репозиториев или каталога
Аргументы:
packages
: список пакетов для установки или путь к каталогу с пакетами
Загружает файлы с локальной машины на удалённую. Файлы, уже присутствующие на удалённой машине, не будут перезаписаны.
Аргументы:
root_local
: корневой локальный каталог с файламиroot_remote
: каталог на удалённой машинеfiles
: список файлов/директорий для загрузки из локального каталога
Распаковывает архивный файл командой tar -xzf <file>
.
Аргументы:
file
: путь к файлу tar.gz для распаковкиoutput
: каталог для распаковки
Контекст: при выходе из контекста производится удаление временного каталога
Производит сборку проекта командами configure
, make
, make install
.
По умолчанию производится только сборка без установки. FIXME:
Требует наличие команд тестирования
Аргументы:
source
: каталог с исходным кодомoptions
: аргументы командной строки дляconfigure
test_configure
: список строк для проверки вывода командыconfigure
install
: установка собранного проекта: true/false/alt (altinstall)
Выполняет произволную команду
Контекст: добавляет команду в контекст выполнения Fabric
Аргументы:
command
- команда для запуска в bash
Контекст: проверяет наличие пути в системе
Аргументы:
path
: проверяемый путь
Производит вывод текста в файл
Аргументы:
text
: текст для вывода, в т. ч. многострочныйoutput
: файл для вывода строки, если не указан, то выводится в консольappend
: добавлять текст в конец файла, по умолчанию false (перезаписывать)
По умолчанию команды исполняются от имени пользователя, указанного при подключении
к серверу. Для выполнения команд от имени других пользователей используется sudo
,
поэтому пользователь по умолчанию должен иметь права на использование этой команды.
Можно переопределить пользователя, от имени которого выполняются команды,
для всех стадий сценария и для конкретных стадий отдельно. Для этого необходимо
указать параметр user: <имя>
в корне сценария или словаре стадии.