2013-05-16

История одной автоматизации. Часть I: Попасть внутрь архива с ежедневной сборкой

Хочу рассказать дорогому читателю историю о том, как я пытался автоматизировать установку продукта ИКС на работе, чтобы не тратить время на рутинные операции.

Начнем издалека. Этот продукт служит для мониторинга за серверами и поддерживает установку на Windows 2008 R2, Windows 2012 и последние версии дистрибутивов RHEL и SLES. Виртуальные машины со всем необходимым окружением крутятся на ESXi сервере.

Инсталлятор под Виндовс представляет собой типичный мастер установки с парой опций и лихорадочными кликами на кнопку “Next”. Для Linux'a написан shell-скрипт, который определяет тип и версию дистрибутива, просит ввести название хоста и устанавливает необходимые RPM-пакеты.

Каждый день lftp синхронизируется с удалённым сервером и получает daily build с продуктом ИКС, который мне следует протестировать. Для того, чтобы проверить необходимые компоненты системы, мне следует сперва установить её. Установка с ручным выполнением всех шагов инсталлятора занимает примерно 20-25 минут. Чтобы сократить это время и избавиться от скучной задачи, я принялся кое-как автоматизировать процесс.
Начиналось всё со скрипта для автоматической установки ежедневной сборки под линуксом. На виртуальной машине с Debian запущен http-сервер, куда я складываю билды. Другие виртуальные машины скачивают эти билды wget'ом, распаковывают архив и запускают установщик в silent mode. Первоначально алгоритм выглядел так:

  1. Откатить снэпшот виртуальной машины.
  2. Попасть на виртуальную машину по SSH.
  3. Запустить скрипт для скачивания и установки билда.

Снэпшот помогает сэкономить дополнительно минут 5-10, потому что переустановка всего комплекса происходит медленее. Плюс виртуалка без продукта ИКС загружается намного быстрее :-) Скрипт принимает на вход имя архива, который необходимо скачать (например, ИКС_V12001_2013.05.10.zip).

На первых порах я оставлял оригинальные имена архивов и передавал их своему скрипту, но это неудобно, потому что каждый день вместе с датой меняется имя файла. Тогда я решил на своем мини-сервере, раздающем билды, делать символическую ссылку на текущую сборку вида: ИКС_V12001_current.zip.

Зачем я оставил номер версии в имени файла? Дело в том, что внутри архива лежит каталог с аналогичным названием. Я просто парсил имя архива, чтобы узнать, в какой каталог после распаковки следует переместиться. Но этот подход очень корявый, поэтому потребовалось выяснить название корневой папки в архиве универсальным образом. Магический однострочник выглядит следующим образом:

unzip -qql ИКС_V12001_current.zip | sed -r '1 {s/([ ]+[^ ]+){3}\s+//;q}' | cut -f1 -d'/'

Давайте разберёмся с этим заклинанием. unzip с ключом -l показывает содержимое архива. -qq убирает лишние строки с информацией. sed нужен для обработки первой строки, откуда мы извлекаем корневой каталог. Без sed'а строчка выглядит так:

unzip -qql ИКС_V12001_current.zip | head -n1                            
        0  2013-05-10 08:30   V12001/OM/

sed убирает первые три колонки и возвращает результат команде cut, которая вычленяет строку до символа слэша (/). Таким образом, как бы ни менялась версия и название корневой папки, скрипт будет знать, куда ему следует переместиться для дальнейшей работы. Запуск скрипта для установки ИКС на виртуалки больше не зависит от даты и версии. Шаг в сторону упрощения сделан.

Если вам интересны заметки подобного плана, пишите в комментарии, продолжу серию более детально и в красках :-)

7 комментариев: ответить

16.05.2013, 18:27   iv_vl комментирует...

История одной автоматизации.
Автоматизации на одну строчку баша, а текста - ух-ух! Не стареют ни душой ни сердцем Львы Толстые!

16.05.2013, 21:00   Сергей комментирует...

А почему не захотел сделать всё в sed?

sed -r 's/.*(V[^\/]*).*/\1/'

17.05.2013, 14:30   virens комментирует...

Если вам интересны заметки подобного плана, пишите в комментарии, продолжу серию более детально и в красках :-)

Интересны, но не про одну строчку на sed. :-)
Моя строчка покруче будет:

ls ./ToRead/Reading_Items -Rl | grep -v total | sed -e 's/\.\//k k k k k k k k @/g' | awk '{ print $9 }' | sed 's/@/\\item /g' | grep -v .txt | sed s/_/-/g

Делает LaTeX листинг файлов для чтения из каталога с PDFниками. Ну и чё теперь, пост про это раскочегарировать?

Я понимаю, тебе захотелось поделиться, но народЪ (ТМ) интересуют комплексные решения. А ты, как убунта: накрываешь аудитории, которой нет.

Почему-то использован Wget, а не rsync - хотя последний круче. Не кросс-платформенно - надо бы на Powershell (новые технологии от микрософта! консоль2.0!). Ну или на унылом пистоне хотя б.

Потом, твой пример плох тем, что он невоспроизводим - желающий повторить этого сделать не сможет. А хотелось бы.

Выкатывай пост с автоматизацией и примером. Ну и экшена побольше (powershell/python, ну или чё элитарное, типа Хаскеля или Окамля). Даёшь!

18.05.2013, 15:56   drakulavich комментирует...

@iv_vl
Автоматизации на одну строчку баша, а текста - ух-ух!
Я не ставил целью сорвать какие-то технические покровы. Эта заметка, чтобы начать как-то «расписываться» после долгого перерыва и рассказать, с чем пришлось столкнуться на проекте и как решались некоторые задачки.

@Sergey Avseyev
> А почему не захотел сделать всё в sed?
Точно! Спасибо, добрый человек, работает. Только описанный пример более универсален, нет привязки к первой букве каталога.

@virens
> Я понимаю, тебе захотелось поделиться, но народЪ (ТМ) интересуют комплексные решения. А ты, как убунта: накрываешь аудитории, которой нет.
А здесь и не получится универсального решения. Кровавый интерпрайз с определённым набором условий, под которые приходится подстраиваться.

> Почему-то использован Wget, а не rsync - хотя последний круче. Не кросс-платформенно - надо бы на Powershell
Wget использован, потому что его функций хватает с головой. А для кроссплатформенности я использую его же виндовый порт.

> твой пример плох тем, что он невоспроизводим
Согласен, я понимаю это. Но опять же, не стоит воспринимать описанное, как инструкцию. Это история :-)

25.05.2013, 02:55   Unknown комментирует...

Конечно, продолжайте. Тема жутко интересная.

24.08.2013, 23:29   redbaron комментирует...

зачем знать имя каталога? распаковать во временную директорию и cd *

26.08.2013, 09:49   drakulavich комментирует...

@Andrew Kravchuk
> Конечно, продолжайте.
Возьму музу за хвост в ближайшее время. Она обещала :-)

@redbaron
> зачем знать имя каталога?
Потому что он находится внутри архива. Иерархия каталогов ведь не изменится после того, как я распакую архив в /tmp.

Отправить комментарий