Хочу рассказать дорогому читателю историю о том, как я пытался автоматизировать установку продукта ИКС на работе, чтобы не тратить время на рутинные операции.
Начнем издалека. Этот продукт служит для мониторинга за серверами и поддерживает установку на Windows 2008 R2, Windows 2012 и последние версии дистрибутивов RHEL и SLES. Виртуальные машины со всем необходимым окружением крутятся на ESXi сервере.
Инсталлятор под Виндовс представляет собой типичный мастер установки с парой опций и лихорадочными кликами на кнопку “Next”. Для Linux'a написан shell-скрипт, который определяет тип и версию дистрибутива, просит ввести название хоста и устанавливает необходимые RPM-пакеты.
Каждый день lftp синхронизируется с удалённым сервером и получает daily build с продуктом ИКС, который мне следует протестировать. Для того, чтобы проверить необходимые компоненты системы, мне следует сперва установить её. Установка с ручным выполнением всех шагов инсталлятора занимает примерно 20-25 минут. Чтобы сократить это время и избавиться от скучной задачи, я принялся кое-как автоматизировать процесс.
Начиналось всё со скрипта для автоматической установки ежедневной сборки под линуксом. На виртуальной машине с Debian запущен http-сервер, куда я складываю билды. Другие виртуальные машины скачивают эти билды wget'ом, распаковывают архив и запускают установщик в silent mode. Первоначально алгоритм выглядел так:
- Откатить снэпшот виртуальной машины.
- Попасть на виртуальную машину по SSH.
- Запустить скрипт для скачивания и установки билда.
Снэпшот помогает сэкономить дополнительно минут 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
, которая вычленяет строку до символа слэша (/). Таким образом, как бы ни менялась версия и название корневой папки, скрипт будет знать, куда ему следует переместиться для дальнейшей работы. Запуск скрипта для установки ИКС на виртуалки больше не зависит от даты и версии. Шаг в сторону упрощения сделан.
Если вам интересны заметки подобного плана, пишите в комментарии, продолжу серию более детально и в красках :-)
6 комментариев: ответить
История одной автоматизации.
Автоматизации на одну строчку баша, а текста - ух-ух! Не стареют ни душой ни сердцем Львы Толстые!
Если вам интересны заметки подобного плана, пишите в комментарии, продолжу серию более детально и в красках :-)
Интересны, но не про одну строчку на 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, ну или чё элитарное, типа Хаскеля или Окамля). Даёшь!
@iv_vl
Автоматизации на одну строчку баша, а текста - ух-ух!
Я не ставил целью сорвать какие-то технические покровы. Эта заметка, чтобы начать как-то «расписываться» после долгого перерыва и рассказать, с чем пришлось столкнуться на проекте и как решались некоторые задачки.
@Sergey Avseyev
> А почему не захотел сделать всё в sed?
Точно! Спасибо, добрый человек, работает. Только описанный пример более универсален, нет привязки к первой букве каталога.
@virens
> Я понимаю, тебе захотелось поделиться, но народЪ (ТМ) интересуют комплексные решения. А ты, как убунта: накрываешь аудитории, которой нет.
А здесь и не получится универсального решения. Кровавый интерпрайз с определённым набором условий, под которые приходится подстраиваться.
> Почему-то использован Wget, а не rsync - хотя последний круче. Не кросс-платформенно - надо бы на Powershell
Wget использован, потому что его функций хватает с головой. А для кроссплатформенности я использую его же виндовый порт.
> твой пример плох тем, что он невоспроизводим
Согласен, я понимаю это. Но опять же, не стоит воспринимать описанное, как инструкцию. Это история :-)
Конечно, продолжайте. Тема жутко интересная.
зачем знать имя каталога? распаковать во временную директорию и cd *
@Andrew Kravchuk
> Конечно, продолжайте.
Возьму музу за хвост в ближайшее время. Она обещала :-)
@redbaron
> зачем знать имя каталога?
Потому что он находится внутри архива. Иерархия каталогов ведь не изменится после того, как я распакую архив в /tmp.