Для управления серверами профессиональные администраторы давно используют такие 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:
<h1>Bash Booster Rocks!</h1>
И настроим 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.
Автор: kr41