Сложно поддерживать IPAM NetBox в актуальном состоянии, если вы делаете это сами, вручную. А если потребности не ограничены IPAM и вы пытаетесь держать в порядке DCIM NetBox?
Нужен инструмент, который будет:
- собирать данные и добавлять в БД NetBox
- проверять ранее добавленные в БД NetBox данные и исправлять при необходимости
- работать с планировщиком
Данные можно собирать с самих сетевых устройств, с помощью netmiko. Netmiko поддерживает большое число платформ и легко интегрируется с TextFSM, что полезно для CLI-устройств.
Это не быстро, но можно использовать потоки, с помощью concurrent.futures и threading.
Что касается способов работы с API NetBox, то можно воспользоваться SDK Pynetbox. Получить список endpoint’ов при этом не составит труда, NetBox имеет специфицированный API - подробнее.
Готовый инструмент с подробным README
здесь. В списке поддерживаемых платформ пока только Huawei VRP
.
Осталось закрыть вопрос с планировщиком.
Нам потребуется Python 3.7 - установим в виртуальном окружении:
Подготовим yaml-конфигуратор с набором параметров. Например, devices.yaml
:
- netbox: http://netbox_domain_name_or_ip/
token: netbox_token
device_type: huawei
ip_list: ["10.1.1.1-5"]
threads: True
max_workers: 5
inventory: True
username: user
password: password
- netbox: http://netbox_domain_name_or_ip/
token: netbox_token
device_type: huawei
ip_list: ["10.2.2.140,148,156"]
threads: True
max_workers: 3
inventory: True
username: user
password: password
Пишем run.py
:
# предположим, это путь до python3.7 в только что созданном виртуальном окружении
#!/home/user/virtenvs/py3.7/bin/python3.7
import yaml
from vendor_selector import VendorSelector
# yaml-параметры будем передавать как аргументы
from sys import argv
# запускаем как run.py 0, где 0 - словарь из devices.yaml
with open("devices.yaml") as f:
devices = yaml.safe_load(f)
params_number = int(argv[1])
obj = VendorSelector(**devices[params_number])
obj.send_ip_list()
Пишем run.sh
для запуска в crond:
#/bin/bash
# переключаемся на виртуальное окружение с python3.7
source /home/user/virtenvs/py3.7/bin/activate
# устанавливаем максимальное число запущенных параллельно процессов
BG_MAX_PROCESS=2
BG_PROCESS=0
MY_PID=$$
# кол-во словарей с параметрами в devices.yaml = общее кол-во запущенных процессов
PARAMS_COUNTER=$(( $(awk '/^- /{print $0}' devices.yaml | wc -l) - 1 ))
for (( i = 0; i <= $PARAMS_COUNTER; i++ ))
do
BG_PROCESS=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
while [ $BG_PROCESS -gt $BG_MAX_PROCESS ]
do
BG_PROCESS=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
sleep 1
done
echo TASK NUMBER: $i FROM $PARAMS_COUNTER
# запускаем run.py с соотв. аргументом как фоновый процесс
/home/user/virtenvs/py3.7/bin/python /path_to_run.py/run.py $i &
done
printf "\nTASKS FINISHING...\n"
BG_PROCESS=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
# ожидаем пока выполнятся последние 2 процесса
# уведомляем о завершении всех процессов
printf "LAST $BG_PROCESS PROCESSES\n"
while [ $BG_PROCESS -gt 1 ]
do
BG_PROCESS=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
#clear
#echo LAST $BG_PROCESS PROCESSES
sleep 1
done
printf "\nALL TASKS HAVE DONE\n"
Добавляем в crontab, запускаем каждый день в 00:01, а лог сохраняем в /tmp/cronlog.txt:
chmod +x /path_to_run.sh/run.sh
crontab -e
01 00 * * * bash /path_to_run.sh/run.sh 2>&1 /tmp/cronlog.txt