Сколько Времени Занимает Умелый Или Массовый Запуск Серверов С Минимумом Трудозатрат?



Сколько времени занимает умелый или массовый запуск серверов с минимумом трудозатрат?

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

Как развернуть несколько сотен серверов в географически удалённом дата-центре без физического доступа к оборудованию? Как компания Баду решает эту проблему? Об этом мы расскажем вам на следующем примере.

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

Если эта тема покажется вам интересной, мы будем рады рассказать об установке ОС на серверах и настройке рабочей среды, которая также имеет свои тонкости.

Итак, перед нами стояла задача развернуть несколько сотен новых серверов, которые только что поступили в два наших дата-центра.

В случае успеха вывод должен быть:

  • описание всех «аппаратных» компонентов каждого сервера;
  • соответствие заказанного оборудования полученному (бывают случаи, когда полученная конфигурация не та, что была заказана);
  • готовая к установке ОС и серверное ПО (с обновленными версиями RAID-прошивок, ПЗУ и т. д., настроенными RAID-массивами, без аппаратных проблем).

Информация, которой мы располагали:
  • серверы монтируются в стойки/шкафы и включаются;
  • известны заводские логины и пароли;
  • на всех серверах есть IPMI-интерфейс (интерфейс управления);
  • на серверах отсутствуют какие-либо предустановки от производителя (в частности, не настроен RAID, не заданы настройки энергопотребления);
  • все серверы подключены к сетевому оборудованию как минимум с двумя интерфейсами и расположены в заранее известном месте.

    ВЛАН ;

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

Конечно, были и некоторые дополнительные трудности.

Во-первых, у наших инженеров не было физического доступа к серверам.

Во-вторых, поставляемое оборудование имело несколько различных конфигураций.

А в-третьих, все, что мы знали о наших серверах, это на самом деле только их заводские логины и пароли.

Чаще всего задачи такого рода предлагают решать с помощью дд , ПХЕ -серверы и rsync , постановка задач, вовлечение сотрудников дата-центра.

Но мы подошли к вопросу по-другому.

Решение, которое мы нашли, предполагает некоторую автоматизацию.

Обратите внимание, что все приведенные ниже скрипты предназначены исключительно для информационных целей и не претендуют на совершенство.

Для выполнения задачи нам понадобилось:

  • несколько текстовых файлов, которые удаляются по завершении работы;
  • несколько очень простых скриптов, использующих ожидание;
  • настроен сервер сетевой загрузки (в нашем случае это xCAT );
  • настроенный и работающий образ ОС (неважно какой, главное, чтобы в этом образе были все необходимые нам утилиты);
  • настроенная система инвентаризации оборудования (в нашем случае это проект glpi ).

Сначала нам нужно было узнать, какие IP-адреса получили наши новые серверы.

Для этого мы сделали текстовый файл узлов с данными о логинах и паролях в формате

 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

Вместе с данным постом часто просматривают: