Автоматизация подключения к недоступному оборудованию

Здесь опишу логику работы, скрипт напишу позже.

Особенность работы наших железок на объекте – маршрутизаторы и каналы резервируются, но OSPF между ними разорван. Поэтому когда отваливается один из каналов, доступ на маршрутизатор есть только с другого роутера. Хочу автоматизировать процесс подключения к таким устройствам, чтобы не ломиться сначала на рабочую железку.

Например, есть два лупбека. 192.168.10.10 и 192.168.10.11. Есть сетка для интерконнекта между маршрутизаторами, которая не роутится. Например 1912.168.20.0/30. Допустим, второй маршрутизатор не доступен. Последовательность действий:

  • Стучусь на первую железку
  • Ищу сабинтерфейс .11
  • Вытаскиваю сетку из интерфейса, сетка /30 настроена везде (типовая схема).
  • Считаю её.
  • Сравниваю адреса. Если адрес интерфейса равен первому адресу, значит надо зайти на второй адрес. Если равен второму, то на первый.
  • Зайти на адрес с локальными логином и паролем

Python-скрипт для автоматизации выключения Smart Install на оборудовании cisco

Недавно были проблемы из-за уязвимости в фиче vstack у коммутаторов Cisco. Ссылка на официальную страницу здесь. Написал небольшой скрипт, который заходит на оборудование Cisco с обнаруженной уязвимостью ( nmap -n -p T:4786 -Pn 192.168.100.0/24) и делает no vstack. Потом в лог выводится результат выполнения команды vstack. Возможные ошибки (нет ssh например) так же пишутся в лог. Для работы скрипта нужна библиотека netmiko, можно установить с помощью pip – pip install netmiko. Скрипт написан для python2. Ссылка здесь

В планах:

  • Так как таким образом vstack не отключается на старых версиях IOS (можно порт только заблокировать), хочу сделать проверку на выключение (парсить вывод)
  • Что-то ещё крутилось в голове, пока забыл. Потом добавлю может

Автоматизация управления сетью. Системный подход

С коллегами прослушали курс NPDESI который направлен на знакомство сетевых инженеров с автоматизацией и разработкой ПО. В очередной раз задавшись вопросом, как же получить большую кнопку с надписью сделать хорошо, получили ответ от инструктора:

  • Автоматизация ради автоматизации не имеет смысла. Это нулевой постулат.
  •  В первую очередь необходимо проанализировать бизнес-процессы и выяснить, какие из них можно и имеет смысл автоматизировать. Для системного подхода к управлению можно ознакомиться с ITIL, TAGAF, COBRA
  • Во-вторых мы должны определить, как управлять оборудованием. Какое оборудование есть, какие протоколы оно поддерживает (ssh, NETCONF, REST)
  • Прибыль, которую мы получим от автоматизации. Этот пункт скорее менеджерам, для меня его можно назвать скорее как профит, который я получу при избавлении от рутины – свободное время и т. д.

После анализа на основе выдвинутых требований можно приступить к разработке продукта.

P.S. Различные продукты для управления – всяческие контроллеры, ansible и прочее это всего лишь инструменты, и относиться к ним нужно соответственно.

Мониторинг OSPF в заббиксе

Использовал следующий шаблон:

https://share.zabbix.com/network_devices/snmp-router-ospf

В аттаче таблица значений (value mapping):

https://drive.google.com/open?id=0B5hSN1ZP2lraaVJTLUVpMmpGd3M

И исправленый шаблон, спасибо:

https://drive.google.com/open?id=0B5hSN1ZP2lraMzdUOEpfTU5ueUU

если версия заббикса выше 3.0, то шаблон вот такой можно использовать:

https://drive.google.com/open?id=0B5hSN1ZP2lraUGtrTDhMTkFDeEE

Установка Opennms на Fedora 24 server

Коротко, без коментов.

http://docs.opennms.org/opennms/index.html
rpm -Uvh http://yum.opennms.org/repofiles/opennms-repo-stable-rhel7.noarch.rpm
rpm –import http://yum.opennms.org/OPENNMS-GPG-KEY
yum -y install opennms
dnf install java-1.8.0-openjdk-devel
postgresql-setup initdb
systemctl enable postgresql
systemctl start postgresql
su – postgres
createuser -P opennms
createdb -O opennms opennms
exit
su – postgres
psql -c “ALTER USER postgres WITH PASSWORD ‘YOUR-POSTGRES-PASSWORD’;”
exit
nano /var/lib/pgsql/data/pg_hba.conf
local   all             all                                    md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
systemctl reload postgresql
nano /opt/opennms/etc/opennms-datasources.xml
<jdbc-data-source name=”opennms”
database-name=”opennms”
class-name=”org.postgresql.Driver”
url=”jdbc:postgresql://localhost:5432/opennms”
user-name=”** YOUR-OPENNMS-USERNAME **”
password=”** YOUR-OPENNMS-PASSWORD **” />

<jdbc-data-source name=”opennms-admin”
database-name=”template1″
class-name=”org.postgresql.Driver”
url=”jdbc:postgresql://localhost:5432/template1″
user-name=”postgres”
password=”** YOUR-POSTGRES-PASSWORD **” />
/opt/opennms/bin/runjava -s
/opt/opennms/bin/install -dis
systemctl enable opennms
systemctl start opennms
firewall-cmd –add-port=8980/tcp –permanent
firewall-cmd –reload

Конфигурационный файл zabbix-сервера

DebugLevel=3
LogFile=/var/log/zabbix-server/zabbix_server.log
PidFile=/var/run/zabbix/zabbix_server.pid
DBName=zabbix
DBUser=zabbix
AlertScriptsPath=/etc/zabbix/alert.d/
FpingLocation=/usr/bin/fping
DBPassword=123
DBHost=127.0.0.1
StartPingers=20
CacheSize=512M
StartPollers=65
StartPollersUnreachable=25
StartTrappers=5
StartDiscoverers=3
HousekeepingFrequency=24
MaxHousekeeperDelete=5000
StartDBSyncers=32
ValueCacheSize=64M
Timeout=10

Скрипт проверки скорости по тарифу/speed check

Всё просто – проверяю работу шейпера, каждый час в 5 минут.

5 */1 * * * /home/manager/speed_check

cat speed_check
#!/bin/bash
alert=`iperf3 -c iperf.test.ru -P 1 | awk ‘NR == 17{print$7}’` #17 строчка 7 колонка, количество потоков – 1
norma=200 #Тариф на сервера 200 мбит/с
#echo $alert
#Результат измерения может быть дробным-баш не работает с дробными числами, поэтому такая конструкция:
check=`echo “$alert $norma” | awk ‘{if ($1 > $2) print 1; else print 0}’`
if [ “$check” -eq 1 ]
then
/usr/bin/sendemail -o message-charset=utf-8 -f zabbix_mon@test.ru -t 123@test.ru -m !!! Внимание !!! Проверка показала, что на 100 мб тарифе скорость больше 200 мбитс. Необходимо проверить логи шейпера Сообщение было создано автоматически, пожалуйста, не отвечайте на него. -u Внимание! Необходимо проверить ограничение скорости! -s mail.test.ru -xp 123 -xu zabbix_mon@test.ru
#echo “$(date +%d-%m-%Y\ %H:%M:%S) (INFO) speed is  ${alert} Mb/s” >> speed.log
fi

exit

Подключение сертификатов в postfix и dovecot

Создать ca_bundle, файлы помещать в него в определённом порядке:

cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt>mail.somesite.ru.ca-bundle

Подключть tls в постфиксе:
/etc/postfix/main.cf
smtpd_tls_key_file = /etc/pki/mail/private.decr.key
smtpd_tls_cert_file = /etc/pki/mail/STAR_somesite_ru.crt
smtpd_tls_CAfile = /etc/pki/mail/mail.somesite.ru.ca-bundle
smtp_tls_key_file = /etc/pki/mail/private.key
smtp_tls_cert_file = /etc/pki/mail/STAR_somesite_ru.crt
smtp_tls_CAfile = /etc/pki/mail/mail.somesite.ru.ca-bundle

Подключить ssl в dovecot:
/etc/dovecot/conf.d/10-ssl.conf
ssl_key = </etc/pki/mail/private.key
ssl_cert = </etc/pki/mail/STAR_somesite_ru.crt
ssl_ca = </etc/pki/mail/mail.somesite.ru.ca-bundle

Подключить серт в раундкуб
cat /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/pki/mail/STAR_somesite_ru.crt
SSLCertificateKeyFile /etc/pki/mail/private.key
SSLCACertificateFile /etc/pki/mail/mail.somesite.ru.ca-bundle

Посмотреть сертификат:
openssl x509 -in COMODORSADomainValidationSecureServerCA.crt -noout -text
Посмотреть ключ:
openssl rsa -in private.decr.key -noout -text

!!!Ключ private.decr.key должен дать тот, кто генерирует сертификаты

Регулярные выражения (regexp) для network discovery в заббиксе/zabbix

Заббикс – вещь капризная и очень требовательная к ресурсам дисковой подсистемы. А какая-нибудь 76 или 65 циска будучи в ядре или дистрибьюции создаёт уйму интерфейсов, нужных и ненужных. Надо с этим бороться и снимать данные только с нужных портов.

В заббиксе – configuratuin–hosts–нужный хост–discovery rules–Template SNMP Interfaces 64: Network interfaces–нажимаем на Network interfaces–Filters–{#SNMPVALUE} matches

Для 7606 я написал следующее правило:

^TenGigabitEthernet1/[1-8]$|^GigabitEthernet2/[1-9]$|^GigabitEthernet2/[1-2][0-9]$|^unrouted VLAN [1-9]$|^unrouted VLAN [1-9][0-9]$|^unrouted VLAN [1-9][0-9][0-9]$|^unrouted VLAN [1-3][1-4][0-9][0-9]$|^Port-channel1$

Это выражение будет матчить TenGigabitEthernet1/ с 1 по 8, GigabitEthernet2/ с 1 по 9, GigabitEthernet2/ с 10 по 29, unrouted VLAN с 1 по 3499. Символ ^ – матчить в начале строки, $ – в конце строки.

Для джунипера:

^xe-2/0/[0-3]$|^xe-2/0/[0-3].[0-9]{1,4}$|^fxp[0-9]-[0-9]+$|^irb.[0-9]+$

xe-2/0/[0-3].[0-9]{1,4} – будут матчиться интерфейсы xe-2/0/0-3.0000-9999. {1,4} – значит повторить предыдущее значение от  1 до 4 раз.

До этого я пытался экранировать слешы обратным слешем, но в заббиксе это не работает. так же в заббиксе есть инструмент для тестирования регекспов (администрирование-регулярные выражения).

Скрипт проверки DHCP

Раз в 10 минут по крону запускается скрипт:
crontab -e
*/10 * * * * /home/dhcpd_check
cat dhcpd_check
#!/bin/bash
dhcpd_status1=`sudo dhcping -s 10.23.8.20`
dhcpd_status2=`sudo dhcping -s 10.23.8.21`
if [ “$dhcpd_status1” != “Got answer from: 10.23.8.20” ]
then
/usr/bin/sendemail -o message-charset=utf-8 -f zabbix_mon@test.ru -t monitoring@test.ru -m !!! Внимание !!! Проверка показала, что dhcp сервер 10.23.8.20 не ответил на запрос. Попробуйте получить ip-адрес. -u Внимание! Необходимо проверить dhcp сервер 10.23.8.20! -s mail.test.ru -xp 123 -xu zabbix_mon@test.ru
fi

if [ “$dhcpd_status2” != “Got answer from: 10.23.8.21” ]
then
/usr/bin/sendemail -o message-charset=utf-8 -f zabbix_mon@test.ru -t monitoring@test.ru -m !!! Внимание !!! Проверка показала, что dhcp сервер 10.23.8.21 не ответил на запрос. Попробуйте получить ip-адрес. -u Внимание! Необходимо проверить dhcp сервер 10.23.8.21! -s mail.test.ru -xp 123 -xu  zabbix_mon@test.ru
fi

exit

dhcping делает запрос на получение адреса 0.0.0.0 Получив ответ от сервера, что такого адреса нет, он выдает в консоль:
Got answer from: 10.23.8.20

Скрипт проверяет каждый сервер и отправляет пиьсмо по send_mail’у в случае неудачи