[Из песочницы] Автоматизация массовой подготовки серверов с помощью HP Scripting Toolkit for Linux

Предположим вам необходимо подготовить новый сервер (или использовать заново старый сервер) под известные вам задачи.Под подготовкой я подразумеваю следующее: посмотреть, нет ли на сайте производителя обновлений прошивок и если есть то обновить их (BIOS/UEFI, интерфейс удаленного управления, RAID-контроллер, жесткие диски, сетевая карта и проч.) настроить BIOS/UEFI поправить время на материнской плате настроить интерфейс удаленного управления создать тома на RAID-контроллере создать разделы (партиции) Далее, подготовить ОС (вариант из): установить ОС развернуть готовый образ ФС установить гипервизор и скопировать готовые виртуальные машины Далее первичная настройка ОС (как минимум, настройка сетевых интерфейсов).А теперь представьте что такая подготовка может быть массовой, допустим 20 серверов в день (пусть и не каждый).Я думаю, вы согласитесь, что если все эти рутинные операции автоматизировать, то это очень сильно облегчит вам или инженеру, который подготавливает сервера, работу. И скорее всего, те, кто уже сталкивался с подобной массовой подготовкой, уже что-то придумал для себя.Я же вам хочу рассказать о своем (хотя возможно я не одинок в выборе инструмента) выборе. Этот выбор основан на HP scripting toolkit. HPST представляет собой обрезанный дистрибутив SuSE 11×64 SP3 (в HPST версии 9.60 от 18.02.14), в котором присутствует набор утилит для работы с серверами HP.Но я работаю не только с серверами HP, а еще с IBM и FUJITSU. И практически у каждого производителя есть свой подобный набор утилит. (Насколько я знаю, подобные наборы появились не очень давно, не более 3-х лет назад. Но могу ошибаться)Почему я выбрал linux, думаю пояснять не требуется. Здесь нужна его простота и гибкость. А вот почему мой выбор пал именно на HP, сейчас поясню.Приведу особенности различных scripting toolkit`ов:

IBM scripting toolkit for linux. По сути это rpm пакет объемом около 800MB. И если у вас небольшой набор моделей серверов IBM, которые требуется подготавливать, то вам понадобятся максимум 100MB из них. Этот RPM пакет, на самом деле, ставит программу с веб-интерфейсом (с соответствующимися зависимостями). Зайдя в которую вы выберете то, что вам нужно и по вашему выбору программа скачивает с сайта IBM архив с нужными утилитами и соберет из этого всего образ cd-диска. Почему это называется scripting toolkit я не понял. В итоге я скачивал отдельно утилиты для IBM (и у меня получилось менее 20MB). FUJITSU scripting toolkit for linux. У этого производителя набор представлен в виде архива tgz. Объем около 70 MB. И в нем есть папки с утилитами. Но, если вы хотите сделать live-cd или live-net загрузочный минидистрибутив, который будет выполнять необходимые вам действия, то с этим заморочка. Вам придется скачать дистрибутив RedHat или SuSE и самому внести утилиты и скрипты в него, отредактировав настройки программы установщика (т.е. этот тулкит, по сути, будет дополнением к дистрибутиву). HP scripting toolkit for linux. Вы скачиваете архив tar.gz объемом 120 MB. Разархивировав его вы увидите несколько папок, скрипт для создания iso’шника и проч. И немного посмотрев что к чему, вы поймете что это самый продуманный и гибкий scripting toolkit из вышеописанных. Вы можете сразу создать iso файл. Загрузиться с него по cd или по сети и пользоваться утилитами hp. А это — то, что нужно. Итак, я выбрал HPST как основу…При создании системы, участие оператора, который подготавливает сервера, я видел таким:

Распаковать сервер. Внести данные в файл настроек для серверов на сервере (/tftpboot/settings/servers). Подключить сервер на место инсталляции (подключение кабеля питания и кабеля локальной сети). Выбрать загрузку по сети, PXE. (на новых серверах с пустыми жесткими дисками даже этого делать не требуется) Ждет готовности. Теперь детально опишу создание и, попутно, работу системы.Итак, для начала необходимо: Подготовить главный сервер, с помощью которого и будет происходить установка по сети. Скачать HPST, прошивки и утилиты для серверов (утилиты для HP уже есть в HPST). Т.к. у меня уже был мало-используемый сервер на OpenSuSE 11.2, я решил выбрать именно его в качестве главного.На главном сервере установил (проверил чтобы были установлены) следующие пакеты: SSH server DHCP server TFTP server pxelinux (пакет syslinux) FTP server SMB server NTP server Моя структура папок на главном сервере:/srv/images/ (папка с готовыми образами для серверов-клиентов) /srv/nfs_share/ (папка с файлами виртуальных машин) /srv/ftp/ (здесь лежит файл автоответов для установки ESXi) /tftpboot/ (корневая директория TFTP сервера) /tftpboot/pxelinux.cfg/ (файлы меню загрузки TFTP сервера) /tftpboot/hpst/ (загрузочные файлы hpst) /tftpboot/hpst/fwupdate/ (файлы для обновления прошивок (пример подпапки /tftpboot/hpst/fwupdate/ml350p)) /tftpboot/hpst/hwconf/ (файлы настроек BIOS и iLO) /tftpboot/hpst/scripts/ (скрипты) /tftpboot/hpst/utils/ (утилиты) /tftpboot/esxi51hp/ (загрузочные и установочные файлы ESXi) /tftpboot/esxi51fj/ /tftpboot/settings/servers (файл настроек для настройки ОС) Как настраивать pxelinux я здесь описывать не буду. Приведу для ознакомления свой файл /tftpboot/pxelinux.cfg/hpst (/tftpboot/pxelinux.cfg/default ссылается на него)Первое меню рабочее, второе для отладки. prompt 0timeout 270menu title PXE boot menu

label autoinstallmenu label STK autoinstallmenu defaultkernel hpst/vmlinuzappend initrd=hpst/initrd.img root=/dev/ram0 rw ramdisk_size=475844 ide=nodma ide=noraid pnpbios=off numa=off media=net iso1=nfs://192.168.200.1/tftpboot/hpst/hpst.iso sstk_conf=toolkit.conf sstk_script=/mount.sh sstk_script_cmd=master-install.sh hostname=hpst-

label shellmenu consolekernel hpst/vmlinuzappend initrd=hpst/initrd.img root=/dev/ram0 rw ramdisk_size=475844 ide=nodma ide=noraid pnpbios=off numa=off media=net iso1=nfs://192.168.200.1/tftpboot/hpst/hpst.iso sstk_conf=toolkit.conf sstk_script=/mount.sh sstk_script_cmd=shell.sh hostname=hpst-

Итак, как я подготовил HPST: Скачал архив, распаковал. Создал скрипт mount.sh в папке scripts #!/bin/bash scmd=$(cat /proc/cmdline | sed 's/ /\n/g' | grep sstk_script_cmd | awk -F»=» '{print $2}') cp /mnt/192.168.200.1/tftpboot/hpst/scripts/* /TOOLKIT/ #192.168.200.1 это адрес главного сервера. exec /TOOLKIT/$scmd Скопировал initrd.img и vmlinuz в папку /tftpboot/hpst/ Запустил скрипт mkiso.sh hpst.iso Скопировал hpst.iso в папку /tftpboot/hpst Для утилит FUJITSU и IBM необходимо отдельно скачать их и скопировать их в /tftpboot/hpst/utils.Как происходит загрузка по сети сервера-клиента:

Сервер-клиент загружает PXE-ROM сетевой карты и обращается к серверу DHCP в локальной сети для получения сетевого адреса. Сервер DHCP выдает адрес, а также инструкцию о дальнейшей загрузке через PXE-сервер. Сервер-клиент загружает сетевой загрузчик (файл pxelinux.0), дальнейшая загрузка происходит на основе параметров в файлах-меню (default, hpst) Выбирается пункт меню (по выбору пользователя либо по таймауту). Происходит загрузка на основе полученных параметров. Загружается образ HPST Скрипт mount.sh монтирует необходимые папки с главного сервера, копирует скрипты с сервера и передает управление скрипту master-install.sh Порядок запуска скриптов выглядит примерно так: master-install (главный скрипт) sharefunctions (общие функции) fwupdate (обновление прошивок) diagnostic (элементарная диагностика) biosconf (настройка биоса/уефи) clockfix (настройка времени на мат. плате) raidconf (настройка логических томов) preinstall (предустановка следующего этапа подготовки) srmconf (настройка интерфейса удаленного интерфейса) Данные о том, что это за сервер я получаю с помощью DMI. Я получаю информацию о производителе, о модели, о серийном номере сервера. Master-install скрипт, согласно описанным в нем правилам, управляет очередью запуска необходимых скриптов. Его поведение зависит от модели сервера и от устанавливаемой конфигурации. Он реагирует на возвращаемые коды предыдущих комманд. Допустим после успешного обновления прошивок или настройки биоса необходимо перезагрузиться. А после серьезной ошибки необходимо остановить весь процесс выполнения.В самом HPST, как вы заметили лежит только скрипт mount.sh. Все остальное, скрипты, файлы прошивок, файлы настроек биоса, утилиты, копируются с главного сервера при необходимости. Это добавляет дополнительную гибкость системы при обновлении ее отдельных компонентов.У вас наверняка появились вопросы, что такое preinstall и как работает srmconf: Выше было сказано что оператору необходимо внести строку с настройками в определенный файл. Эта строка имеет вид: <серийный номер> <сетевое имя> <подсеть> [<имя образа>] [<часовой пояс>]

пример строки: YKHL001234 NETNAME 10.77.236.128/26 tz=ektCZ230123AA NETNAME 10.90.165.0/24

Становится понятно, что скрипт srmconf ищет серийный номер сервера в этом файле и настраивает iLO/iRMC/IMM соответственно указанным настройкам. setting_str=$(grep $SYSSN /tmp/servers) S_NAME=$(echo $setting_str | awk -F» » '{print $2}') NETF=$(echo $setting_str | sed 's/ /\n/g' | grep \/) S_TZ=$(echo $setting_str | sed 's/ /\n/g' | grep «tz=» | sed 's/tz=//g') NET=»$(echo $NETF | awk -F»/» '{print $1}')» SUBNET=»$(echo $NETF | awk -F»/» '{print $2}')» … … case »$SYSMAN» in «FUJITSU»*) fujitsu_prep fnc_eecdcp STATUS=$? [ $STATUS -ne 0 ] && msge »$0: Error during fnc-eecdcp» ;; «HP») fnc_hponcfg STATUS=$? [ $STATUS -ne 0 ] && msge »$0: Error during fnc-hponcfg» ;; «IBM») fnc_ibm_immconf STATUS=$? [ $STATUS -ne 0 ] && msge »$0: Error during fnc_ibm_immconf» ;; esac Использование жесткого диска для установки на нем временного загрузчика для дальнейшей подготовки: В HPST имеется много полезного для настройки сервера, но все же там нет ряда полезных программ… например там нет ssh-клиента, утилиты mdadm или архиватора dar. Поэтому, при необходимости, я использую дополнительный сетевой образ для продолжения подготовки (например для развертывания образа файловой системы) на базе system rescue cd.Или, если в правилах master скрипта сказано, что для данной модели сервера планируется установка гипервизора, то используется ESXi.Также можно запускать полноценную установку различной О.С. (В инструкции по HPST есть соответствующая информация).Но! Как же я смогу передать управлению другим установщикам или сетевым образам, если у меня все автоматизированно? Для этого я использую сам жесткий диск как элемент передачи управления загрузки.Скрипт preinstall копирует необходимые файлы загрузки на жесткий диск (все кроме файловой системы) и устанавливает временный загрузчик (syslinux).Далее в скрипте master-install.sh указана перезагрузка. Система загружается со своего жесткого диска, с временного раздела. Часть файлов грузится с жесткого диска, а часть с главного сервера. В соответствии с типом выбранного П.О. происходит дальнейшая подготовка сервера.При этом если используется system rescue cd, то я могу передать дополнительные параметры в файл syslinux.cfg (имя образа для развертывания и прочее). А если с помощью гипервизора, то я просто копирую файлы установщика и перезагружаюсь (на сервере присутствует файл ответов для автоматической установки гипервизора и автоматического копирования эталонных виртуальных машин).

Хочу добавить, что в образе system rescue cd имеется много полезных утилит и программ. Но как основу для системы я его не могу использовать, т.к. он основан на gentoo. А утилиты для серверов больше ориентированы на корпоративные дистрибутивы linux, RedHat и SuSE.В данной статье я скажу лишь пару слов о сетевом образе на базе system rescue cd, так как его описание и создание-редактирование выходит за рамки данной статьи.С помощью sysresccd можно следующее:

Создать при необходимости программный RAID-массив. Развернуть сохраненный образ файловой системы (как linux так и windows (разворачиваю образы для толстых клиентов windows с помощью ntfsclone)). Произвести окончательную настройку сервера согласно файлу настроек. Собственно скрипты (Приведу основную суть. Прошу прощения за «обилие» комментариев): master-install.sh #!/bin/bash . sharefunctions.sh msgi » --- MASTER-INSTALL section: --- » fwupdate.sh [ »$?» != »0» ] && exiterror diag.sh [ »$?» != »0» ] && exiterror biosconf.sh r [ »$?» != »0» ] && exiterror clockfix.sh cp /mnt/settings/servers /tmp/servers setting_str=$(grep $SYSSN /tmp/servers) SECCFG=«sec100 xorgtx100» case »$SYSNAME» in … «ProLiant ML310e Gen8»*) SECCFG=«sec100 xorgml310» [ »$SW_TYPE» = «BB» ] && exiterror ;; «ProLiant ML350p Gen8») raidconf.sh «P420i» [ »$?» != »0» ] && exiterror SECCFG=«sec200ihp» [ »$SW_TYPE» = «AA» ] && SECCFG=«sec100 sd» ;; … esac [ »$SECCFG» = «sec100» -a »$SW_TYPE» = «BB» ] && exiterror preinstall.sh $SECCFG [ »$?» != »0» ] && exiterror if [ $(echo $SYSNAME | grep TX100 | wc -l) -eq 0 ] ; then srmconf.sh … fi … reboot msgi » --- MASTER-INSTALL end --- » biosconf.sh #!/bin/bash HWDIR=/mnt/192.168.200.1/tftpboot/hpst/hwconf BIOSVENDOR=$(dmidecode -s bios-vendor | sed 's/\ *$//') BIOSVER=$(dmidecode -s bios-version | sed 's/\ *$//') BIOSDATE=$(dmidecode -s bios-release-date | sed 's/\ *$//') . sharefunctions.sh BIOSFNAME=$(echo »$BIOSVENDOR» — »$BIOSVER» — »$BIOSDATE» — »$SYSMAN» — »$SYSNAME» | md5sum | cut -d » » -f 1) BIOSFINAME=$BIOSFNAME».info» #генерирование уникального имени для файла настройки BIOS

function savebios () { … } … function restorebios () { … case »$BIOSVENDOR» in ;; «HP») … msgi » Restoring BIOS settings.» #восстановление настроек BIOS для HP hprcu -l -f $HWDIR/$BIOSFNAME >> $LOGNAME [ $? -ne 0 ] && msge »$0: hprcu exit status ne 0» [ »$(echo $SYSNAME | grep ML310e | wc -l)» = »1» -a »$(fdisk -l | grep sdb | wc -l)» = »0» ] && msgi » rebooting to pxe» && reboot pxe #для модели ML310e: если настройки неверные, то настроить BIOS и перезагрузится msgi » successfully» ;; … ;; *) msge »$0: Unknown bios vendor» 103 ;; esac }

####################################################################################

msgi » --- BIOSCONF section: --- »

case »$BIOSVENDOR» in «FUJITSU // American Megatrends Inc.») cp -R /mnt/192.168.200.1/tftpboot/hpst/utils/fuji_afulnx /TOOLKIT/afulnx ;; «FUJITSU »*»// Phoenix Technologies Ltd.») cp -R /mnt/192.168.200.1/tftpboot/hpst/utils/fuji_deskview /TOOLKIT/deskview [ -L /opt/deskview ] || ln -s /TOOLKIT/deskview /opt ;; «IBM Corp.») cp /mnt/192.168.200.1/tftpboot/hpst/utils/ibm/* /TOOLKIT/ ;; esac … case »$1» in «s») savebios ;; «r») restorebios ;; *) msge »$0: Can accept only r or s» 103 ;; esac msgi » --- BIOSCONF end --- » clockfix.sh #!/bin/bash . sharefunctions.sh msgi » --- CLOCKFIX section: --- » ntpd -n -q -p 192.168.200.1 | tee -a $LOGNAME export TZ=MSK-4 hwclock --systohc hwclock | tee -a $LOGNAME msgi » --- CLOCKFIX end --- » fwupdate.sh #!/bin/bash FWDIR=/mnt/192.168.200.1/tftpboot/hpst/fwupdate mkdir /tmp/fwupd > /dev/null 2>&1 . sharefunctions.sh fujitsu_fw () { … }

hp_fw () { cp -R $FWDIR/$1/* /tmp/fwupd/ [ -f /tmp/fwupd/version ] || msge »$0: «file version not found» savBIOSDATE=$(grep ^BIOSDATE= /tmp/fwupd/version | sed 's/^BIOSDATE=//') savLANFWVER=$(grep ^LANFWVER= /tmp/fwupd/version | sed 's/^LANFWVER=//') thenreboot=0

if [ »$(dmidecode -s bios-release-date | sed 's/\ *$//')» != »$savBIOSDATE» ] ; then msgi » Updating BIOS …» cd /tmp/fwupd/bios ./cpqsetup -s >> $LOGNAME [ $? -ne 0 ] && msge »$0: «cpqsetup exit status ne 0» msgi » successfully» let thenreboot=$thenreboot+1 fi

if [ -d /tmp/fwupd/ilo ] ; then msgi » Updating iLO4 …» cd /tmp/fwupd/ilo ./flash_ilo4 >> $LOGNAME << EOF y EOF STATUS=$? [ $STATUS -ne 0 -a $STATUS -ne 2 ] && msge "$0: ""error while flashing ilo" if [ $STATUS -eq 2 ] ; then msgi " skipped because iLO already updated" else msgi " successfully" let thenreboot=$thenreboot+1 fi fi ... ... [ $thenreboot -gt 0 ] && reboot pxe }

####################################################################################

msgi » --- FWUPDATE section: --- »

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib:/TOOLKIT/frm/bin:/TOOLKIT/eecDaemon/lib case »$SYSNAME» in «PRIMERGY TX100 S3P») fujitsu_fw tx100s3p ;; «PRIMERGY TX150 S6») fujitsu_fw tx150s6 ;; «PRIMERGY TX150 S7») fujitsu_fw tx150s7 ;; «ProLiant ML310e Gen8») hp_fw ml310e ;; «ProLiant ML310e Gen8 v2») hp_fw ml310ev2 ;; «ProLiant ML350p Gen8») hp_fw ml350p ;; esac msgi » --- FWUPDATE end --- » preinstall.sh #!/bin/bash FDISK=/dev/sda FPART=/dev/sda1 MNTBOOT=/mnt/local RTFTPDIR=192.168.200.1:/tftpboot … . sharefunctions.sh msgi » --- PREINSTALL section: --- » cp -R /mnt/192.168.200.1/tftpboot/hpst/utils/syslinux/* /TOOLKIT/ … ALTIMAGE=$(echo $setting_str | awk -F» » '{print $4}') … parted -s $FDISK mklabel msdos ms-sys -s $FDISK >> $LOGNAME parted -s $FDISK mkpart p 1 500M parted -s $FDISK toggle 1 boot mkfs.vfat $FPART >> $LOGNAME … syslinux $FPART … case »$SECCFG» in «sec100») cp $TFTPDIR/initram.igz $MNTBOOT/syslinux/ cp $TFTPDIR/rescue64 $MNTBOOT/syslinux/ ;; «sec200ihp») cp -R $TFTPDIR/esxi51hp/* $MNTBOOT/ mv $MNTBOOT/boot.cfg.local $MNTBOOT/boot.cfg cp $MNTBOOT/mboot.c32 $MNTBOOT/syslinux/ ;; … esac cp $TFTPDIR/pxelinux.cfg/sec/$SECCFG $MNTBOOT/syslinux/syslinux.cfg … [ $(echo $ALTIMAGE | grep bo | wc -l) -gt 0 ] && sed -i 's/imagename=[A-Za-z0–9_\.\-]*/imagename='$ALTIMAGE'/' $MNTBOOT/syslinux/syslinux.cfg [ »$SDMODE» != » ] && sed -i 's/disktype=md/disktype=sd/g' $MNTBOOT/syslinux/syslinux.cfg … msgi » --- PREINSTALL end --- » Заключение: Данная статью я решил написать в основном для того чтобы поделиться идеей о том, что можно без проблем создать собственную систему для подготовки серверов. Причем я не уверен что на данный момент существуют какие либо аналоги.P.S.: в дополнение к вышеописанному, с помощью скриптов можно также сделать отправку отчетов о готовности серверов либо об ошибках при подготовке по почте.

© Habrahabr.ru