Как NetBox с Prometheus подружились

Начнем с постановки задачи:

Как “прод лёг”?

Если использовать Ansible для разворачивания системы мониторинга, то получаем ещё один минус в ручном редактировании списка наблюдаемых машин: список составляется из jinja шаблона и адреса машин нужно редактировать в group_vars. Редактирование этих файлов руками нескольких людей да ещё и из разных отделов может привести к ошибкам. Поэтому хорошо было бы брать данные из внешней БД.

Да, я знаю про Consul, но не всем и не всегда он подходит. Поэтому в этом посте будем разбираться с pynetbox

Когда узнал про pynetbox
  • Спросить у NetBox’a список устройств
  • Создать из него yaml для Prometheus
  • Положить новый yaml в нужное место
#!/usr/bin/python3
#

from jinja2 import Template, Environment, FileSystemLoader
import os, sys, pynetbox


usage = """Usage: python3 netbox2wmi.py [netbox_ip] [API Token] [manufacturer] [output_file]
e.g. python3 netbox2blackbox.py 10.0.0.10:32769 Gdstwt53t6gdsTGSXHey Microsoft /etc/prometheus/file_sd/targets.yml"""

if len(sys.argv) != 5:
print(usage)
sys.exit(0)

netbox_url = 'http://' + sys.argv[1]
token = sys.argv[2]
# What device manufacturer export to targets.yml
manufacturer = sys.argv[3]
target_file = sys.argv[4]

# Fetch vm list from NetBox
try:
nb = pynetbox.api(url=netbox_url, token=token)
except pynetbox.core.query.RequestError as error:
print(error.error)
sys.exit(1)
# Шаблон выходного файла
data = '''
#
# Managed by netbox2wmi.py. DON'T EDIT THIS FILE!!!
#

{% for vm in vms %}
- labels:
vm_name: "{{ vm.name }}"
env: prod
targets: {{ vm.address }}
{% endfor %}
'''

template = Template(data)

### Выборка машин по manufacturer ###
# Получаем список всех объектов Virtual_machine
vm_group = nb.virtualization.virtual_machines.all()
# Инициализируем новый список с нужными нам объектами
vms = []
for vm in vm_group:
if str(vm.platform.manufacturer) == manufacturer:
# Именованный список. name - имя машины, address - ip. У адреса срезаем маску - три последних символа
target = {}
target['name'] = vm.name
target['address'] = str(vm.primary_ip)[:-3]
# Записываем в новый список с нужными нам объектами
vms.append(target)
### Выборка машин по manufacturer #### Создание конфига
config = template.render(vms=vms)
# Запись конфига в файл
with open(target_file, 'w') as file:
file.write(config)
{% for vm in vms %}
- labels:
vm_name: "{{ vm.name }}"
env: prod
targets: {{ vm.address }}
config = template.render(vms=vms)

--

--

--

Network Automation Engineer. MikroTik expert. Hiking guy

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
bubnov

bubnov

Network Automation Engineer. MikroTik expert. Hiking guy

More from Medium

CLARION CALL

For Ukraine’s Lost Heroes

Post 3: Spider-Verse