Table of Contents

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

Модуль 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. Настройка мониторинга коммутаторов с автоматическим добавлением

conf t
snmp-server community public RO
end
wr

# service zabbix-server restart

Модуль 5. Создание карты сети

!!! Можно, для примера, добавить одну линию связи

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

Аутентификация

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

server.corp1.un:~# apt install jq
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": {},
...
...
    "params": {
        "output": ["hostid", "host"]
    },
...
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

Простой пример изменения конфигурации через 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

Алгоритм добавления коммутатора

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
server.corp1.un:~# /root/rsh_get_links.sh | tee list_selements_label.txt
server.corp1.un:~# /root/zab_set_link_name.sh