SSL CERT CHECK

ssl-cert-check — делаем простой мониторинг SSL с уведомлениями на email о необходимости продления сертификата.

Установка скрипта.

1. Ставим всё необходимое для работы, ssl-cert-check забираем из github репозитория:

# yum install git openssl
# cd /usr/local/src/
# git clone https://github.com/Matty9191/ssl-cert-check
# cp ssl-cert-check/ssl-cert-check /usr/local/sbin/

2. Создадим файл /etc/ssl-cert-check-domains с доменами, которые будем периодически проверять. Выглядеть файл будет так:

# cat /etc/ssl-cert-check-domains
sysadmin.pm 443
yandex.ru 443
google.com 443

3. Выполним проверку статуса сертификатов у внесённых в список доменов:

# ssl-cert-check -f /etc/ssl-cert-check-domains
ssl-cert-check

Настройка уведомлений.

С помощью дополнительных параметров, мы можем указать интервал, по истечении которого, скрипт сообщит о неоходимости обновления сертификата, за это отвечает параметр -x. Например, вот так будут выглядеть результаты проверки, если для нас критично считать истекающими сертификаты, которые нужно продлить менее чем через 50 дней:

# ssl-cert-check -x50 -f /etc/ssl-cert-check-domains
ssl-cert-check

C помощью параметра -a, мы включаем отправку уведемления на email, а с параметром -e указываем email, на который уйдёт сообщение о необходимости продлить сертификат. В результате, итоговая команда выглядит так:

# ssl-cert-check -a -f /etc/ssl-cert-check-domains -q -x 30 -e alert@sysadmin.pm

Т. е. мы проверяем все домены из файла /etc/ssl-cert-check-domains, и уведомляем о необходимости продления сертификата, в случае если он истекает менее чем через 30 дней.

Нам остаётся только добавить эту задачу в cron:

0 21 * * * /usr/local/sbin/ssl-cert-check -a -f /etc/ssl-cert-check-domains -q -x 30 -e alert@sysadmin.pm

И мы будем получать соответствующие уведомления от нашей системы.

Стоит заметить, что в заметке рассмотрен один конкретный кейс. Скрипт ssl-cert-check умеет многое — например, проверять конкретные файлы сертификатов, работать с сертификатами из директории, может передать пароль для сертификата, если требуется, можно использовать его как плагин для Nagios и изменять формат вывода информации. Для получения подробностей достаточно выполнить ssl-cert-check -h и скрипт выведет все доступные для него опции.

ASCIICAST2GIF

asciicast2gif — утилита для конвертации ascii кастов, в обычную gif анимацию.

Asciinema удобна в использовании, и даёт свои плюсы при работе с кастами, однако, есть случаи, когда показать записанное в ascii формате возможности нет, а сделать это нужно. Тут на помощь может прийти конвертер, который из каста сделает обычный gif файл.

Установка.

Для начала, установим всё необходимое:

# yum install gifsicle bzip2 ImageMagick npm

И поставим саму утилиту:

# npm install --global asciicast2gif

Использование.

Для того, что бы быстро получить gif файл, достаточно выполнить команду:

# asciicast2gif https://asciinema.org/a/262583.json my-sup-term.gif
==> Loading https://asciinema.org/a/262583.json...
==> Spawning PhantomJS renderer...
==> Generating frame screenshots...
==> Combining 117 screenshots into GIF file...
==> Done.

Здесь 262583 — это ID ролика, его можно найти либо в URL каста, либо в коде плеера на сайтах, там будет что-то вроде "id="asciicast-262583".

При конвертации, мы можем добавить дополнительные параметры — управлять скоростью ролика, выбрать нужную тему, изменить ширину (количество символов терминала) и высоту (количество строк) gif файла. Например, так мы получим ускоренную в два раза анимацию с темой tango и ограничением 60 на 20 по вертикали и горизонтали, изображение, при этом, будет уменьшено в два раза в сравнении с дефолтом (опция -S по дефолту 2):

# asciicast2gif -S1 -s2 -w60 -h20 -ttango https://asciinema.org/a/262583.json my-sup-term-2.gif

FAST

fast — простая утилита от Netflix для измерения скорости соединения.

Ещё в 2016 году Netflix анонсировали аналог speedtest сервиса — ресурс для измерения скорости интернет-соединения fast.com. Максимально простой, лёгкий, но в то же время, имеющий дополнительные опции, с помощью которых можно настроить процесс измерения под необходимые условия.

Есть для этого сервиса и его cli вариант — утилита fast. Для запуска достаточно просто скачать её бинарник. Выглядит всё так:

# wget -O fast https://github.com/ddo/fast/releases/download/v0.0.4/fast_linux_amd64
# chmod +x fast
# ./fast

Ждём пока не завершится процесс, и получаем текущую скорость загрузки.

fast

Fast, инструмент очень простой. Если же, требуется какой-то дополнительный функционал, имеет смысл обратить внимание, например, на iperf — о нём на сайте есть отдельная заметка.

PINGTOP

pingtop — простая утилита, которая позволяет пинговать несколько ресурсов одноврменно, а результаты отображать в привычном для *top утилит виде.

Для работы на CentOS 7 нам потребуется установить python 3, и его -devel и pip пакеты соответствующей версии. Ставим их из EPEL репозитория:

# yum install epel-release
# yum install python36 python36-pip python36-devel

Теперь ставим сам pingtop:

# pip3 install pingtop

И запускаем утилиту, при этом, пингуем сразу нсколько сайтов:

# pingtop ya.ru google.com kernel.org github.com
pingtop

Если нужна не только визуализация, но и запись изменений в лог, можно воспользоваться соответствующими ключами: -l для указания файла лога, и -v для уровня детализации информации.

# pingtop ya.ru google.com kernel.org github.com -l ./pingtop.log -v INFO

IPERF И SERVERIUS

iperf — инструмент для тестирования пропускной способности сети. Использовать его можно и в связке со своим сервером, и при обращении к сторонним площадкам, позволяющим проводить тесты.

iperf доступен для установки из репозиториев практически всех популярных дистрибутивов. В CentOS он устанавливается из EPEL:

# yum install epel-release
# yum install iperf

Очень часто, для тестирования используют две машины — сервер и клиент, тест при этом запускается между ними. Но существуют так же и публичные серверы, которые мы можем использовать для теста. Например, сервер speedtest.serverius.net.

Запускаем тест на 120 секунд (-t), в 10 потоков (-P), и по прошествии заданного времени получаем результат:

# iperf -c speedtest.serverius.net -t 120 -P 10
iperf

Подробнее о тестировании соединения между двумя своими серверами, можно прочитать в отдельной заметке по iperf3.

SYSTEMD УТИЛИТЫ

SYSTEMD УТИЛИТЫ

В заметке смотрим на две простых утилиты для работы с systemd сервисами. service-monitor — для работы с логами нужного нам сервиса, и service-generator — для генерации простых unit файлов.

Для начала, поставим всё необходимое для сборки (работаем в CentOS 7) и заберём файлы из git репозитория:

# yum install epel-release
# yum install golang git systemd-devel 
# cd /usr/local/src/
# git clone https://github.com/muesli/service-tools

Собираем обе утилиты:

# cd service-tools/service-generator
# go build
# cd ../service-monitor
# go build

И посмотрим что они умеют.

service-monitor.

service-monitor позволяет нам работать с логами в системе. С помощью параметра —theme при запуске, мы можем выбрать внешний вид окна (ice, terminal), а ключи logs и services определят режим взаимодействия с утилитой.

Для того, что бы увидеть сводку по ошибкам, и получить доступ к логу в реальном времени, выполняем команду:

# ./service-monitor logs

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

В случае, если мы хотим не только просматривать логи, но и взаимодействовать с сервисами, можно выполнить вот такую команду:

# ./service-monitor services

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

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

service-generator.

service-generator — это простой генератор unit файлов для наших сервисов. Для создания файла достаточно выполнить:

# ./service-generator create /path/to/binary "Super service"

И утилита создаст binary.service файл, который далее можно использовать в работе.

Есть у утилиты и простой псевдографический интерфейс. Запускаем:

# ./service-generator create

Далее заполняем поля, и генерируем наш unit файл.

Вот такие, очень простые, но удобные для работы с systemd сервисами утилиты.

А ещё, для работы с systemd сервисами, есть утилита chkservice, о ней есть отдельная короткая заметка.

VECTOR ДЛЯ PCP

Vector — дашборд от Netflix, работающий с Performance Co-Pilot, позволяющий в реальном времени собирать и выводить информацию о большом количестве метрик на сервере.

vector

Vector доступен в репозиториях большинства популярных дистрибутивов. Кроме того, для запуска имеются и готовый docker контейнер, и просто архив, который можно скачать и распаковать на любом сервере, где установлен Apache, например.

Для того, что бы посмотреть на панель в работе нам потребуется так же установить pcp. Работать в рамках заметки будем на CentOS 7.

Ставим всё необходимое, включаем, запускаем:

# yum install pcp-webapp-vector pcp-webapi pcp
# systemctl enable pmwebd pmcd
# systemctl start pmwebd pmcd

Убеждаемся, что наши сервисы слушают порты 44321 и 44323:

# netstat -nlp | grep 4432
tcp 0 0 0.0.0.0:44321 0.0.0.0:* LISTEN 13162/pmcd 
tcp 0 0 0.0.0.0:44323 0.0.0.0:* LISTEN 13222/pmwebd

Проверяем работоспособность pcp:

# pcp
Performance Co-Pilot configuration on v.tld:

platform: Linux v.tld 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64
hardware: 1 cpu, 1 disk, 1 node, 1790MB RAM
timezone: CEST-2
services: pmcd pmwebd
pmcd: Version 4.1.0-1, 7 agents, 2 clients
pmda: root pmcd proc xfs linux mmv jbd2

При необходимости, разрешаем доступ к порту 44323 на сервере. И открываем в браузере запущенную панель (95.216.197.118 — ip нашего сервера):

http://95.216.197.118:44323/vector/index.html
vector

В форме hostname указываем IP нашего сервера, ждём несколько секунд и получаем графики, с метриками, которые собираются в нашей системе.

Графики на панели мы можем сортировать как нам удобно — закрывать лишние, либо наоборот, нажав на кнопку Widget добавить отображение нужных параметров.

При необходимости, мы можем обратиться не только к локально запущенному performance co-pilot сервису, но и к удалённому серверу, где pcp работает и собирает данные.

Если обычного дашборда для ваших задач будет мало (захочется хранения статистики, либо уведомлений от мониторинга), имеет смысл обратить внимание на Netdata — об этом мониторинге доступна отдельная заметка.

ПОРТАТИВНЫЙ QEMU

Смотрим на кейс, в котором на сервер без полноценного IP KVM, нужно было установить свою операционную систему. Делать всё будем с помощью портативной версии qemu.

Исходные данные.

Итак, у нас есть бюджетный сервер в online.net (но метод вполне подойдёт и для других ДЦ, я думаю), к которому есть простейший IPMI. Но подключить к нему виртуальный привод, или попросить ДЦ подключить к серверу USB\дисковод мы не можем (сервер совсем бюджетный). Задача, при этом, стоит простая — установить на сервер свою операционную систему, со своей разбивкой и шифрованием.

Так как KVM нам никто не подключит, rescue и панель нужного функционала не даст, пойдём мы следующим путём — закинем в память сервера бинарник портативного qemu, туда же закинем ISO с установщиком системы. В rescue запустим портативный qemu, подсунем ему образ, и организуем доступ к этой «виртуальной машине» по VNC.

Подготовка.

1. Загружаем сервер в rescue средствами панели датацентра. К слову, можно пробовать работать и из уже установленной ОС, но я предпочёл именно rescue режим.

2. Убеждаемся, что /tmp работает с памятью сервера, а не диском. Загружаем в /tmp всё необходимое (бинарник qemu, iso с установщиком):

# mount | grep "/tmp"
tmpfs on /tmp type tmpfs (rw,nosuid,nodev,relatime)
# wget -qO- /tmp https://sysadmin.pm/vkvm.tar.gz | tar xvz -C /tmp
# wget -P /tmp http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso

3. Запускаем виртуальную машину, которая будет доступна через VNC по сети (в виртуальный cdrom монтируем iso, подключем диск сервера, выделяем 2048 памяти для работы):

# /tmp/qemu-system-x86_64 -net nic -net user,hostfwd=tcp::3389-:3389 -m 2048M -localtime -enable-kvm -cpu host,+nx -M pc -smp 2 -vga std -usbdevice tablet -k en-us -cdrom /tmp/CentOS-7-x86_64-Minimal-1810.iso -hda /dev/sda -boot once=d -vnc :1

4. И заходим на сервер по VNC, удобным для нас клиентом. Адрес для соединения в моём случае (1.2.3.0 — IP сервера) — 1.2.3.0:5901.

портативный qemu

Установка и настройка.

5. Выполняем установку привычным для нас путём (да, да, через GUI, потому что это действительно просто в данном случае). В процессе мы разбиваем диск, шифруем его при необходимости, настраиваем сеть (статический IP), задаём таймзону и т. п.

портативный qemu

6. Как только установка будет завершена, нажимаем на кнопку Reboot, в интефрейсе инсталлятора. При этом, должна будет перезагрузиться, только «виртуальная машина», к которой мы подключены по VNC. Физический сервер продолжает работать, мы всё ещё подключены к нему, и там запущен процесс с портативным qemu.

7. После перезагрузки, мы видим перед собой grub, загружаем установленную систему.

portable qemu

Если диск был зашифрован, на этом этапе система попросит нас ввести пароль для расшифровки.

8. Входим в установленную ОС, и проверяем что бы сеть в ней была настроена корректно (в моём случае это):

  • Статический IP и его настройки указаны в /etc/sysconfig/nework-scripts/ifcfg-ens3
  • Корректный резольвер прописан в /etc/resolv.conf

9. Активируем SSH, для того что бы иметь возможность удалённо подключиться к серверу в будущем.

# systemctl enable sshd.service

Активация консоли.

Продолжаем работать в нашей «виртуальной машине» и активируем критичные для нас сервисы — ssh для удалённого доступа к серверу и серийную консоль. Она потребуется нам для ввода пароля при загрузке сервера. Далее, настройка будет выполнена с учётом рекомендаций online.net, возможно у других провайдеров что-то здесь будет отличаться.

10. Активируем серийную консоль в самой системе:

# systemctl enable getty@ttyS1.service

11. Дополняем конфиг загрузчика, для того что бы и он поддерживал работу с консолью (в противном случае, мы не сможем ввести пароль для расшифровки диска). Итоговый конфиг у меня выглядит так:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --unit=1 --speed=9600 --word=8 --parity=no --stop=1"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/00 rd.luks.uuid=luks-1762b4f1-1e4a-4c23-ba75-6ee04fdcb9ad rhgb console=ttyS1"
GRUB_DISABLE_RECOVERY="true"

Сохраняем /etc/default/grub и генерируем конфиг:

# grub2-mkconfig -o /boot/grub2/grub.cfg

На этом этапе делаем остановку и ещё раз проверяем — на сервере у нас:

  • Должен быть активирован SSH;
  • Должна быть настроена серийная консоль;
  • Должен быть настроен загрузчик;
  • Не должно быть ошибок в конфиге сети.

Если всё сделано верно, и ошибок мы не допустили, отправляем физический сервер на перезагрузку и загружаем его в обычном режиме.

В моём случае, после перезагрузки сервера, в IPMI, который даёт online.net, я получил возможность ввести пароль для разблокировки диска при загрузке сервера, а сам сервер был установлен с нужной мне разбивкой (LVM, который не настроить из панели провайдера).

А если по какой-то причине, с VNC и портативным KVM возиться не хочется, имеет смысл посмотреть на скрипт takeover.sh, который позволяет развернуть ОС в памяти сервера, соединиться с этой ОС по SSH и сделать с сервером всё что нужно.