[Из песочницы] Bash Booster — SCM инструмент на чистом баше

Для управления серверами профессиональные администраторы давно используют такие SCM системы, как Chef, Ansible, SaltStack и т.п. Данные инструменты помогают централизованно администрировать большой парк серверов. Для управления же одним сервером трудозатраты на установку и настройку такого инструмента часто превышают выигрыш от его использования. В данном случае нередко применяется подход «да ну его, я быстрее скрипт на баше напишу». Подход достаточно популярный, а потому я хотел бы познакомить вас с легковесным SCM инструментом, который не требует ничего, кроме старого доброго баша, и может вполне успешно применяться для настройки одного сервера.Итак, Bash Booster — библиотека, помогающая писать идемпотентные баш-скрипты для настройки серверов и развертки приложений. Была написана под впечатлением от Chef и для использования совместно с Vagrant, хотя область применения вовсе этим не ограничивается. Не требует ничего, кроме баша, стандартных утилит и, в некоторых случаях, питона (который так же установлен на любой Linux системе из коробки). Т.е. вполне пригодна для запуска на абсолютно голой машине без дополнительной подготовки.Давайте посмотрим на живом примере. Я буду использовать Vagrant для демонстрации. Исходники примера находятся на Bitbucket, где все шаги оформлены как отдельные коммиты.

Итак, предположим у нас есть сервер с Linux Ubuntu 14.04, на который нужно установить nginx и настроить его.

Создадим пустую директорию, а в ней Vagantfile:

# -*- mode: ruby -*- # vi: set ft=ruby:

VAGRANTFILE_API_VERSION = »2»

Vagrant.configure (VAGRANTFILE_API_VERSION) do |config| config.vm.box = «ubuntu/trusty32» config.vm.network: forwarded_port, host: 8080, guest: 80 end И выполним команду:

$ vagrant up Vagrant создаст и запустит виртуальную машину с чистой системой (возможно, придется подождать пока он скачает образ). Кроме того, он примонтирует текущую директорию хост-системы в точку /vagrant, т.е. мы сможем иметь доступ к файлам из нашего примера внутри виртуальной машины. Можете проверить это:

$ vagrant ssh $ ls /vagrant Vagrantfile $ exit Далее, скачаем архив Bash Booster и распакуем его в bashbooster-0.3beta (0.3beta — текущая версия на момент написания статьи). А так же подправим Vagrantfile, указав скрипт настройки:

# -*- mode: ruby -*- # vi: set ft=ruby:

VAGRANTFILE_API_VERSION = »2»

Vagrant.configure (VAGRANTFILE_API_VERSION) do |config| config.vm.box = «ubuntu/trusty32» config.vm.provision: shell, inline:»/vagrant/provision.sh» config.vm.network: forwarded_port, host: 8080, guest: 80 end На этом подготовка закончена и можно приступить к самому интересному. Создадим скрипт provision.sh:

#!/usr/bin/env bash

# Удаляем переменную CDPATH, чтобы избежать нежелательных эффектов # при использовании функции cd unset CDPATH # Переключаем текущую директорию в то место, где лежит скрипт cd »$(dirname »${BASH_SOURCE[0]}»)»

## # Инициализируем Bash Booster ## BB_LOG_USE_COLOR=true # Раскрашиваем логи для удобства source bashbooster-0.3beta/bashbooster.sh

# Устанавливаем nginx bb-apt-install nginx Теперь помечаем скрипт как исполняемый:

$ chmod a+x provision.sh И запускаем настройку нашего сервера:

$ vagrant provision В логах должный появится строчки:

bb-apt [INFO] Updating apt cache bb-apt [INFO] Installing package 'nginx' Что это значит? Фактически наш скрипт выполнил:

$ apt-get update $ apt-get install nginx Можно перейти в браузере на http://localhost:8080 что бы увидеть стандартное приветствие «Welcome to nginx!» Теперь, если выполнить vagrant provision еще раз, скрипт отработает практически мгновенно, потому что функция bb-apt-install ничего не делает, если запрошенный пакет уже установлен.

Давайте теперь создадим директорию www с файлом index.html:

Bash Booster Rocks!

И настроим nginx, что бы он отдавал файлы из этой директории. Для этого создадим конфигурацию nginx-default-site в директории conf:

server { root /vagrant/www; index index.html; } И добавим синхронизацию конфигурации в скрипт provision.sh:

bb-event-on «nginx-updated» «on-nginx-updated» on-nginx-updated () { service nginx restart }

bb-sync-file \ /etc/nginx/sites-available/default \ conf/nginx-default-site \ nginx-updated А теперь выполним команду настройки:

$ vagrant provision В логах появится:

* Restarting nginx nginx …done. Перейдя на http://localhost:8080, можно увидеть вместо стандартного приветствия nginx неприлично большую надпись «Bash Booster Rocks!» из ранее созданного файла.

Как это работает? Функция bb-event-on подписывает функцию on-nginx-updated на событие nginx-updated. Функция bb-file-sync синхронизирует локальную копию конфигурации nginx с его текущей версией. Если были изменения, то эта функция порождает событие nginx-updated, по которому его обработчик перезапустит nginx. Попробуйте выполнить vagrant provision еще раз, и он отработает без перезагрузки nginx. Если же внести изменения в nginx-default-site, то nginx будет перезагружен. Таким образом мы получили компактный идемпотентный скрипт, который делает ровно то, что нужно и не более.

Конечно, здесь описаны далеко не все возможности Bash Booster, но для первого знакомства вполне достаточно. Полная документация находится на сайте www.bashbooster.net.

© Habrahabr.ru