Автоматизация с помощью shell скриптов

Автоматизация с помощью shell скриптов

Продолжаем тему автоматизации. На этот раз речь пойдет о 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 - довольно большой список постоянно повторяющихся действий, которые можно с успехом автоматизировать. Итак список наших задач, если бы мы выполняли их последовательно:

  1. создаем директорию сайта mysite/src
  2. скачиваем друпал с необходимыми модулями, используя make файл.
  3. вносим изменения в settigs.php для подключения базы данных
  4. создаем базу данных
  5. прописываем конфиги для апача (sites-available, sites-enabled)
  6. перезапускаем апач
  7. устанавливаем друпал
  8. устанавливаем права на запись для sites/all/default/files
  9. отключаем некоторые ненужные модули ядра (overlay, toolbar)
  10. включаем модули: admin_menu, module_filter, views, xmlsitemap
  11. меняем овнера папки сайта с 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

Непосредственно процесс выполнения
Выполнение bash скрипта
Получили время выполнения 39 секунд.

Итог

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

Дополнительная информация по статье

  1. https://ru.wikipedia.org/wiki/Bash - подробное описание bash на wiki