Автоматизация с помощью shell скриптов
Опубликовано пт, 31/07/2015 - 11:02

Продолжаем тему автоматизации. На этот раз речь пойдет о shell скриптах, а точнее о bash скриптах.
Содержание
Введение
Для начала разберемся что же такое shell и bash.
Shell script (сокращено sh) - компьютерная программа, разработанная для запуска с помощью Unix shell, интерпретатором командной строки.
Bash (от англ. Bourne again shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell. Одна из наиболее популярных современных разновидностей командной оболочки UNIX. Bash — это командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне. Bash также может читать команды из файла, который называется скриптом (или сценарием). Как и все Unix-оболочки, он поддерживает автодополнение имён файлов и директорий, подстановку вывода результата команд, переменные, контроль за порядком выполнения, операторы ветвления и цикла. Ключевые слова, синтаксис и другие основные особенности языка были заимствованы из sh.
Итак для чего же нам может понадобится bash скрипт? Как и все скрипты - для упрощения рутинных задач и автоматизации процессов. Например, мы довольно часто и много делаем однотипных проектов (клепаем визитки:)). Набор модулей почти всегда стандартный (ctools, views, admin_menu и т.д.). Помимо этого нам нужно создать бд, скачать друпал, переименовать проект, прописать конфиги для апача, прописать настройки бд в settings.php - довольно большой список постоянно повторяющихся действий, которые можно с успехом автоматизировать. Итак список наших задач, если бы мы выполняли их последовательно:
- создаем директорию сайта mysite/src
- скачиваем друпал с необходимыми модулями, используя make файл.
- вносим изменения в settigs.php для подключения базы данных
- создаем базу данных
- прописываем конфиги для апача (sites-available, sites-enabled)
- перезапускаем апач
- устанавливаем друпал
- устанавливаем права на запись для sites/all/default/files
- отключаем некоторые ненужные модули ядра (overlay, toolbar)
- включаем модули: admin_menu, module_filter, views, xmlsitemap
- меняем овнера папки сайта с root на текущего пользователя (у меня это ubuntu-root)
Сколько нам потребуется времени на это, если мы будем все делать вручную, пусть и используя драш по максимуму? По средним подсчетам от 3 до 5 мин (учитывая, что нужно знать куда лезть и что менять).
Структура bash скрипта
А теперь посмотрим как все это будет выглядеть в bash скрипте и сколько по итогу уйдет времени. Итак, непосредственно сам скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# Получаем переменные.
NAME=$1
PASSWORD=$2
DB_NAME=$3
DB_USERNAME=$4
DB_PASSWORD=$5
DB_HOST=$6
OWNER=$7
# Цвета (красный для ошибок, сброс цвета на дефолтный и желтый соответственно).
R=$(tput setaf 1)
N=$(tput sgr0)
Y=$(tput setaf 3)
# Проверяем, что введены имя проекта и админ пароль.
if [ -z "${NAME}" -o -z "${PASSWORD}" ]; then
printf "%-`expr 80 - ${#b}`s %-40s\n" $R"Site name and site password are required" "[error]"$N
exit 1
fi
# Проверяем, что введены имя базы, имя пользователя бд, пароль и хост.
if [ -z "${DB_USERNAME}" -o -z "${DB_PASSWORD}" -o -z "${DB_HOST}" ]; then
printf "%-`expr 80 - ${#b}`s %-40s\n" $R"DB name, username, password and host are required" "[error]"$N
exit 1
fi
# Проверяем, что введено имя пользователя ubuntu.
if [ -z "${OWNER}" ]; then
printf "%-`expr 80 - ${#b}`s %-40s\n" $R"System username is required" "[error]"$N
exit 1
fi
# Получаем текущее время.
T=`date +%s`
# Создаем директорию сайта.
mkdir -p $NAME/src
# Переходим в папку src/ и запускаем make файл.
cd $NAME/src
drush make ../../contrib.make -y
cd sites/default
# Копируем settings.php с плейсхолдерами в папку default и изменяем параметры подключения базы данных.
cp ../../../../settings.php settings.php
sed -i -e "s|$\$DB_NAME\\$\\$|$DB_NAME|g" settings.php
sed -i -e "s|$\$DB_USERNAME\\$\\$|$DB_USERNAME|g" settings.php
sed -i -e "s|$\$DB_PASSWORD\\$\\$|$DB_PASSWORD|g" settings.php
sed -i -e "s|$\$DB_HOST\\$\\$|$DB_HOST|g" settings.php
# Создаем базу данных.
`mysql --user=$DB_USERNAME --password=$DB_PASSWORD -e "CREATE DATABASE $DB_NAME"`
# Конфигурация апача.
cd /etc/apache2/sites-available/
touch $NAME
echo "<VirtualHost *:80>" >> $NAME
echo " ServerName ${NAME}" >> $NAME
echo " DocumentRoot /var/www/${NAME}/src" >> $NAME
echo " ErrorLog ${APACHE_LOG_DIR}/${NAME}.error.log" >> $NAME
echo " CustomLog ${APACHE_LOG_DIR}/${NAME}.access.log combined" >> $NAME
echo "</VirtualHost>" >> $NAME
# Создаем символическую ссылку.
cd ../sites-enabled/
ln -s /etc/apache2/sites-available/$NAME $NAME
# Перезапускаем апач.
service apache2 restart
# Установка друпала.
cd /var/www/$NAME/src/sites/default/
drush si --account-pass=$PASSWORD --site-name=$NAME -y
# Изменяем права на папку files.
chmod 0777 files/ -R
# Отключение и удаление ненужных модулей. Включение требуемых.
drush dis overlay toolbar -y
drush pm-uninstall overlay toolbar -y
drush en admin_menu module_filter views xmlsitemap -y
# Меняем владельца папки и выводим затраченное время в секундах.
chown $OWNER:www-data ../../../../$NAME -R
echo $Y"Summary time, [$(((`date +%s`-$T)))] sec"$N |
Запускать будем через sudo, т.к. директория, из которой мы будем запускать наш скрипт, принадлежит суперюзеру root. Нам понадобится makefile contrib.make с необходимыми контрибными модулями, взять его можно из статьи Создаем свой make файл (только измените версию друпала и модулей на актуальные). Также будет нужен файл settings.php c плейсхолдерами для замены на реальные значения. Скопируйте дефолтный settings.php, переименуйте его в settings.php и в месте указания параметров бд вставьте следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$databases = array ( 'default' => array ( 'default' => array ( 'database' => '$$DB_NAME$$', 'username' => '$$DB_USERNAME$$', 'password' => '$$DB_PASSWORD$$', 'host' => '$$DB_HOST$$', 'port' => '', 'driver' => 'mysql', 'prefix' => '', ), ), ); |
Параметры запуска и результат выполнения
Запуск скрипта (наш файл скрипта находится по пути /var/www, тут же лежит make-файл и settings.php) и указание параметров в следующей последовательности:
- sudo bash install_example.sh NAME PASSWORD DB_NAME DB_USERNAME DB_PASSWORD DB_HOST OWNER
1 |
sudo bash install_example.sh mysite 123 mysite root root localhost ubuntu-root |
Непосредственно процесс выполнения

Получили время выполнения 39 секунд.
Итог
Мы написали полезный скрипт (не самый простой, но и не очень сложный), который можно уже сейчас использовать при создании нового сайта. Функционал можно бесконечно расширять. Конечно, для этого потребуются более глубокие знания sh языка, но и профит от этого огромен. Например, если у вас команда из 10 разработчиков и каждому нужно поставить свой сайт. Используя bash скрипты вы сэкономите кучу времени, нервов и денег.
Также с помощью bash скриптов организуется так называемый билд с нуля, когда весь сайт со всеми настройками, фичами, кастомными, контрибными модулями разворачивается с пустого места. Зачастую такой подход используют, когда проект еще не вышел в лайф. После релиза используется подход continuous integration.
Дополнительная информация по статье
- https://ru.wikipedia.org/wiki/Bash - подробное описание bash на wiki




Новые комментарии