נתקלנו פעמים רבות במצבים שבהם גיליון אלקטרוני עם כתובות IP ש"כולם מכירים" מפסיק לעבוד בשלב מסוים. מישהו מקצה 10.20.30.50 לשרת חדש, בלי לדעת שהכתובת כבר תפוסה. מישהו שוכח לעדכן את המסמך לאחר העברת חומרה. Terraform מנסה ליצור משאב עם IP שכבר בשימוש ונכשל. NetBox פותר את זה: הוא מקור האמת היחיד לכתובות IP, מלאי ציוד, תיעוד כבלים וקשרים בין אובייקטי רשת. במשך יותר מ-5 שנים, פרסנו את NetBox ביותר מ-20 פרויקטים—החל מסטארטאפים קטנים ועד ארגונים עם אלפי התקנים.
למה NetBox עדיף על גיליונות אלקטרוניים
גיליונות אלקטרוניים לא מבטיחים שלמות התייחסותית: מהנדס אחד משנה IP, אחר מפספס את העדכון. NetBox משתמש במודל יחסי: Prefix → IP Address → Interface → Device → Site. כל שינוי נראה מיידית לכולם, וה-API מבטל שגיאות ידניות. השוואה: בדיקת התנגשויות IP ידנית בגיליון אלקטרוני אורכת 10–30 דקות; NetBox עושה זאת בשניות.
| קריטריון | Google Sheets | NetBox |
|---|---|---|
| שלמות נתונים | אין (תיאום ידני) | כן (מסד נתונים יחסי, טרנזקציות) |
| API / אוטומציה | אין | REST API, Python SDK, Webhooks |
| RBAC / ביקורת | אין | כן (תפקידים, היסטוריית שינויים) |
| חיפוש התנגשויות IP | ידני, 10–30 דקות | אוטומטי, <1 שנייה |
איך אנחנו מקימים NetBox במפתח אחד
אנחנו מטפלים בכל המחזור: מהפריסה ועד הדרכת הצוות.
פריסה והתקנה ראשונית
NetBox מותקן דרך Docker או ישירות על Linux. אפשרות ה-Docker קלה יותר לתחזוקה:
---
# docker-compose.yml (фрагмент)
services:
netbox:
image: netboxcommunity/netbox:v3.7
environment:
- DB_HOST=postgres
- DB_NAME=netbox
- DB_USER=netbox
- DB_PASSWORD=${DB_PASSWORD}
- SECRET_KEY=${SECRET_KEY}
- ALLOWED_HOSTS=netbox.internal
volumes:
- ./config/configuration.py:/etc/netbox/config/configuration.py
depends_on:
- postgres
- redis
ב-# docker-compose.yml (фрагмент) services: netbox: image: netboxcommunity/netbox:v3.7 environment: - DB_HOST=postgres - DB_NAME=netbox - DB_USER=netbox - DB_PASSWORD=${DB_PASSWORD} - SECRET_KEY=${SECRET_KEY} - ALLOWED_HOSTS=netbox.internal volumes: - ./config/configuration.py:/etc/netbox/config/configuration.py depends_on: - postgres - redis , חשוב להגדיר configuration.py, להגדיר LDAP/SSO אם נדרשת אינטגרציה עם Active Directory, ולהגדיר ALLOWED_HOSTS עבור SSO דרך SAML או OAuth2. בלי זה, משתמשים נוצרים ידנית—לא ריאלי בסביבת ייצור.
מבנה נתונים: מפיזי ללוגי
NetBox מתאר תשתית בשכבות. רמה פיזית: Sites → Racks → Devices. רמה לוגית: IP Address → Prefix → VRF → RIR. החיבור: להתקנים יש Interfaces, ול-Interfaces יש כתובות IP מתוך Prefix מסוים.
לתשתית חדשה, הסדר הוא: ליצור Site, להוסיף Rack (עם גובה יחידות מדף), לרשום Device Types (ניתן לייבא מהספרייה הרשמית REMOTE_AUTH_BACKEND). Device Types הם תבניות שמציינות אילו Interfaces, ספקי כוח וחריצים יש לדגם שרת מסוים. בעת יצירת Device מתוך סוג, כל הרכיבים נוצרים אוטומטית.
לכתובות IP: ליצור RIR (לדוגמה, RFC 1918 למרחב פרטי), להוסיף Aggregates (לדוגמה, 10.0.0.0/8), לחלק ל-Prefixes לפי מטרה—netbox-community/devicetype-library לכל VLAN. בעת הקצאת כתובת דרך ממשק המשתמש או API, NetBox בוחר אוטומטית את הכתובת הפנויה הבאה ב-Prefix שצוין.
API ככלי האינטגרציה המרכזי
הערך של NetBox אינו בממשק המשתמש היפה אלא ב-REST API וב-Python SDK. דוגמה דרך /24:
import pynetbox
nb = pynetbox.api('https://netbox.internal', token='abc123...')
# Найти следующий свободный IP в prefix
prefix = nb.ipam.prefixes.get(prefix='10.20.30.0/24')
next_ip = prefix.available_ips.create()
print(next_ip)
# {'address': '10.20.30.12/24', 'family': 4}
# Зарегистрировать новый сервер
device = nb.dcim.devices.create(
name='node-07',
device_type=nb.dcim.device_types.get(model='PowerEdge R640').id,
site=nb.dcim.sites.get(slug='dc-main').id,
device_role=nb.dcim.device_roles.get(slug='server').id,
status='active'
)הקוד הזה נקרא מתוך playbook של Ansible במהלך הקצאת שרת—ה-IP מוקצה אוטומטית, המארח נרשם ב-CMDB, ולאחר מכן Terraform או כלים אחרים קוראים את התשתית מ-NetBox כמקור האמת.
מלאי דינמי של Ansible דרך NetBox:
# inventory/netbox.yml
plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.internal
token: "{{ lookup('env', 'NETBOX_TOKEN') }}"
group_by:
- device_roles
- sites
- tags
pynetbox מחזיר את כל ההתקנים עם סטטוס import pynetbox nb = pynetbox.api('https://netbox.internal', token='abc123...') # Найти следующий свободный IP в prefix prefix = nb.ipam.prefixes.get(prefix='10.20.30.0/24') next_ip = prefix.available_ips.create() print(next_ip) # {'address': '10.20.30.12/24', 'family': 4} # Зарегистрировать новый сервер device = nb.dcim.devices.create( name='node-07', device_type=nb.dcim.device_types.get(model='PowerEdge R640').id, site=nb.dcim.sites.get(slug='dc-main').id, device_role=nb.dcim.device_roles.get(slug='server').id, status='active' ) , מקובצים לפי תפקידים ואתרים.
שדות מותאמים אישית ו-Webhooks
לתכונות ספציפיות (לדוגמה, מספר כרטיס רכישה, מהנדס אחראי, תאריך תפוגת אחריות), משתמשים ב-Custom Fields—נוספים דרך ממשק המשתמש או API ללא שינוי סכמת מסד הנתונים.
Webhooks מאפשרים תגובה לאירועים: כאשר נוצרת כתובת IP חדשה, ניתן לשלוח בקשת POST ל-Ansible AWX כדי להפעיל playbook, או ל-JIRA כדי ליצור משימה. מוגדר דרך # inventory/netbox.yml plugin: netbox.netbox.nb_inventory api_endpoint: https://netbox.internal token: "{{ lookup('env', 'NETBOX_TOKEN') }}" group_by: - device_roles - sites - tags :
{ "name": "New IP → AWX",
"type_create": true,
"object_type": "ipam.ipaddress",
"url": "https://awx.internal/api/v2/job_templates/42/launch/",
"http_method": "POST",
"http_content_type": "application/json",
"secret": "webhook-secret"
} | סוג אירוע | פעולה | דוגמת אינטגרציה |
|---|---|---|
| IP נוצר | הפעלת playbook של Ansible | AWX, Tower |
| Site שונה | סנכרון DNS | Ansible, Terraform |
| Device הוצא משימוש | הודעת Slack | Webhook → Slack |
מה כלול
- פריסה בסיסית: תשתית Docker, LDAP/SSO, הגדרת גיבוי.
- ייבוא נתונים: העברת כתובות IP קיימות, התקנים, חיבורים (סקריפטים או הזנה ידנית).
- אינטגרציות: Ansible (מלאי דינמי), Terraform (מקורות נתונים), webhooks ל-CI/CD.
- תיעוד: תיאור מודל הנתונים, הוראות לצוות, runbook לפעולות נפוצות.
- הדרכה: 2–3 מפגשים למנהלים ומפתחים.
- תמיכה: חודש אחד של תמיכה לאחר השחרור.
לוח זמנים ומחירים
פריסה בסיסית עם Docker, הגדרת LDAP, ייבוא Device Types—2–3 ימי עסקים. מילוי התשתית הקיימת (כתובות IP, התקנים, racks) תלוי בהיקף: 50–100 התקנים ידנית או דרך סקריפט ייבוא—עוד 2–5 ימים. אינטגרציה עם Ansible, Terraform, הגדרת webhook—בלוק נפרד של 1 עד 3 ימים בהתאם למספר האינטגרציות. המחיר מחושב באופן אישי לאחר ביקורת. נבחן את הפרויקט שלכם—צרו קשר.







