...

среда, 9 апреля 2014 г.

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

Предположим вам необходимо подготовить новый сервер (или использовать заново старый сервер) под известные вам задачи.

Под подготовкой я подразумеваю следующее:


  • посмотреть, нет ли на сайте производителя обновлений прошивок и если есть то обновить их (BIOS/UEFI, интерфейс удаленного управления, RAID-контроллер, жесткие диски, сетевая карта и проч.)

  • настроить BIOS/UEFI

  • поправить время на материнской плате

  • настроить интерфейс удаленного управления

  • создать тома на RAID-контроллере

  • создать разделы (партиции)




Далее, подготовить ОС (вариант из):


  • установить ОС

  • развернуть готовый образ ФС

  • установить гипервизор и скопировать готовые виртуальные машины




Далее первичная настройка ОС (как минимум, настройка сетевых интерфейсов).

А теперь представьте что такая подготовка может быть массовой, допустим 20 серверов в день (пусть и не каждый).

Я думаю, вы согласитесь, что если все эти рутинные операции автоматизировать, то это очень сильно облегчит вам или инженеру, который подготавливает сервера, работу. И скорее всего, те, кто уже сталкивался с подобной массовой подготовкой, уже что-то придумал для себя.

Я же вам хочу рассказать о своем (хотя возможно я не одинок в выборе инструмента) выборе. Этот выбор основан на HP scripting toolkit. HPST представляет собой обрезанный дистрибутив SuSE 11 x64 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 0

timeout 270

menu title PXE boot menu


label autoinstall

menu label STK autoinstall

menu default

kernel hpst/vmlinuz

append 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 shell

menu console

kernel hpst/vmlinuz

append 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.

Как происходит загрузка по сети сервера-клиента:



  1. Сервер-клиент загружает PXE-ROM сетевой карты и обращается к серверу DHCP в локальной сети для получения сетевого адреса.

  2. Сервер DHCP выдает адрес, а также инструкцию о дальнейшей загрузке через PXE-сервер.

  3. Сервер-клиент загружает сетевой загрузчик (файл pxelinux.0), дальнейшая загрузка происходит на основе параметров в файлах-меню (default, hpst)

  4. Выбирается пункт меню (по выбору пользователя либо по таймауту).

  5. Происходит загрузка на основе полученных параметров.

  6. Загружается образ HPST

  7. Скрипт mount.sh монтирует необходимые папки с главного сервера, копирует скрипты с сервера и передает управление скрипту master-install.sh




Порядок запуска скриптов выглядит примерно так:


  1. master-install (главный скрипт)

  2. sharefunctions (общие функции)

  3. fwupdate (обновление прошивок)

  4. diagnostic (элементарная диагностика)

  5. biosconf (настройка биоса/уефи)

  6. clockfix (настройка времени на мат. плате)

  7. raidconf (настройка логических томов)

  8. preinstall (предустановка следующего этапа подготовки)

  9. srmconf (настройка интерфейса удаленного интерфейса)




Данные о том, что это за сервер я получаю с помощью DMI. Я получаю информацию о производителе, о модели, о серийном номере сервера. Master-install скрипт, согласно описанным в нем правилам, управляет очередью запуска необходимых скриптов. Его поведение зависит от модели сервера и от устанавливаемой конфигурации. Он реагирует на возвращаемые коды предыдущих комманд. Допустим после успешного обновления прошивок или настройки биоса необходимо перезагрузиться. А после серьезной ошибки необходимо остановить весь процесс выполнения.

В самом HPST, как вы заметили лежит только скрипт mount.sh. Все остальное, скрипты, файлы прошивок, файлы настроек биоса, утилиты, копируются с главного сервера при необходимости. Это добавляет дополнительную гибкость системы при обновлении ее отдельных компонентов.

У вас наверняка появились вопросы, что такое preinstall и как работает srmconf:

Выше было сказано что оператору необходимо внести строку с настройками в определенный файл. Эта строка имеет вид:


<серийный номер> <сетевое имя> <подсеть> [<имя образа>] [<часовой пояс>]


пример строки:

YKHL001234 NETNAME 10.77.236.128/26 tz=ekt

CZ230123AA 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=$http://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/http://ift.tt/1kKmiOV $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.: в дополнение к вышеописанному, с помощью скриптов можно также сделать отправку отчетов о готовности серверов либо об ошибках при подготовке по почте.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

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