Bash Booster — SCM инструмент на чистом баше

в 13:55, , рубрики: bash, Bash Booster, scm, vagrant, ит-инфраструктура, системное администрирование, метки: , , ,

Для управления серверами профессиональные администраторы давно используют такие 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

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js