====== 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