Масштабное системное администрирование
Настройка и управление системой из нескольких
сотен серверов
Александр Берсенёв
Вычислительный кластер. Вид издалека
План доклада
Случай 0. Включили N новых узлов. Установка ОС и ПО
Случай 1. Что-то идёт немного не так на N узлах(Easy)
Случай 2. + … и непонятно как быстро исправить (Medium)
Случай 3. + … и потерялся доступ к ним (Hard)
Случай 4. + … и нельзя перезагружаться (Nightmare)
Примечание: N > 100
Случай 0 Включили N новых узлов
N = 1 → установка с USB или CDROM
N > 100 → установка по сети
UEFI Boot Screen
DHCP: подготовка к загрузке по TFTP
/etc/dhcp/dhcpd.conf:
group {
filename "phi/pxelinux.0";
host phi1 {hardware ethernet f4:52:14:19:df:21; fixed-address 192.168.81.1; }
host phi2 {hardware ethernet f4:52:14:19:e1:e1; fixed-address 192.168.81.2; }
host phi3 {hardware ethernet f4:52:14:19:e1:c1; fixed-address 192.168.81.3; }
}
group {
filename "gpu/pxelinux.0";
host gpu1 {hardware ethernet f4:52:14:22:78:f1; fixed-address 192.168.81.11; }
host gpu2 {hardware ethernet f4:52:14:19:db:11; fixed-address 192.168.81.12; }
host gpu3 {hardware ethernet f4:52:14:22:79:01; fixed-address 192.168.81.13; }
}
Конфигурация загрузки для запуска
инсталлятора
/var/lib/tftpboot/gpu/pxelinux.cfg/default:
default installauto
timeout 300
label installauto
kernel vmlinuz
append initrd=initrd.img ks=http://192.168.80.1/ks/setup-phi.cfg ksdevice=bootif
IPAPPEND 2
Пошла загрузка ядра
Конфиг инсталлятора
Самый главный файл с ответами на вопросы установки
/var/www/ks/setup-phi.cfg (часть 1 из 2):
install
url --url http://192.168.80.1/centos/ # откуда брать дистрибутив
text # выключаем gui
lang en_US.UTF-8
timezone --utc Asia/Yekaterinburg
rootpw --iscrypted $6$AkJqf3$9jk0861a75SAQlG4uDUO8Da..lBNT8fkoc0KGGxg/
services --enabled autofs,nslcd,nscd,munge,slurm # включаем сервисы
services --disabled postfix,NetworkManager # выключаем сервисы
# Разделы на диске
… удалено …
network --bootproto=dhcp --device=enp0s26u1u5u5 --onboot=off
reboot # Перезагрузиться после окончания установки
/var/www/ks/setup-phi.cfg (часть 2 из 2):
repo --name="EPEL" --baseurl=http://mirror.yandex.ru/epel/7/x86_64/ --cost=1001
repo --name="imkn" --baseurl=http://192.168.80.1/imkn_repo/ --cost=1001
%packages
@base
@core
puppet
nss-pam-ldapd
nfs-utils
autofs
%end
%post --log=/root/ks-post.log
rmdir /home /opt/rh /opt
ln -s /misc/common /misc/opt /misc/home /
mount 192.168.80.1:/common /mnt -o nolock,udp,ro,vers=3
rsync -a --cvs-exclude /mnt/admin/configs/all/ /
rsync -a --cvs-exclude /mnt/admin/configs/gpu/ /
%end
Конфиг инсталлятора
Работает инсталлятор
Работает инсталлятор
Работает инсталлятор
Перезагрузка в рабочую систему
Puppet. Настройка узлов
– Программы -> пакеты -> репозиторий
– Список пакетов которые должны бысть установлены -> Puppet -> хосты
/common/packages.pp:
# python's libraries
package { 'numpy': ensure => 'latest' }
package { 'scipy': ensure => 'latest' }
package { 'sympy': ensure => 'latest' }
package { 'net-snmp': ensure => 'latest' }
package { 'python-tables': ensure => 'latest' }
package { 'python-numexpr': ensure => 'latest' }
package { 'python-pyparsing': ensure => 'latest' }
package { 'python-argparse': ensure => 'latest' }
package { 'mpi4py-mpich2': ensure => 'latest' }
package { 'mpi4py-openmpi': ensure => 'latest' }
package { 'python-ply': ensure => 'latest' }
package { 'python-matplotlib': ensure => 'latest' }
Автоконфигурация узлов. Итоги
Новые узлы при подключении сами устанавливаются и настраиваются
Возможно, потребуется добавить одну строчку в конфигурацию
DHCP-сервера (у нас это автоматизировано)
Случай 1. Что-то пошло не так
Кстати: как мы понимаем что что-то пошло не так?
– Icinga (форк Nagios) с кастомными модулями + смс, email
– Система распределения ресурсов
– Тесты для узлов
– Патченный collectl + система визуализации с разбивкой по
задачам
– Фидбек от пользователей
Посмотреть (можно прямо сейчас):
http://umt.imm.uran.ru/procstat.php
https://alexbers.com/stat/
Обнаружился подозрительный узел
… или много подозрительных узлов
Запуск команды на нескольких узлах
A) $ for host in node{10..55}; do ssh "$host" uname -r; done
B) $ for host in node{10..55}; do ssh "$host" uname -r& done
C) $ pdsh -w node[2,4-6,10] uname -r
node2: 2.6.32-573.el6.x86_64
node10: 2.6.32-573.el6.x86_64
node5: 2.6.32-573.el6.x86_64
node6: 2.6.32-573.el6.x86_64
node4: 2.6.32-573.el6.x86_64
2.6.32-573.el6.x86_64
2.6.32-573.el6.x86_64
2.6.32-573.el6.x86_64
2.6.32-573.el6.x86_64
…
Объединение вывода с узлов
$ pdsh -w phi[49-208],node[1-52] uname -r | dshbak -c
----------------
node[2,4-52],phi[49-74,77-176]
----------------
2.6.32-573.el6.x86_64
----------------
phi[75-76]
----------------
2.6.32-358.23.2.el6.x86_64
$ pdsh -w node[1-52] uname -r
node2: 2.6.32-573.el6.x86_64
node10: 2.6.32-573.el6.x86_64
...
Развёртывание интервалов имён на Python
>>> import hostlist
>>> hosts = hostlist.expand_hostlist("node[1-3,17]")
>>> hosts
['node1', 'node2', 'node3', 'node17']
>>> hostlist.collect_hostlist(hosts)
'node[1-3,17]'
>>> hostlist.collect_hostlist(["x1y1","x2y2", "x1y2", "x2y1"])
'x[1-2]y[1-2]'
Параллельное выполнение команды. Итоги
Умеем быстро выполнять команды на группах узлов
Умеем находить узлы, где результат выполнения команд
отличается
Случай 2. Поможет только переустановка ОС
Как загрузиться по сети?
Решение: изменить настройки bios/efi, чтобы узел
грузился по сети и свести задачу к предыдущей
(«перенакатить узел»)
IBM – ASU (Advanced Settings Utility)
$ asu64 set IMM.PXE_NextBootEnabled Enabled
$ reboot
HP – hp-scripting-tools
$ hp-reboot pxe
Синхронизация настроек BIOS/EFI
IBM – ASU (Advanced Settings Utility)
$ asu64 show
HP – hp-scripting-tools
$ conrep --save
$ conrep --load
Удалённое управление BIOS/UEFI. Итоги
Умеем изменять настройки bios/efi
Умеем синхронизировать настройки bios/efi
Случай 3. Потерян доступ к узлам
Доступ через управляющий модуль
В серверы встраивается плата управляющего модуля с
доступом через Ethernet
HP – Integrated Lights-Out
IBM – Integrated Management Module
Нужен API
API дистанционного управления
У HP есть официальный perl'овский API.
И есть неофициальный питоновский:
https://github.com/seveas/python-hpilo:
import hpilo
ilo = hpilo.Ilo(host, login="admin", password="admin")
ilo.set_one_time_boot("network")
ilo.reset_server()
Существует отраслевой стандарт IPMI
$ ipmitool -I lanplus -H host -U admin -P admin chassis
bootparam pxe
Слабая защита в IPMI
Доступ через управляющие модули. Итоги
Большинство производителей серверов встраивают
модули удалённого управления и предоставляют API для них
Если включён IPMI, срочно поместите его в отдельный vlan :)
Случай 4. Всё плохо и нельзя перезагружать узлы
Доступ к консоли через веб – ужасен
Самоподписанные сертификаты
Доступ к консоли через веб – ужасен
Вход на управляющий модуль
Доступ к консоли через веб – ужасен
Вход на управляющий модуль
Доступ к консоли через веб – ужасен
Java. Предупреждение 1
Доступ к консоли через веб – ужасен
Java. Предупреждение 2
Доступ к консоли через веб – ужасен
Java. Предупреждение 3
Доступ к консоли через веб – ужасен
Java. Предупреждение 4
Доступ к консоли через веб – ужасен
Консоль без Copy-Paste и за $$
Правильный доступ к консоли.
Решение: используем удалённый доступ к serial-
порту
– работает copy-paste
– не требует лицензии
– работает по ssh, по ключам, в одну команду
$ ssh admin@node2-mgmt -t console 1
Настраиваем хост на работу с serial-консолью
Необходимо:
– выставить в bios/efi настройку, чтобы процесс
загрузки (до ОС) попадал в serial-port
– добавить serial --unit=1 --speed=115200 в
параметры загрузчика
– добавить console=ttyS1,115200 в параметры ядра
Автоматизируем работу с консолью
import pexpect
import sys
F1 = "x1bOP"
UP = "x1b[A"
DOWN = "x1b[B"
ESC = "x1b"
ssh_args = [ "-l", "admin", sys.argv[1], "-t"]
s = pexpect.spawn("/usr/bin/ssh", ssh_args, logfile=sys.stdout, timeout=180)
s.expect('system> '); s.sendline("reset")
s.expect('system> '); s.sendline("console 1")
s.expect('<F1> Setup'); s.send(F1)
s.expect('Exit Setup'); s.send(DOWN * 4 + "rn")
s.expect('Select Next One-Time Boot'); s.send(DOWN * 8 + "rn")
# skipped
s.expect('Do you want to Reset System'); s.send("y")
Удалённый доступ к консоли. Итоги
Не пользуйтесь веб-интерфейсом, вешайте консоль на
последовательный порт и пользуйтесь ей
С помощью модуля Pexpect можно автоматизировать ввод команд в
консоль сотен машин. Получается очень грязно, но работает.
Спасибо
Александр Берсенёв
bay@hackerdom.ru
https://github.com/alexbers/
https://twitter.com/alex_bers

Управление большим количеством физических серверов, Александр Берсенев, Институт Математики и Механики УрО РАН

  • 1.
    Масштабное системное администрирование Настройкаи управление системой из нескольких сотен серверов Александр Берсенёв
  • 3.
  • 4.
    План доклада Случай 0.Включили N новых узлов. Установка ОС и ПО Случай 1. Что-то идёт немного не так на N узлах(Easy) Случай 2. + … и непонятно как быстро исправить (Medium) Случай 3. + … и потерялся доступ к ним (Hard) Случай 4. + … и нельзя перезагружаться (Nightmare) Примечание: N > 100
  • 5.
    Случай 0 ВключилиN новых узлов N = 1 → установка с USB или CDROM N > 100 → установка по сети
  • 6.
  • 7.
    DHCP: подготовка кзагрузке по TFTP /etc/dhcp/dhcpd.conf: group { filename "phi/pxelinux.0"; host phi1 {hardware ethernet f4:52:14:19:df:21; fixed-address 192.168.81.1; } host phi2 {hardware ethernet f4:52:14:19:e1:e1; fixed-address 192.168.81.2; } host phi3 {hardware ethernet f4:52:14:19:e1:c1; fixed-address 192.168.81.3; } } group { filename "gpu/pxelinux.0"; host gpu1 {hardware ethernet f4:52:14:22:78:f1; fixed-address 192.168.81.11; } host gpu2 {hardware ethernet f4:52:14:19:db:11; fixed-address 192.168.81.12; } host gpu3 {hardware ethernet f4:52:14:22:79:01; fixed-address 192.168.81.13; } }
  • 8.
    Конфигурация загрузки длязапуска инсталлятора /var/lib/tftpboot/gpu/pxelinux.cfg/default: default installauto timeout 300 label installauto kernel vmlinuz append initrd=initrd.img ks=http://192.168.80.1/ks/setup-phi.cfg ksdevice=bootif IPAPPEND 2
  • 9.
  • 10.
    Конфиг инсталлятора Самый главныйфайл с ответами на вопросы установки /var/www/ks/setup-phi.cfg (часть 1 из 2): install url --url http://192.168.80.1/centos/ # откуда брать дистрибутив text # выключаем gui lang en_US.UTF-8 timezone --utc Asia/Yekaterinburg rootpw --iscrypted $6$AkJqf3$9jk0861a75SAQlG4uDUO8Da..lBNT8fkoc0KGGxg/ services --enabled autofs,nslcd,nscd,munge,slurm # включаем сервисы services --disabled postfix,NetworkManager # выключаем сервисы # Разделы на диске … удалено … network --bootproto=dhcp --device=enp0s26u1u5u5 --onboot=off reboot # Перезагрузиться после окончания установки
  • 11.
    /var/www/ks/setup-phi.cfg (часть 2из 2): repo --name="EPEL" --baseurl=http://mirror.yandex.ru/epel/7/x86_64/ --cost=1001 repo --name="imkn" --baseurl=http://192.168.80.1/imkn_repo/ --cost=1001 %packages @base @core puppet nss-pam-ldapd nfs-utils autofs %end %post --log=/root/ks-post.log rmdir /home /opt/rh /opt ln -s /misc/common /misc/opt /misc/home / mount 192.168.80.1:/common /mnt -o nolock,udp,ro,vers=3 rsync -a --cvs-exclude /mnt/admin/configs/all/ / rsync -a --cvs-exclude /mnt/admin/configs/gpu/ / %end Конфиг инсталлятора
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
    Puppet. Настройка узлов –Программы -> пакеты -> репозиторий – Список пакетов которые должны бысть установлены -> Puppet -> хосты /common/packages.pp: # python's libraries package { 'numpy': ensure => 'latest' } package { 'scipy': ensure => 'latest' } package { 'sympy': ensure => 'latest' } package { 'net-snmp': ensure => 'latest' } package { 'python-tables': ensure => 'latest' } package { 'python-numexpr': ensure => 'latest' } package { 'python-pyparsing': ensure => 'latest' } package { 'python-argparse': ensure => 'latest' } package { 'mpi4py-mpich2': ensure => 'latest' } package { 'mpi4py-openmpi': ensure => 'latest' } package { 'python-ply': ensure => 'latest' } package { 'python-matplotlib': ensure => 'latest' }
  • 17.
    Автоконфигурация узлов. Итоги Новыеузлы при подключении сами устанавливаются и настраиваются Возможно, потребуется добавить одну строчку в конфигурацию DHCP-сервера (у нас это автоматизировано)
  • 18.
    Случай 1. Что-топошло не так
  • 19.
    Кстати: как мыпонимаем что что-то пошло не так? – Icinga (форк Nagios) с кастомными модулями + смс, email – Система распределения ресурсов – Тесты для узлов – Патченный collectl + система визуализации с разбивкой по задачам – Фидбек от пользователей Посмотреть (можно прямо сейчас): http://umt.imm.uran.ru/procstat.php https://alexbers.com/stat/
  • 20.
  • 21.
    … или многоподозрительных узлов
  • 22.
    Запуск команды нанескольких узлах A) $ for host in node{10..55}; do ssh "$host" uname -r; done B) $ for host in node{10..55}; do ssh "$host" uname -r& done C) $ pdsh -w node[2,4-6,10] uname -r node2: 2.6.32-573.el6.x86_64 node10: 2.6.32-573.el6.x86_64 node5: 2.6.32-573.el6.x86_64 node6: 2.6.32-573.el6.x86_64 node4: 2.6.32-573.el6.x86_64 2.6.32-573.el6.x86_64 2.6.32-573.el6.x86_64 2.6.32-573.el6.x86_64 2.6.32-573.el6.x86_64 …
  • 23.
    Объединение вывода сузлов $ pdsh -w phi[49-208],node[1-52] uname -r | dshbak -c ---------------- node[2,4-52],phi[49-74,77-176] ---------------- 2.6.32-573.el6.x86_64 ---------------- phi[75-76] ---------------- 2.6.32-358.23.2.el6.x86_64 $ pdsh -w node[1-52] uname -r node2: 2.6.32-573.el6.x86_64 node10: 2.6.32-573.el6.x86_64 ...
  • 24.
    Развёртывание интервалов имённа Python >>> import hostlist >>> hosts = hostlist.expand_hostlist("node[1-3,17]") >>> hosts ['node1', 'node2', 'node3', 'node17'] >>> hostlist.collect_hostlist(hosts) 'node[1-3,17]' >>> hostlist.collect_hostlist(["x1y1","x2y2", "x1y2", "x2y1"]) 'x[1-2]y[1-2]'
  • 25.
    Параллельное выполнение команды.Итоги Умеем быстро выполнять команды на группах узлов Умеем находить узлы, где результат выполнения команд отличается
  • 26.
    Случай 2. Поможеттолько переустановка ОС
  • 27.
    Как загрузиться посети? Решение: изменить настройки bios/efi, чтобы узел грузился по сети и свести задачу к предыдущей («перенакатить узел») IBM – ASU (Advanced Settings Utility) $ asu64 set IMM.PXE_NextBootEnabled Enabled $ reboot HP – hp-scripting-tools $ hp-reboot pxe
  • 28.
    Синхронизация настроек BIOS/EFI IBM– ASU (Advanced Settings Utility) $ asu64 show HP – hp-scripting-tools $ conrep --save $ conrep --load
  • 29.
    Удалённое управление BIOS/UEFI.Итоги Умеем изменять настройки bios/efi Умеем синхронизировать настройки bios/efi
  • 30.
    Случай 3. Потеряндоступ к узлам
  • 31.
    Доступ через управляющиймодуль В серверы встраивается плата управляющего модуля с доступом через Ethernet HP – Integrated Lights-Out IBM – Integrated Management Module Нужен API
  • 32.
    API дистанционного управления УHP есть официальный perl'овский API. И есть неофициальный питоновский: https://github.com/seveas/python-hpilo: import hpilo ilo = hpilo.Ilo(host, login="admin", password="admin") ilo.set_one_time_boot("network") ilo.reset_server() Существует отраслевой стандарт IPMI $ ipmitool -I lanplus -H host -U admin -P admin chassis bootparam pxe
  • 33.
  • 34.
    Доступ через управляющиемодули. Итоги Большинство производителей серверов встраивают модули удалённого управления и предоставляют API для них Если включён IPMI, срочно поместите его в отдельный vlan :)
  • 35.
    Случай 4. Всёплохо и нельзя перезагружать узлы
  • 36.
    Доступ к консоличерез веб – ужасен Самоподписанные сертификаты
  • 37.
    Доступ к консоличерез веб – ужасен Вход на управляющий модуль
  • 38.
    Доступ к консоличерез веб – ужасен Вход на управляющий модуль
  • 39.
    Доступ к консоличерез веб – ужасен Java. Предупреждение 1
  • 40.
    Доступ к консоличерез веб – ужасен Java. Предупреждение 2
  • 41.
    Доступ к консоличерез веб – ужасен Java. Предупреждение 3
  • 42.
    Доступ к консоличерез веб – ужасен Java. Предупреждение 4
  • 43.
    Доступ к консоличерез веб – ужасен Консоль без Copy-Paste и за $$
  • 44.
    Правильный доступ кконсоли. Решение: используем удалённый доступ к serial- порту – работает copy-paste – не требует лицензии – работает по ssh, по ключам, в одну команду $ ssh admin@node2-mgmt -t console 1
  • 45.
    Настраиваем хост наработу с serial-консолью Необходимо: – выставить в bios/efi настройку, чтобы процесс загрузки (до ОС) попадал в serial-port – добавить serial --unit=1 --speed=115200 в параметры загрузчика – добавить console=ttyS1,115200 в параметры ядра
  • 46.
    Автоматизируем работу сконсолью import pexpect import sys F1 = "x1bOP" UP = "x1b[A" DOWN = "x1b[B" ESC = "x1b" ssh_args = [ "-l", "admin", sys.argv[1], "-t"] s = pexpect.spawn("/usr/bin/ssh", ssh_args, logfile=sys.stdout, timeout=180) s.expect('system> '); s.sendline("reset") s.expect('system> '); s.sendline("console 1") s.expect('<F1> Setup'); s.send(F1) s.expect('Exit Setup'); s.send(DOWN * 4 + "rn") s.expect('Select Next One-Time Boot'); s.send(DOWN * 8 + "rn") # skipped s.expect('Do you want to Reset System'); s.send("y")
  • 47.
    Удалённый доступ кконсоли. Итоги Не пользуйтесь веб-интерфейсом, вешайте консоль на последовательный порт и пользуйтесь ей С помощью модуля Pexpect можно автоматизировать ввод команд в консоль сотен машин. Получается очень грязно, но работает.
  • 48.