NetBox IPAM ve DCIM: Ağ Envanterini Otomasyona Bağlamak
NetBox; IP adres yönetimi ile veri merkezi altyapı envanterini tek veritabanında birleştiren açık kaynak bir uygulama. Proje DigitalOcean bünyesinde iç araç olarak başladı, zamanla netbox-community çatısı altında büyüdü, bakımı bugün NetBox Labs ekibinde. Django üzerinde yazılmış, PostgreSQL ve Redis bağımlılıkları var. Kurulumundan çok kullanım şekli önemli: NetBox ağın tek doğruluk kaynağı olarak konumlanıyor ve her nesne API üzerinden erişilebilir olacak şekilde tasarlanmış.
Tek doğruluk kaynağı fikri
Ansible ile config basıyorsunuz, Terraform ile VLAN tanımlıyorsunuz, monitoring ekibi host listesi bekliyor. Bu zincirin her halkası envanter verisine ihtiyaç duyuyor ve veri bozuksa üretilen çıktı da bozuk oluyor. NetBox bu boşluğu doldurur: panel ile API aynı veriye bakar, arayüzde yaptığınız değişiklik anında endpointten okunabilir durumdadır. Her nesnede değişiklik günlüğü tutulur; kim, ne zaman, hangi alanı değiştirmiş hepsi kayıttadır. Bu yüzden bir adres tablosundan ibaret değil, otomasyonun girdi noktasıdır.
IPAM tarafı: prefix hiyerarşisi ve boş IP tahsisi
Prefixler iç içe tanımlanabiliyor. Bir /16yı container olarak işaretleyip altına /24lük çocuklar açmak mümkün. Prefix durumları arasında active, reserved, deprecated ve container değerleri var; hangi bloğun kullanımda olduğunu bu etiketlerle ayırt ediyorsunuz. Çakışan adres alanları için VRF nesnesi, route distinguisher alanıyla birlikte geliyor. VLAN ve VLAN grupları da aynı model içinde yaşadığı için hangi prefixin hangi VLANa baktığı ilişkiyle tutuluyor.
IP adresleri üzerinde de durum alanı bulunuyor: active, reserved, deprecated, DHCP, IPv6 tarafında SLAAC. Otomasyon açısından en işe yarayan detay şu: bir prefixin altındaki boş IPleri listeleyen hazır bir API yolu var. /api/ipam/prefixes/<id>/available-ips/ adresine POST attığınızda bir sonraki müsait IP tahsis edilmiş olarak dönüyor. Betik içinde boş adres arama mantığı yazmanıza gerek kalmıyor.
DCIM tarafı: raf ünitesinden kablo ucuna
Site, rack, device sıralaması merkezde. Raflarda ünite ızgarası ve rezervasyon desteği var; belirli üniteleri proje için bloke edebiliyorsunuz. Cihaz tanımı iki katmanlı: üretici ve modele bağlı device type şablonu ile o şablondan türeyen somut cihaz. Arayüzler, konsol portları, güç portları gibi bileşenler type seviyesinde tanımlanıp cihazlara yansıtılıyor. Kablo nesnesi iki uç arasında bağ kuruyor ve arayüzdeki Trace fonksiyonu patch panel üzerinden karşı uca kadar tüm yolu gösteriyor.
Bunların yanında cluster ve sanal makina modeli, WAN devreleri için provider ve circuit nesneleri, sahiplik için tenant yapısı mevcut. Bir sanal makinenin arayüzüne IP atamak, fiziksel cihaz arayüzüne atamakla aynı akış.
API iki kapılı
REST API /api/ altında tüm modelleri yansıtıyor: /api/dcim/devices/, /api/ipam/prefixes/ gibi. Kimlik doğrulama token ile; kullanıcı profilinden ürettiğiniz tokenı headera koyuyorsunuz.
curl -H "Authorization: Token <token>" \
https://netbox.ornek.local/api/dcim/devices/?limit=100 Sayfalama limit ve offset parametreleriyle yapılıyor. Çekmeniz gereken nesne tipi çoksa /graphql/ altındaki GraphQL API tek sorguda birden fazla nesne tipini birleştirmenize izin veriyor. Monitoring ve raporlama işleri için bu ciddi zaman kazandırıyor.
pynetbox ile Python tarafından
import pynetbox
nb = pynetbox.api(
"https://netbox.ornek.local",
token="buraya-token"
)
for prefix in nb.ipam.prefixes.filter(status="active"):
print(prefix.prefix)
pynetbox, REST APInin resmi Python istemcisi gibi kullanılıyor. filter çağrıları query parametresine çevriliyor, create ile yazma tarafı da aynı kolaylıkta. Betiklerinizi SoTya bağlamanın en kısa yolu bu kütüphane.
Ansible envanterini oradan devşirmek
netbox.netbox koleksiyonu iki yönlü çalışıyor. nb_inventory eklentisi NetBoxu dinamik envanter kaynağına çeviriyor:
plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.ornek.local
token: buraya-token
group_by:
- sites
Aynı koleksiyondaki netbox_device, netbox_prefix, netbox_ip_address gibi modüllerle ters yönde yazma da yapılabiliyor. Yani playbook hem envanteri NetBoxtan okuyup hem çıktıyı NetBoxa yazabiliyor.
Webhook, script, doğrulayıcı
Webhook tanımı Event Rules üzerinden yapılıyor; nesne tipi ve olay türü (create, update, delete) seçilip hedef URLye JSON gövde POST ediliyor. URL, header ve gövde alanlarında Jinja2 şablonu desteklendiği için giden isteğin biçimi alıcı sisteme göre uyarlanabiliyor. Custom script sistemi Python fonksiyonlarını panel içinden ve API üzerinden çalıştırıyor; envanter denetimi yapan kodu cron gibi değil NetBoxın kendisi içinde tutuyorsunuz. Custom validatorlarla kayıt anında isimlendirme kuralı ihlal edilirse kaydı reddedebiliyorsunuz. Jinja2 tabanlı export template, hemen her nesneye eklenebilen custom field ve journal kayıtları da aynı felsefenin parçaları.
Kurulum ve ekosistem
PostgreSQL ve Redis zorunlu bileşenler; Redis hem önbellek hem kuyruk işleri için kullanılıyor. Konteyner tarafını topluluğun netbox-docker deposu götürüyor. Eklenti ekosistemi geniş: netbox-dns ile zone kayıtlarını, netbox-bgp ile ASN ve session verilerini, netbox-topology-views ile cihaz bağlantı grafiklerini aynı panele taşıyabiliyorsunuz. Proje açık kaynak; kod deposu ve resmi dokümantasyonu herkese açık durumda.
NetBoxın getirisi envanteri bir kez düzgün modellemekten geçiyor. Veri disiplinini kurabilen ekipler için otomasyon zincirinin en sağlam halkası haline geliyor; kuramayanlar için ise yalın bir adres defteri olarak kalıyor.