====== Zabbix - построение топологии сети ====== ===== Запись ===== * [[https://youtu.be/ZrNScBG9TnU|Zabbix: топология сети наглядно и автоматически]] ===== История вопроса ===== * [[http://su.bmstu.ru|Построение топологии сети в МГТУ им.Н.Э.Баумана]] * [[https://www.zabbix.com/forum/in-russian/44171-perl-script-%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F-%D1%82%D0%BE%D0%BF%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8-%D1%81%D0%B5%D1%82%D0%B8-%D0%B2-zabbix|Perl script Авторисования топологии сети в Zabbix]] ===== Модуль 1. Развертывание стенда ===== ==== Выбор сети для виртуальных машин ==== * !!! Отключить не используемые адаптеры * !!! Не разборчивый режим: разрешить все C:\Users\Student1>ipconfig ... IPv4-адрес. . . . . . . . . . . . : 192.168.1.5 Маска подсети . . . . . . . . . . : 255.255.255.0 Основной шлюз. . . . . . . . . : 192.168.1.1 ==== Настройка сети сервера мониторинга ==== # cat /etc/hostname server.corp1.un # cat /etc/hosts 127.0.0.1 localhost 192.168.1.100 server.corp1.un server # cat /etc/resolv.conf search corp1.un nameserver 192.168.1.1 # cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 ===== Модуль 2. Развертывание Zabbix ===== ==== Zabbix ==== * [[Локализация системы#Локализация временной зоны]] * Установка и запуск сервера в [[Сервис Zabbix#Debian/Ubuntu]] * [[Сервис Zabbix#Установка и запуск web интерфейса]] * [[Сервис Zabbix#Настройка мониторинга]] - Подключение ===== Модуль 3. Развертывание облака коммутаторов ===== ==== Минимальная конфигурация ==== configure terminal hostname switchN ip domain-name corp1.un int vlan 1 ip address 192.168.1.10N 255.255.255.0 no shut no ip domain lookup end copy running-config startup-config ===== Модуль 4. Настройка мониторинга коммутаторов с автоматическим добавлением ===== * [[https://www.zabbix.com/documentation/3.2/ru/manual/discovery/network_discovery|Zabbix Documentation Обнаружение сети]] * Настройка коммутаторов conf t snmp-server community public RO end wr * [[Сервис SNMP#Установка snmp консоли]] * [[Сервис SNMP#Варианты использования snmp консоли в режиме чтения]] # service zabbix-server restart * [[Сервис Zabbix#Автоматическое добавление]] устройств в Zabbix ===== Модуль 5. Создание карты сети ===== * [[https://www.zabbix.com/documentation/3.0/ru/manual/config/visualisation/maps/map|Zabbix Documentation Настройка карты сети]] !!! Можно, для примера, добавить одну линию связи Name: Switches map Edit Map Add Type: Host Label: switch1 Host: switch1.corp1.un Icons: Switch_(96) ... Label: switch2 Host: switch2.corp1.un ... Label: switch3 Host: switch3.corp1.un ... ===== Модуль 6. Настройка автоматического создания/обновления линий связи ===== ==== Протокол CDP ==== switch1#show cdp neighbors Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge S - Switch, H - Host, I - IGMP, r - Repeater Device ID Local Intrfce Holdtme Capability Platform Port ID switch2.corp1.un Fas 0/N 164 R S I 3640 Fas 0/V switch3.corp1.un Fas 0/M 165 R S I 3640 Fas 0/W ==== Протокол RSH ==== * Настройка коммутаторов conf t ip host server 192.168.1.100 ip rcmd rsh-enable ip rcmd remote-host root server root enable end wr * Подключение с сервера мониторинга server.corp1.un:~# apt install rsh-client server.corp1.un:~# rsh switch1 show cdp neighbors server.corp1.un:~# apt install dos2unix server.corp1.un:~# rsh switch1 -n show cdp nei | dos2unix | grep switch | tr -s " " | cut -d " " -f1,2,3,9,10 или server.corp1.un:~# rsh switch1 -n show cdp nei | dos2unix | tr '\n' ' ' | sed 's/switch/\nswitch/g' | grep switch | tr -s " " | cut -d " " -f1,2,3,9,10 ==== Zabbix API ==== * [[https://ru.wikipedia.org/wiki/JSON|Материал из Википедии. JSON]] * [[https://www.zabbix.com/documentation/1.8/ru/api/getting_started|Zabbix Documentation Начало работы с Zabbix API]] === Аутентификация === * [[https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/36900-api-key-lifetime|api key lifetime]] server.corp1.un:~# apt install curl server.corp1.un:~# curl -s -k -X POST -H 'Content-Type: application/json-rpc' -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 1 } ' http://127.0.0.1/zabbix/api_jsonrpc.php {"jsonrpc":"2.0","result":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","id":1} === Работа с объектами host === * Утилита для обработки JSON server.corp1.un:~# apt install jq * Получение списка идентификаторов и имен коммутаторов из Zabbix server.corp1.un:~# curl -s -k -X POST -H 'Content-Type: application/json-rpc' -d ' { "jsonrpc": "2.0", "method": "host.get", "params": { "output": "extend" }, "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "id": 2 } ' http://127.0.0.1/zabbix/api_jsonrpc.php | jq ... * Варианты оформления "params" ([[https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/25384-zabbix-json-api-output-parameter|Zabbix JSON API output parameter]]): ... "params": {}, ... ... "params": { "output": ["hostid", "host"] }, ... * Оформление запросов в виде BASH скриптов server.corp1.un:~# export AUTH=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx server.corp1.un:~# cat /root/zab_get_hosts.sh #!/bin/sh curl -s -k -X POST -H 'Content-Type: application/json-rpc' -d " { \"jsonrpc\": \"2.0\", \"method\": \"host.get\", \"params\": {}, \"auth\": \"${AUTH}\", \"id\": 2 } " http://127.0.0.1/zabbix/api_jsonrpc.php server.corp1.un:~# /root/zab_get_hosts.sh | jq '.result | .[] | .host' server.corp1.un:~# /root/zab_get_hosts.sh | jq '.result | .[] | {hostid: .hostid, host: .host}' server.corp1.un:~# /root/zab_get_hosts.sh | jq '.result | .[] | {hostid: .hostid, host: .host} | tostring' server.corp1.un:~# /root/zab_get_hosts.sh | jq '.result | .[] | {hostid: .hostid, host: .host} | tostring' | grep switch | tr -d '{}\\' | tr '"' ' ' | cut -d ' ' -f5,9 Добавляем конвейер в конец скрипта и записываем результат в файл: server.corp1.un:~# /root/zab_get_hosts.sh | tee list_hostid_host.txt 10111 switch1.corp1.un 10112 switch2.corp1.un 10113 switch3.corp1.un === Получение списка карт и их элементов из Zabbix === server.corp1.un:~# cat /root/zab_get_maps.sh #!/bin/sh curl -s -k -X POST -H 'Content-Type: application/json-rpc' -d " { \"jsonrpc\": \"2.0\", \"method\": \"map.get\", \"params\": { \"selectLinks\": \"extend\", \"selectSelements\": \"extend\" }, \"auth\": \"${AUTH}\", \"id\": 2 } " http://127.0.0.1/zabbix/api_jsonrpc.php | \ #jq ###zabbix3 jq '.result | .[] | .selements | .[] | {elementid: .elementid, selementid: .selementid} | tostring' | tr -d '{}\\' | tr '"' ' ' | cut -d ' ' -f5,9 ###zabbix4 #jq '.result[1].selements[] | {elements, selementid} | tostring' | tr -d '{}\\' | tr '"' ' ' | cut -d ' ' -f7,11 server.corp1.un:~# /root/zab_get_maps.sh | tee list_hostid_selementid.txt 10084 1 10111 2 10112 3 10113 4 === Сводим все вместе, через CDP и RSH, выясняем, какие коммутаторы на карте через какие интерфейсы связаны === server.corp1.un:~# cat /root/rsh_get_links.sh #!/bin/sh LIST_HOSTID_HOST=/root/list_hostid_host.txt LIST_HOSTID_SELEMENTID=/root/list_hostid_selementid.txt while read HOSTID HOST do rsh $HOST -n show cdp nei | dos2unix | grep switch | tr -s " " | cut -d " " -f1,2,3,9,10 | while read CDPNEI LINKINTFACES do HOSTID2=`grep $CDPNEI $LIST_HOSTID_HOST | cut -d' ' -f1` SELEMENT2=`grep $HOSTID2 $LIST_HOSTID_SELEMENTID | cut -d' ' -f2` SELEMENT1=`grep $HOSTID $LIST_HOSTID_SELEMENTID | cut -d' ' -f2` echo $SELEMENT1 $SELEMENT2 $LINKINTFACES done done < $LIST_HOSTID_HOST server.corp1.un:~# /root/rsh_get_links.sh | tee list_selements_label.txt 2 3 Fas 0/2 Fas 0/5 2 4 Fas 0/8 Fas 0/5 3 2 Fas 0/5 Fas 0/2 4 2 Fas 0/5 Fas 0/8 === Рисование линий связи в Zabbix === * [[https://www.zabbix.com/documentation/3.0/manual/api/reference/map/create|Zabbix Documentation - map.create]] * [[https://www.zabbix.com/documentation/3.0/manual/api/reference/map/update|Zabbix Documentation - map.update]] Простой пример изменения конфигурации через Zabbix API server.corp1.un:~# cat /root/zab_set_map_name.sh #!/bin/sh MAPID=$1 MAPNAME=$2 curl -s -k -X POST -H 'Content-Type: application/json-rpc' -d " { \"jsonrpc\": \"2.0\", \"method\": \"map.update\", \"params\": { \"sysmapid\": \"${MAPID}\", \"name\": \"${MAPNAME}\" }, \"auth\": \"${AUTH}\", \"id\": 2 } " http://127.0.0.1/zabbix/api_jsonrpc.php server.corp1.un:~# /root/zab_set_map_name.sh 2 "Super MAP" server.corp1.un:~# cat /root/zab_set_link_name.sh #!/bin/sh MAPID=2 SELEMENTS_LABEL=/root/list_selements_label.txt LINKS="" while read SELEMENTID1 SELEMENTID2 LABEL do LINKS="$LINKS { \"label\": \"${LABEL}\", \"selementid1\": \"${SELEMENTID1}\", \"selementid2\": \"${SELEMENTID2}\" }," done < $SELEMENTS_LABEL #LINKS=`echo $LINKS | rev | cut -c 2- | rev` #LINKS=`echo -n ${LINKS::-1}` JSON=" { \"jsonrpc\": \"2.0\", \"method\": \"map.update\", \"params\": { \"sysmapid\": \"${MAPID}\", \"links\": [ ${LINKS} ] }, \"auth\": \"${AUTH}\", \"id\": 2 } " curl -s -k -X POST -H 'Content-Type: application/json-rpc' -d "$JSON" http://127.0.0.1/zabbix/api_jsonrpc.php server.corp1.un:~# /root/zab_set_link_name.sh === Алгоритм добавления коммутатора === * Добавляем в GNS новый коммутатор (с snmp и rsh) и ждем, пока он появится в Zabbix, затем: server.corp1.un:~# /root/zab_get_hosts.sh | tee list_hostid_host.txt * Добавляем новый коммутатор на карту (и не забываем сохранить!!!), затем: server.corp1.un:~# /root/zab_get_maps.sh | tee list_hostid_selementid.txt * Затем, а так же, при изменении топологии (в GNS перезагрузить узлы для поднятия линков и чистки таблиц CDP) server.corp1.un:~# /root/rsh_get_links.sh | tee list_selements_label.txt * Затем, перерисовываем связи: server.corp1.un:~# /root/zab_set_link_name.sh