20120723

FreeBSD manual disk partitioning (GPART) and install

Partitioning:

Смотрим, что есть: # ls -1 /dev/ad* /dev/da* | grep -E '[a-z]{2}[0-9]+
/dev/da0 # тут стоит система
/dev/da1 # это диск, с которым будем работать. 20Gb

Создаём gpt-разметку:
# gpart create -s gpt da1

Размечаем диск:
# gpart add -b 34 -s 64k -t freebsd-boot da1 # bootloader будет тут
# gpart add -s 2G -t freebsd-swap -l g_swap da1 # swap с меткой g_swap размером 2 Gb
# gpart add -t freebsd-ufs -l g_root da1 # оставшееся место выделяем под корневой раздел. метка g_root
# gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 da1 # Устанавливаем Protected MBR (pmbr) и gptboot loader на 1 раздел (freebsd-boot) целевого диска.

Building:

# ee make.conf: CPUTYPE?=nocona NO_INET6=yes WITHOUT_IPV6=yes DESTDIR=/mnt/build Prepare partition: # newfs -O2 -U /dev/gpt/g_root # mkdir /mnt/build # mount /dev/gpt/g_root /mnt/build

Build:
 # cd /usr/src
 # make buildworld
 # make buildkernel
 # make installkernel
 # make installworld
 # make distrib-dirs
# make distribuition
Сборка и установка не отличается от штатной, только добавляется make distribuition
Ядро вполне можно настроить под нужды:
http://serverfault.com/questions/64356/freebsd-performance-tuning-sysctls-loader-conf-kernel
 # ee /mnt/build/etc/rc.conf
 # ee /mnt/build/etc/resolv.conf
 # ee /mnt/build/etc/fstab
Последние три можно копировать и править.




20120326

Icinga sms email

Review

У нас есть группы серверов. Нам нужно мониторить доступность этих серверов и каналы к ним. Нам хочется знать о работоспособности сервисов на этих серверах. Нам хочется знать, когда на этих серверах кончается дисковое пространство, RAM, как нагружен CPU. Для этого нам нужно средство мониторинга. Мне нравится icinga - хардкор, ручная настройка - гибкость поведения, развитие проекта nagios, много плагинов, клиент под все основные серверные ОС.

Нам нужно:
  • Мониторить доступность (ping)
  • Контролировать ресурсы (SNMP/NRPE/NSClient)
  • Рисовать пиздатые картинки (nagiosgrapher)
  • Оповещать ответственные лица по почте, sms(pythomnic3k), и оповещать по sms, когда всё упало, и интернета нет вообще(модем cinterion MC35i terminal)
  • ???
  • PROFIT!

Структура писанины:

  • Установка и настройка Icinga в базовой комплектации
    • Добавление хостов для мониторинга – пилим шаблоны
    • Работа с SNMP
    • Работа с NRPE
    • Работа с NSCLIENT
    • Отправка email
  •  Дополнительные оповещения:
    • Отправка SMS программно через sms-провайдера
    • Отправка SMS через модем
  • Построение графиков – как настроить, как писать выражения
  • Процедура тестирования
  • Итоги
  • Источники

Установка и настройка Icinga в базовой комплектации

В руках у нас сервер с 2*Xeon2.8 и 2gb памяти. У него есть 2 сетевые карты, COM-порт и hdd. Ставим на него FreeBSD9 x64.

Собираем icinga

MySQL

/usr/ports/databases/mysql55-server
/usr/ports/databases/libdbi-drivers
 

Заводим пользователя

Пользователь icinga - без пароля, без возможности зайти в систему:
# adduser -D -w no -s nologin
Для возможности отправлять команды из веб-морды - создаём группу и добавляем в неё пользователей

# pw groupadd -n icinga-cmd -M icinga,www

Сама Icinga

Собирать можно из исходников руками. Но как тогда обновляться? Тоже руками? Хуюшки. Ставим из портов. Но сначала - чуть поправим Makefile. Добавим в подходящие места:
WWWGROUP=icinga-cmd
--enable-idoutils 
и включаем EVENT BROKER:

Ставится Icinga и зависимости.

Зависимости:

/usr/ports/devel/libtool
/usr/ports/graphics/jpeg
/usr/ports/graphics/png
/usr/ports/graphics/gd
/usr/ports/devel/gmake
/usr/ports/devel/libltdl
/usr/ports/www/apache22


Шаблоны


Мне показалось удобным использовать стандартные шаблоны, изменив их.
Изменения таковы:
templates.cfg:
 notification_interval 0 - слать уведомления о проблеме только один раз.

В файле winservers.cfg размещаем команды для проверки сервисов, общих для всех windows-хостов:

 define service{
        use                             generic-service
        hostgroup_name                  winservers
        service_description             Uptime
        check_command                   check_nt!UPTIME
}

define service{
        use                             generic-service
        hostgroup_name                  winservers
        service_description             CpuLoad
        check_command                   check_nt!CPULOAD!-l 5,80,90
}

define service{
        use                             generic-service
        hostgroup_name                  winservers
        service_description             Drive_C
        check_command                   check_nt!USEDDISKSPACE!-l c -w 80 -c 90
}

define service{
        use                             generic-service
        hostgroup_name                  winservers
        service_description             Memory
        check_command                   CheckMem!80!90
}

далее в файле groups.cfg пишем:
 define hostgroup{
        hostgroup_name  winservers      ; The name of the hostgroup
        alias           winservers      ; Long name of the group
        members         my_win_server, pupkins_workstation
}

my_win_server.cfg:
define host{
        use                     generic-host            ; Name of host template to use
        host_name               my_win_server
        alias                   my_win_server
        address                 192.168.0.254
}

Все эти три конфига - my_win_server.cfg, groups.cfg и winservers.cfg - находятся, допустим, в директории /usr/local/etc/icinga/custom. Для того, чтобы icinga узнало об этих конфигах - надо в файле icinga.cfg сказать:
 cfg_dir=/usr/local/etc/icinga/custom
и тогда при запуске конфиг-файлы будут искаться и в этой директории.

NRPE


Для проверок механизмом NRPE нужна клиентская часть, которая спрашивает серверную, задаёт ей вопросы. Например:
 -> CheckMEM?
 <- 32Gb всего, 28 занято
или:
 -> CheckLOAD?
 <- 5,07 3,2 2,8
То есть придётся ставить NRPE-демон на опрашиваемый компьютер.

check_nrpe2 - исполняемый файл на сервере. стоит он там же, где и остальные плагины - /usr/local/libexec/icinga


Nrpe - демон есть в репозиториях любой операционки, либо качается отдельно.
Например, можно поставить его вручную на redhat-подобные:
 Качаем руками nrpe*.rpm из репозитория
 Распаковываем в /usr/local/nrpe
 Копируем загрузочный скрипт в /etc/init.d
 Создаём симлинки на скрипт в /etc/rc0.d -> K99nrpe; /etc/rc3.d -> S99nrpe; /etc/rc5.d -> S99nrpe
 Правим /etc/init.d/nrpe: CONFIG="/usr/local/nrpe/nrpe.cfg"
 Правим конфиг /usr/local/nrpe/nrpe.cfg:
log_facility=daemon
pid_file=/var/run/nrpe.pid
server_port=5666
#server_address=127.0.0.1

nrpe_user=nagios # или какой вам нравится. надо только его ручками создать
nrpe_group=nagios

allowed_hosts=127.0.0.1,192.168.0.253 # хосты, которым можно работать с этим демоном.

dont_blame_nrpe=0 # когда 0 - не разрешать выполнять другие команды, кроме описанных в этом конфиге
# command_prefix=/usr/bin/sudo # можно выполнять команды от рута. например, не в целях мониторинга, а что-то удалённо колхозить руками или по расписанию.
debug=1 # только на время запуска и отладки. так-то лучше 0, чтобы в лог херни не писал.
command_timeout=60
connection_timeout=300
#allow_weak_random_seed=1
#include=<somefile.cfg>
#include_dir=<somedirectory>

# Описание команд, которые может выполнять демон.
# Естественно, файлы должны быть доступны на исполнение и лежать там, где указано.
command[check_users]=/usr/local/nrpe/check_users -w 5 -c 10
command[check_load]=/usr/local/nrpe/check_load -w 15,10,5 -c 30,25,20
command[check_hdd2]=/usr/local/nrpe/check_disk -w 20% -c 10% -p /dev/sdb1
command[check_opt]=/usr/local/nrpe/check_disk -w 20% -c 10% -p /dev/mapper/vg_vmachine-opt
command[check_var]=/usr/local/nrpe/check_disk -w 20% -c 10% -p /dev/mapper/vg_vmachine-var
command[check_zombie_procs]=/usr/local/nrpe/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nrpe/check_procs -w 150 -c 200
# самодельные скрипты
command[check_mem]=/usr/local/nrpe/check_memory.sh
command[check_swap]=/usr/local/nrpe/check_swap.sh
# запущены ли процессы с такой строчкой? в данном случае - сервер Jetty и ещё один демон на питоне.
command[check_jetty]=/usr/local/nrpe/check_procs -w 1:1 -c 1:1 -a jetty
command[check_python3]=/usr/local/nrpe/check_procs -w 10:10 -c 10:10 -a python3



Шаблон для проверок NRPE выглядит так:

define command{
        command_name check_nrpe
        command_line $USER1$/check_nrpe2 -H $HOSTADDRESS$ -n -c $ARG1$ -t $ARG2$
}

Для виндов можно заранее настрогать заготовок:
define command {
        command_name CheckMem
        command_line $USER1$/check_nrpe2 -H $HOSTADDRESS$ -n -p 5666 -c CheckMEM -a MaxWarn=$ARG1$% MaxCrit=$ARG2$% ShowAll type=physical
}

define command {
        command_name CheckCPU
        command_line $USER1$/check_nrpe2 -H $HOSTADDRESS$ -n -p 5666 -c CheckCPU -a warn=$ARG1$ crit=$ARG2$ time=15m time=5m time=1m
}

define command {
        command_name CheckDISK_C
        command_line $USER1$/check_nrpe2 -H $HOSTADDRESS$ -n -p 5666 -c CheckDriveSize -a ShowAll MinWarnFree=$ARG1$% MinCritFree=$ARG2$% Drive=c:
}

Тогда в конфиге хоста надо будет только добавить то, что указано в шаблонах.

NSCLIENT

Nsclient++ - клиент для Windows. Есть для i386 и для i386_64. Среди прочего умеет и nrpe.
Установка как обычно.
Править конфиг лучше при выключенной службе, потом службу запускать заново.
Конфиг в файле C:\Program Files\NSClient++\NSC.ini

Что должно быть, чтобы заработало:
NRPEClient.dll
allowed_hosts=192.168.0.253
use_ssl=0
allow_arguments=1

Можно просто почитать конфиг и поиграть с параметрами - включить ssl и прочее.

EMAIL

Команду для отправки можно не менять.

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

Шаблоны для уведомлений:

Например, у нас круглосуточное производство и два админа - дневной и ночной.

define contact{
        contact_name                    admin_night
        use                             generic-contact
        alias                           NightAdminName
        email                           ччч@мейл.ру
        }

define contactgroup{
        contactgroup_name       admins_alternate
        alias                   Icinga Administrators
        members                 admin_day, admin_night
        }

define host{
        use                     generic-host            ; Name of host template to use
        host_name               my_win_server
        alias                   my_win_server
        contact_groups          admins_alternate
        address                 192.168.0.254
}

И всё, уведомления приходят обоим админам.

SMS -> модем

Представим, что сеть упала нахрен напрочь. И уведомления отправить нельзя. Остаётся только sms-уведомление.
У меня есть COM-портовый модем cinterion. Для него подходит smstools3, есть в портах.
Ставим, настраиваем:
/usr/local/etc/smsd.conf:

devices=GSM1
logfile=/var/log/smsd.log
loglevel=4
USER=icinga
GROUP=dialer
umask=022
PIDFILE=/var/run/smsd/smsd.pid
INFOFILE=/var/run/smsd/smsd.working

[GSM1]
device = /dev/cuau0
incoming = yes
pin = 5452 # pin-код симки

СМС-ки пишутся в файлы в папках в /var/spool/sms/

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

Скрипты отправки СМС:

# 'notify-service-by-sms' command definition
define command{
        command_name    notify-service-by-sms
        command_line    /usr/local/bin/sendsms $CONTACTPAGER$ "$NOTIFICATIONTYPE$ $HOSTALIAS$:$SERVICEDESC$ $SERVICEOUTPUT$"
        }

# 'notify-host-by-sms' command definition
define command{
        command_name    notify-host-by-sms
        command_line    /usr/local/bin/sendsms $CONTACTPAGER$ "$NOTIFICATIONTYPE$ $HOSTNAME$:$HOSTSTATE$ - $HOSTOUTPUT$ - $LONGDATETIME$"
        }

Настройки контактов:
define contact{
        contact_name                    admin_ph
        alias                           admin_ph
        host_notification_period        24x7
        service_notification_period     24x7
        service_notification_options    c,r
        service_notification_commands   notify-service-by-sms
        host_notification_commands      notify-host-by-sms
        pager                           7********** # прошу заметить - именно так, 7, затем 10 цифр
        }

Графики

nagiosgrapher or nagiosgraph?

Подводные камни

Иногда не стартует ido2db - интерфейс к базе. Надо его контролировать. В настройках по умолчанию это есть. (localhost.cfg). Также надо перезапускать его, когда перезапускаешь icinga.

При плановом обслуживании серверов есть возможность задавать downtime сервера - чтобы не ругался мониторинг почём зря.

На случай сбоев самого мониторинга - можно завести ещё один, где-нибудь на виртуалке, чтобы прикрывал основной. То есть 2 icinga, которые смотрят друг за другом.

20120321

VMWare VSA HA Cluster

Мы хотим приготовить отказоустойчивый кластер для важных приложений.
Берём 2 DL380, один noname, VMWare ESXi, vServer, VSA manager, два 1GbE-коммутатора, пачку проводов.
Собираем кластер. Схема коммутации - тут.
На каждый DL380 ставим ESXi, обновляем до последней версии.
Ставим на noname win2k8r2, на него ставим vServer, VSA и последний flashplayer.
Добавляем датацентр, прямо в него добавляем 2 хоста:

Отрезаем сеть до нужного размера:

Перемешиваем с помощью VSA Manager:


Вуаля! Кластер готов!
Теперь добавляем виртуальных машин по вкусу, и включаем у них режим FaultTolerance.


Немного советов по обращению с:
По умолчанию можно включить FT не более, чем у 4 виртуалок. Поправить это позволяет параметр das.maxFtVmsPerHost (в Advanced Options в VSA HA Cluster)
Изменить размер слота позволяют пары параметров
das.vmMemoryMinMB - das.slotMemInMB
das.vmCpuMinMHz - das.slotCpuInMHz
Характеристики слотов видно в Summary кластера - но только при выборе "Host failures the cluster tolerates"

Почитать ещё про High Availability можно тут.