Автоматизация с помощью 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