Как развернуть несколько сотен серверов в географически удалённом дата-центре без физического доступа к оборудованию? Как компания Баду решает эту проблему? Об этом мы расскажем вам на следующем примере.
Ниже мы поговорим о самом первом этапе настройки серверного оборудования; о том, как быстро и в срок мы выполнили конкретную задачу, а не о написании оптимальных сценариев.
Если эта тема покажется вам интересной, мы будем рады рассказать об установке ОС на серверах и настройке рабочей среды, которая также имеет свои тонкости.
Итак, перед нами стояла задача развернуть несколько сотен новых серверов, которые только что поступили в два наших дата-центра.
В случае успеха вывод должен быть:
- описание всех «аппаратных» компонентов каждого сервера;
- соответствие заказанного оборудования полученному (бывают случаи, когда полученная конфигурация не та, что была заказана);
- готовая к установке ОС и серверное ПО (с обновленными версиями RAID-прошивок, ПЗУ и т. д., настроенными RAID-массивами, без аппаратных проблем).
- серверы монтируются в стойки/шкафы и включаются;
- известны заводские логины и пароли;
- на всех серверах есть IPMI-интерфейс (интерфейс управления);
- на серверах отсутствуют какие-либо предустановки от производителя (в частности, не настроен RAID, не заданы настройки энергопотребления);
- все серверы подключены к сетевому оборудованию как минимум с двумя интерфейсами и расположены в заранее известном месте.
ВЛАН ;
- новые серверы получают свои IP-адреса динамически, поэтому они доступны сразу после включения;
- известно, сколько серверов каких конфигураций должно было быть поставлено.
Во-первых, у наших инженеров не было физического доступа к серверам.
Во-вторых, поставляемое оборудование имело несколько различных конфигураций.
А в-третьих, все, что мы знали о наших серверах, это на самом деле только их заводские логины и пароли.
Чаще всего задачи такого рода предлагают решать с помощью дд , ПХЕ -серверы и rsync , постановка задач, вовлечение сотрудников дата-центра.
Но мы подошли к вопросу по-другому.
Решение, которое мы нашли, предполагает некоторую автоматизацию.
Обратите внимание, что все приведенные ниже скрипты предназначены исключительно для информационных целей и не претендуют на совершенство.
Для выполнения задачи нам понадобилось:
- несколько текстовых файлов, которые удаляются по завершении работы;
- несколько очень простых скриптов, использующих ожидание;
- настроен сервер сетевой загрузки (в нашем случае это xCAT );
- настроенный и работающий образ ОС (неважно какой, главное, чтобы в этом образе были все необходимые нам утилиты);
- настроенная система инвентаризации оборудования (в нашем случае это проект glpi ).
Для этого мы сделали текстовый файл узлов с данными о логинах и паролях в формате
ILOHOSTNAME1 ILOPASSWORD1 ILOHOSTNAME2 ILOPASSWORD2Эти данные мы получили со стикеров, имеющихся на каждом сервере, с помощью сканера штрих-кода.
Стандартный логин был заранее известен — Администратор.
Пример наклейки:
Теперь мы можем запустить команду, которая собирает для нас совпадения имени хоста и IP-адреса:
for i in $(cat nodes | awk {'print $1'}); do j=$(cat nodes | grep $i | awk {'print $2'}); ssh DHCPD_SERVER_FQDN "sudo cat /var/log/messages | grep $i | tail -1 | sed 's/$/ '$j'/g'"; doneВ результате мы получили строки, подобные приведенным ниже, и добавили их в файл nodeswip:
Jul 1 10:31:23 local@DHCPD_SERVER dhcpd: DHCPACK on 10.10.10.213 to 9c:8e:99:19:3a:68 (ILOUSE125NDBF) via 10.10.10.1 W3G554L7 Jul 1 10:31:35 local@DHCPD_SERVER dhcpd: DHCPACK on 10.10.10.210 to 9c:8e:99:19:b6:aa (ILOUSE125NDBA) via 10.10.10.1 BJCP691P Jul 1 10:31:47 local@DHCPD_SERVER dhcpd: DHCPACK on 10.10.10.211 to 9c:8e:99:19:58:7c (ILOUSE125NDBG) via 10.10.10.1 67MG91SVТеперь нам нужно было создать стандартного пользователя с набором доступных ему прав на всех IPMI-интерфейсах новых серверов.
Здесь необходимо было получить MAC-адреса сетевых и мгм-интерфейсов для дальнейшего структурирования.
Для этого мы выполнили команду
for i in $(cat nodeswip | awk {'print $8'}); do j=$(grep $i nodeswip|awk {'print $14'}); expect expwip.sh $i $j | grep Port1NIC_MACAddress; done;где sh-скрипт expwip.sh выглядел так:
#!/usr/bin/expect set timeout 600 set ip [lindex $argv 0] set pass [lindex $argv 1] spawn ssh Administrator@$ip set answ "$pass" set comm1 "create /map1/accounts1 username=deployer password=PASSWORD name=deployer group=admin,config,oemhp_vm,oemhp_power,oemhp_rc" expect "Administrator@$ip's password:" send "$answ\r" expect "</>hpiLO->" send "$comm1\r" expect "</>hpiLO->" send "show /system1/network1/Integrated_NICs\r" expect "</>hpiLO->" send "exit\r" expect eofПолученный список MAC-адресов сетевых интерфейсов наших серверов был добавлен в редактор таблиц, что позволило увидеть все совпадения.
Затем мы выполнили действия по созданию конфига DHCP-сервера, после чего отправили серверы в сетевую загрузку.
После этого нам нужно было перезагрузить IPMI-интерфейсы, чтобы они заняли предназначенные для них адреса.
Это было сделано с помощью команды
expect reset_ilo.sh $i $jгде $i — полученный ранее адрес сервера, $j — пароль администратора завода Скрипт reset_ilo.sh выглядел так:
#!/usr/bin/expect set timeout 600 set ip [lindex $argv 0] set pass [lindex $argv 1] spawn ssh Administrator@$ip set answ "$pass" set comm1 "reset /map1" expect "Administrator@$ip's password:" send "$answ\r" expect "</>hpiLO->" send "$comm1\r" expect eofДалее мы перешли к автоматическому формированию RAID-массивов, обновлению всех возможных версий прошивок на оборудовании и получению исчерпывающей информации о конфигурации сервера в удобной форме.
Все эти операции выполнялись во время сетевой загрузки.
Сначала был запущен скрипт инициализации, который «подготовил» RAID-массив:
LD=`/usr/sbin/hpacucli ctrl slot=0 logicaldrive all show|awk '$0 ~ /RAID 5/ || /RAID 0/ || /RAID 1/ {print $1" "$2}'` LD=${LD:-NULL} if [ "$LD" != "NULL" ]; then /usr/sbin/hpacucli ctrl slot=0 $LD delete forced; fi /usr/sbin/hpacucli ctrl slot=0 create type=ld drives=`/usr/sbin/hpacucli ctrl slot=0 physicaldrive all show|awk '$1 ~ /physicaldrive/{split($2,arr,":");print $2}'|tr "\n" ","|sed 's/,$//'` raid=1+0 if [ `/usr/sbin/hpacucli ctrl slot=0 physicaldrive all show | grep physicaldrive | wc -l` -gt 1 ]; then r=`/usr/sbin/hpacucli ctrl slot=0 physicaldrive all show | grep physicaldrive | wc -l`; let t=$r%2; if [ $t -ne 0 ]; then let tl=$r-1; /usr/sbin/hpacucli ctrl slot=0 create type=ld drives=`/usr/sbin/hpacucli ctrl slot=0 physicaldrive all show|grep physicaldrive | head -$tl|awk '$1 ~ /physicaldrive/{split($2,arr,":");print $2}'|tr "\n" ","|sed 's/,$//'` raid=1+0; /usr/sbin/hpacucli ctrl slot=0 array all add spares=`/usr/sbin/hpacucli ctrl slot=0 physicaldrive all show|grep physicaldrive | tail -1|awk '$1 ~ /physicaldrive/{split($2,arr,":");print $2}'|tr "\n" ","|sed 's/,$//'`; fi; fiВ результате мы получили 1+0 или «зеркало».
Затем был запущен агент, который отправлял информацию об оборудовании в нашу систему инвентаризации.
Мы используем агента инвентаризации fusion, в настройках которого мы ничего не меняли, кроме адреса сервера сбора информации.
Результат виден в интерфейсе Инвентарь Фьюжн :
Последним, что нужно было запустить, был скрипт, который обновил всю прошивку на железе.
Для этого было использовано несколько классов в кукольный , которые выполнялись на новых серверах.
Ниже приведен пример класса, который «смотрит» на текущую конфигурацию сервера и при необходимости обновляет версию прошивки RAID-контроллера до необходимой.
Остальные обновления прошивки оборудования проводились по тому же сценарию.
class hp_raid_update_rom { exec { "updateraid": command => "wget -P /tmp/ http://WEBSERVER/install/soft/firmware/hp/raid/5_12/CP015960.scexe ; wget -P /tmp/ http://WEBSERVER/install/soft/update_hp_raid_firmware_512.sh ; chmod +x /tmp/CP015960.scexe; chmod +x /tmp/update_hp_raid_firmware_512.sh; /tmp/update_hp_raid_firmware_512.sh; echo '5.12' > /tmp/firmware_raid", onlyif => "/usr/bin/test `/sbin/lspci | grep -i 'Hewlett-Packard Company Smart Array G6' | wc -l` != '0' && /usr/bin/test `/usr/sbin/hpacucli ctrl all show detail | grep -i firmware | awk {'print \$3'}` != '5.12' && ( [ ! -f /tmp/firmware_raid ] || [ `cat /tmp/firmware_raid` != '5.12' ])", path => "/usr/ bin:/bin ", require => Exec["remove_report_file", "remove_empty_report_file"], } exec { "remove_report_file": command => "/bin/rm /tmp/firmware_raid", onlyif => "[ -f /tmp/firmware_raid ] && [ `cat /tmp/firmware_raid` == `/usr/sbin/hpacucli ctrl all show detail | grep -i firmware | awk {'print \$3'}` ]", path => "/usr/ bin:/bin ", } exec { "remove_empty_report_file": command => "/bin/rm /tmp/firmware_raid", onlyif => "[ -f /tmp/firmware_raid ] && [ `cat /tmp/firmware_raid | wc -l` == '0' ]", path => "/usr/ bin:/bin ", } }Таким образом, мы решили проблему, используя только собственные ресурсы.
Все наши машины были готовы к установке боевой ОС, установке программного обеспечения и началу обслуживания пользователей Badoo. Все вышесказанное описывает лишь подготовительный этап настройки оборудования; вопросы установки ОС и настройки рабочей среды выходят за рамки статьи.
Если вам интересна эта тема, мы будем рады подготовить материал о xCAT и puppet и поделиться своими способами решения конкретных задач с помощью этих инструментов.
Свои предложения, вопросы и замечания по вышеизложенному вы смело можете оставлять в комментариях – мы всегда открыты к диалогу! Компания Баду Теги: #badoo #badoo #xcat #glpi #puppet #deploy #badoo.com #expect #HP #ilo #puppet
-
Приветствуем Май И 2Гис 3.6
19 Oct, 24 -
=Date(Z)-255?:`С Днем Программиста`;
19 Oct, 24 -
Поиск Такой Поиск
19 Oct, 24 -
Почему Ничего Не Меняется?
19 Oct, 24 -
Новый Аглинк.ру
19 Oct, 24