ADSM3. نظم IPAM / DCIM

في سلسلة ADSM السابقة ، قمنا بتطوير إطار الأتمتة ، اكتشفنا سبب ظهور المحاكاة الافتراضية وكيف تعمل. في الجزء الأخير ، قمنا باختيار وتبرير تصميم الشبكة ، وأدوار الأجهزة والمصنعين ، وقررت على LLD (عنونة ، وتوجيه ، وعدد من أنظمة الحكم الذاتي).

نحن الآن على استعداد للتفكير في كيفية تخزين هذا الجبل بأكمله من المعلومات ثم استعادته بسهولة.

لا ، بالطبع ، هناك شركات اليوم تتتبع عناوين IP المخصصة في جدول بيانات Excel. لكن هذا ليس طريقنا.

حتى بالنسبة لأصغر مكتب في فرعين ، فإن وجود نظام مركزي لإدارة الملكية الفكرية لن يضر.

الحاجة إلى نظام جرد واضح دون كلمة.



جميع قضايا ADSM:

0. ADSM. الجزء صفر. تخطيط
1. ADSM. الجزء الأول (والذي هو بعد الصفر). الشبكة الافتراضية
2. ADSM. الجزء الثاني. تصميم الشبكات
3. ADSM. الجزء الثالث. نظام IPAM / DCIM

هذه المشكلة سأكرسها للأنظمة المتكاملة في أتمتة الشبكات - نظام إدارة مساحة العنوان ونظام المخزون.

سنقوم باختياره وتثبيته ، وسنتعامل مع البنية ومخطط قاعدة البيانات وواجهات التفاعل وملئه. وفي الأجزاء التالية ، سنبدأ في كتابة نصوص بسيطة تعمل على أتمتة العمليات المتكررة ، مثل إضافة رفوف جديدة.

بالإضافة إلى ذلك ، لقد قمت بالفعل بنشر مقالة منفصلة عن واجهة برمجة تطبيقات RESTful ، والتي قمت فيها بمراجعة مختصرة لمبادئها وعملها ، وسنحتاج إليها.

محتوى


  • بنية النظام
  • مخطط بيانات NetBox
  • استنتاج
  • بعض الفروق الدقيقة في تثبيت NetBox
  • قليلا عن بوستجرس
  • روابط مفيدة

اليوم ، يقدم السوق حوالي 12 أداة تنفذ هذه المهمة: مدفوعة ومفتوحة المصدر.

بالنسبة للمهام في سلسلة المقالات هذه ، اخترت NetBox للأسباب التالية:

  1. إنه مجاني
  2. أنه يحتوي على كل من الأجزاء الضرورية - إدارة المخزون ومساحة IP.
  3. لديها واجهة برمجة تطبيقات مريحة.
  4. تم تطويره بواسطة Digital Ocean (وبشكل أكثر تحديداً ، محبوب من قبل الجميع Jeremy Stretch) لنفسه ، أي لمراكز البيانات. لذلك ، هناك كل ما تحتاجه تقريبًا ، ولا شيء تقريبًا.
  5. إنه مدعوم بشكل نشط (سلاك ، جيثب ، جوجل للأنباء الإخبارية) ويتم تحديثه.
  6. هذا مفتوح المصدر

لتلبية احتياجات ADSM ، قمت بنشر NetBox في virtualochka على الخادم الخاص بنا (بفضل Anton Klochkov و Miran ): http://netbox.linkmeup.ru:45127
بالإضافة إلى ذلك ، قمت بملء جميع البيانات التي نحتاجها في المستقبل تقريبًا.
لذلك ، يمكنك تجربة جميع الأمثلة تقريبًا ودراسة نظام البيانات في وضع القراءة حتى تقوم بنشر التثبيت.
مفيد قليلاً قبل البدء:




بنية النظام


  • NetBox مكتوب في Python3. وهذا أمر جيد ، لأن عددًا من الحلول الأخرى مكتوبة بلغة php وتغييرها إذا لزم الأمر ليس بهذه البساطة.
  • إطار الموقع نفسه هو جانغو.
  • يستخدم بوستجرس كقاعدة البيانات.
  • WEB-frontend (HTTP-service) - NGINX - يقوم بإرسال الطلبات إلى Gunicron.
  • WSGI - Gunicorn - الواجهة بين Nginx والتطبيق نفسه.
  • إطار وثائق API - Swagger.
  • شيطنة NetBox - Systemd.

NetBox هو مشروع شاب سريع الخطى. على سبيل المثال ، في 2.7 تركوا المشرف وبيثون 2.7 الوصول إليها لصالح systemd. منذ وقت ليس ببعيد ، لم يكن هناك ذاكرة التخزين المؤقت أو Webhooks.

لذلك ، يتغير كل شيء بسرعة وقد تصبح المعلومات الواردة في المقالة قديمة وقت القراءة.

بمعنى آخر ، جميع المكونات ناضجة ومختبرة.

وفقًا للمؤلف ، لا يعكس NetBox الحالة الحقيقية للشبكة ، ولكن الهدف. لذلك ، لا يتم تحميل أي شيء في NetBox من الشبكة - يتم تكوين هذه الشبكة وفقًا لمحتويات NetBox.
وبالتالي ، يعمل NetBox كمصدر الحقيقة الوحيد (ورقة التتبع مع مصدر الحقيقة واحد).

والتغييرات على الشبكة يجب أن تكون ناجمة عن التغييرات في NetBox.

وهو يناسب بشكل جيد الأيديولوجية التي أدرسها في هذه السلسلة من المقالات - إذا كنت تريد إجراء تغييرات على الشبكة - قم أولاً بإدخالها في النظام.



مخطط بيانات NetBox


المهمتان الرئيسيتان التي يحلها NetBox هي إدارة مساحة العنوان وجردها.

من غير المرجح أن يصبح NetBox هو نظام المخزون الوحيد في الشركة ؛ بل سيكون نظامًا إضافيًا محددًا لجرد الشبكة ، مع أخذ البيانات من النظام الرئيسي.

من الواضح ، في حالتنا ، سيكون هناك NetBox فقط لأغراض ADSM.
في هذه المرحلة ، تم بالفعل إدخال معظم البيانات الأولية في NetBox.
في هذه البيانات ، سأعرض أمثلة مختلفة للعمل من خلال واجهة برمجة التطبيقات.
يمكنك فقط الصعود ورؤية: netbox.linkmeup.ru : 45127
وستكون هناك حاجة إلى نفس البيانات في المستقبل ، عندما ننتقل إلى الأتمتة.
بشكل عام ، يمكن رؤية مخطط البيانات بواسطة مخطط قاعدة البيانات في Postgres.

List of relations Schema | Name | Type | Owner --------+------------------------------------+-------+-------- public | auth_group | table | netbox public | auth_group_permissions | table | netbox public | auth_permission | table | netbox public | auth_user | table | netbox public | auth_user_groups | table | netbox public | auth_user_user_permissions | table | netbox public | circuits_circuit | table | netbox public | circuits_circuittermination | table | netbox public | circuits_circuittype | table | netbox public | circuits_provider | table | netbox public | dcim_cable | table | netbox public | dcim_consoleport | table | netbox public | dcim_consoleporttemplate | table | netbox public | dcim_consoleserverport | table | netbox public | dcim_consoleserverporttemplate | table | netbox public | dcim_device | table | netbox public | dcim_devicebay | table | netbox public | dcim_devicebaytemplate | table | netbox public | dcim_devicerole | table | netbox public | dcim_devicetype | table | netbox public | dcim_frontport | table | netbox public | dcim_frontporttemplate | table | netbox public | dcim_interface | table | netbox public | dcim_interface_tagged_vlans | table | netbox public | dcim_interfacetemplate | table | netbox public | dcim_inventoryitem | table | netbox public | dcim_manufacturer | table | netbox public | dcim_platform | table | netbox public | dcim_powerfeed | table | netbox public | dcim_poweroutlet | table | netbox public | dcim_poweroutlettemplate | table | netbox public | dcim_powerpanel | table | netbox public | dcim_powerport | table | netbox public | dcim_powerporttemplate | table | netbox public | dcim_rack | table | netbox public | dcim_rackgroup | table | netbox public | dcim_rackreservation | table | netbox public | dcim_rackrole | table | netbox public | dcim_rearport | table | netbox public | dcim_rearporttemplate | table | netbox public | dcim_region | table | netbox public | dcim_site | table | netbox public | dcim_virtualchassis | table | netbox public | django_admin_log | table | netbox public | django_content_type | table | netbox public | django_migrations | table | netbox public | django_session | table | netbox public | extras_configcontext | table | netbox public | extras_configcontext_platforms | table | netbox public | extras_configcontext_regions | table | netbox public | extras_configcontext_roles | table | netbox public | extras_configcontext_sites | table | netbox public | extras_configcontext_tags | table | netbox public | extras_configcontext_tenant_groups | table | netbox public | extras_configcontext_tenants | table | netbox public | extras_customfield | table | netbox public | extras_customfield_obj_type | table | netbox public | extras_customfieldchoice | table | netbox public | extras_customfieldvalue | table | netbox public | extras_customlink | table | netbox public | extras_exporttemplate | table | netbox public | extras_graph | table | netbox public | extras_imageattachment | table | netbox public | extras_objectchange | table | netbox public | extras_reportresult | table | netbox public | extras_tag | table | netbox public | extras_taggeditem | table | netbox public | extras_webhook | table | netbox public | extras_webhook_obj_type | table | netbox public | ipam_aggregate | table | netbox public | ipam_ipaddress | table | netbox public | ipam_prefix | table | netbox public | ipam_rir | table | netbox public | ipam_role | table | netbox public | ipam_service | table | netbox public | ipam_service_ipaddresses | table | netbox public | ipam_vlan | table | netbox public | ipam_vlangroup | table | netbox public | ipam_vrf | table | netbox public | secrets_secret | table | netbox public | secrets_secretrole | table | netbox public | secrets_secretrole_groups | table | netbox public | secrets_secretrole_users | table | netbox public | secrets_sessionkey | table | netbox public | secrets_userkey | table | netbox public | taggit_tag | table | netbox public | taggit_taggeditem | table | netbox public | tenancy_tenant | table | netbox public | tenancy_tenantgroup | table | netbox public | users_token | table | netbox public | virtualization_cluster | table | netbox public | virtualization_clustergroup | table | netbox public | virtualization_clustertype | table | netbox public | virtualization_virtualmachine | table | netbox 

ميزات NetBox :

  • إدارة عنوان IP (IPAM) - بادئات IP ، والعناوين ، VRFs و VLAN
  • رفوف المعدات - رفوف المعدات مرتبة حسب الموقع والمجموعة والدور
  • الأجهزة - الأجهزة ونماذجها وأدوارها ومكوناتها ونشرها
  • الاتصالات - اتصالات الشبكة ووحدة التحكم واتصالات الطاقة بين الأجهزة
  • المحاكاة الافتراضية - الأجهزة الافتراضية ومجموعات الحوسبة
  • دارات البيانات - اتصالات المزود
  • أسرار - تخزين بيانات اعتماد المستخدم المشفر

سوف أتطرق في هذه المقالة إلى الأشياء التالية: DCIM - إدارة البنية التحتية لمركز البيانات ، IPAM - إدارة عناوين IP ، الافتراضية ، أشياء لطيفة إضافية.



أول الأشياء أولاً.

DCIM


الجزء الأكثر أهمية هو بلا شك المعدات الموجودة لدينا وكيف يتم توصيلها مع بعضها البعض. ولكن كل شيء يبدأ حيث يقف.

المناطق والمواقع (المناطق / المواقع)


في نموذج NetBox ، يتم تثبيت الجهاز على موقع ما ، وهو موقع ينتمي إلى منطقة ما ، ويمكن تداخل المناطق. ومع ذلك ، لا يمكن تثبيت الجهاز ببساطة في المنطقة. إذا كانت هناك حاجة ، يجب إنشاء موقع منفصل.

بالنسبة لحالتنا ، قد يبدو هذا (وسيبدو) كما يلي:




أذكرك أين وكيف خططنا لشبكتنا : ADSM2. تصميم الشبكات





دعونا نرى ما يسمح API.

فيما يلي قائمة بجميع المناطق:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/regions/" -H "Accept: application/json; indent=4" 

 nb.dcim.regions.all() 

فيما يلي ، سأقدم أمثلة على حليقة و pynetbox دون إخراج النتيجة.
لا تنس الشرطة المائلة في نهاية عنوان URL - فبدونه ، لن ينجح.
تحدثت عن كيفية استخدام pynetbox في مقال عن RESTful API .
الحصول على قائمة المواقع:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/sites/" -H "Accept: application/json; indent=4" 

 nb.dcim.sites.all() 

قائمة المواقع في منطقة معينة:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/sites/?region=ru" -H "Accept: application/json; indent=4" 

 nb.dcim.sites.filter(region="ru") 

يرجى ملاحظة أن البحث ليس بالاسم الكامل ، ولكن من خلال ما يسمى سبيكة .
Slug عبارة عن معرف يحتوي على أحرف آمنة فقط: [0-9A-Za-z-_] ، والتي يمكن استخدامها في URL. يتم ضبطه عند إنشاء كائن ، على سبيل المثال ، "bcn" بدلاً من "Barcelona".




الأجهزة


للجهاز نفسه دور ، على سبيل المثال ، الورقة ، العمود الفقري ، الحافة ، الحدود.

من الواضح أنه نوع من أنواع بعض البائعين .
على سبيل المثال ، أريستا .

وبالتالي ، يتم إنشاء البائع أولاً ، ثم داخل النموذج.

يتميز الطراز بالاسم ومجموعة من واجهات الخدمة وواجهة التحكم عن بعد ومنفذ وحدة التحكم ومجموعة من وحدات الطاقة.

بالإضافة إلى المحولات وأجهزة التوجيه والمضيفات مع واجهات Ethernet ، يمكنك إنشاء خوادم وحدة التحكم.





الحصول على قائمة بجميع الأجهزة:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.all() 

جميع الأجهزة لموقع معين:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?site=mlg" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(site="mlg") 

جميع الأجهزة من طراز معين

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?model=veos" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(device_type_id=2) 

جميع الأجهزة التي لها دور محدد:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?role=leaf" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(role="leaf") 

يمكن أن يكون الجهاز في أوضاع مختلفة: نشط ، غير متصل ، مخطط ، إلخ.

جميع الأجهزة النشطة:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?status=active" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(status="active") 



واجهات


يدعم NetBox العديد من أنواع الواجهات المادية و LAG ، ومع ذلك ، يتم دمج جميع الواجهات الافتراضية مثل Vlan / IRB و الاسترجاع تحت نوع واحد - Virtual.
كل واجهة مرتبطة بجهاز.

يمكن توصيل واجهات الجهاز مع بعضها البعض. سيتم عرض هذا في الواجهة وفي استجابات واجهة برمجة التطبيقات (السمة connection_endpoint).



يمكن أن تكون الواجهة في أوضاع مختلفة: Tagged أو Access.

وفقًا لذلك ، يمكن تشغيله في العلامة مع أو بدون شبكات محلية ظاهرية - هذا الموقع أو عالمي.

الحصول على قائمة بجميع واجهات الجهاز:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0" -H "Accept: application/json; indent=4" 

 nb.dcim.interfaces.filter(device="mlg-leaf-0") 

الحصول على قائمة شبكات محلية ظاهرية لواجهة محددة.

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0&name=Ethernet7" -H "Accept: application/json; indent=4" 

 nb.dcim.interfaces.get(device="mlg-leaf-0", name="Ethernet7").untagged_vlan.vid 

لاحظ أنني هنا استخدم بالفعل طريقة get بدلاً من عامل التصفية . يعرض الفلتر قائمة ، حتى لو كانت النتيجة كائنًا واحدًا. Get - إرجاع كائن واحد أو فشل إذا كانت نتيجة الاستعلام قائمة بالكائنات.

لذلك ، يجب استخدام get فقط عندما تكون متأكدًا تمامًا من أن النتيجة ستكون في نسخة واحدة.

هنا ، مباشرة بعد الطلب ، أنتقل إلى سمات الكائن. بالمعنى الدقيق للكلمة ، هذا خطأ: إذا لم يتم العثور على أي شيء حسب الطلب ، فلن يُرجع pynetbox أي شيء ، ولا يحتوي على السمة "untagged_vlan".

ولاحظ أيضًا أنه ليس في كل مكان تتوقع pynetbox سبيكة ، في مكان ما ، واسم.
تعرف على أي واجهة الجهاز الذي تتصل به واجهة معينة:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0&name=Ethernet1" -H "Accept: application/json; indent=4" 

 iface = nb.dcim.interfaces.get(device="mlg-leaf-0", name="Ethernet1") iface.connected_endpoint.device iface.connected_endpoint.name 

تعرف على اسم واجهة الإدارة:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/interfaces/?device=mlg-leaf-0&mgmt_only=true" -H "Accept: application/json; indent=4" 

 nb.dcim.interfaces.get(device="mlg-leaf-0", mgmt_only=True) 



منافذ وحدة التحكم


منافذ وحدة التحكم ليست واجهات ، وبالتالي يتم تقديمها كنقاط نهاية منفصلة.
يمكن ربط منافذ الجهاز بمنافذ خادم وحدة التحكم.

تعرف على أي منفذ متصل بوحدة التحكم في جهاز معين.

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/console-ports/?device=mlg-leaf-0" -H "Accept: application/json; indent=4" 

 nb.dcim.console_ports.get(device="mlg-leaf-0").serialize() 

تتيح لك طريقة إجراء تسلسل في pynetbox تحويل سمات مثيل لفئة ما إلى قاموس.


IPAM


VLAN و VRF


يمكن ربطها بموقع - مفيد لشبكة محلية ظاهرية.

عند إنشاء VRF ، يمكنك تحديد ما إذا كان يتم السماح لمساحة العنوان بالتقاطع مع VRFs الأخرى.

الحصول على قائمة بجميع شبكات محلية ظاهرية:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/vlans/" -H "Accept: application/json; indent=4" 

 nb.ipam.vlans.all() 

الحصول على قائمة بجميع VRFs:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/vrfs/" -H "Accept: application/json; indent=4" 

 nb.ipam.vrfs.all() 



بادئات IP


لديهم هيكل هرمي. قد ينتمي إلى أي VRF (إذا لم يكن كذلك ، ثم العالمية).



يحتوي NetBox على تمثيل مرئي مناسب للغاية للبادئات المجانية:



يمكنك تحديده ببساطة عن طريق النقر على الخط الأخضر.

يمكن أن تعلق على الموقع. يمكنك تحديد البادئة الفرعية المجانية التالية بالحجم المطلوب أو عنوان IP المجاني التالي من خلال واجهة برمجة التطبيقات.

تحدد علامة / معلمة الاختيار "Is a pool" ما إذا كان سيتم تحديد عنوان 0 th من هذه البادئة أثناء التحديد التلقائي ، أو ما إذا كان سيبدأ من الأول.

الحصول على قائمة بادئات IP لموقع Malaga مع دور Underlay وطول 19:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/?site=mlg&role=underlay&mask_length=19" -H "Accept: application/json; indent=4" 

 prefix = nb.ipam.prefixes.get(site="mlg", role="underlay", mask_length="19") 

الحصول على قائمة بادئات مجانية في منطقة روسيا مع دور Underlay:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/40/available-prefixes/" -H "Accept: application/json; indent=4" 

 prefix.available_prefixes.list() 

قم بتمييز البادئة المجانية 24 التالية:

 curl -X POST "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/40/available-prefixes/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" \ -d "{\"prefix_length\": 24}" 

 prefix.available_prefixes.create({"prefix_length":24}) 

عندما نحتاج إلى اختيار طفل من داخل كائن واحد ، يتم استخدام طريقة POST ونحتاج إلى تحديد هوية الكائن الأصل - في هذه الحالة - 40 . اكتشفنا بالاتصال من المثال السابق.
في حالة pynetbox ، قمنا أولاً (في المثال السابق) بحفظ النتيجة إلى متغير البادئة ، ثم انتقلنا إلى سمة available_prefixes وطريقة الإنشاء .
لن يعمل هذا المثال من أجلك ، لأن الرمز المميز بحرف الكتابة غير صالح بالفعل.


عناوين IP


إذا كان هناك بادئة تتضمن هذا العنوان ، فستكون جزءًا منه. يمكن أن تكون من تلقاء نفسها.
قد تنتمي إلى أي VRF أو تكون في Global.
يمكن ربطها بالواجهة ، ولكن يمكن تعليقها في الهواء.
يمكنك تحديد عنوان IP المجاني التالي في البادئة.



للقيام بذلك ، فقط اضغط على الخط الأخضر.

الحصول على قائمة عناوين IP لواجهة محددة:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/ip-addresses/?interface_id=8" -H "Accept: application/json; indent=4" 

 nb.ipam.ip_addresses.filter(interface_id=8) 

أو:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/ip-addresses/?device=mlg-leaf-0&interface=Ethernet1" -H "Accept: application/json; indent=4" 

 nb.ipam.ip_addresses.filter(device="mlg-leaf-0", interface="Ethernet1") 

الحصول على قائمة بجميع عناوين IP للجهاز:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/ip-addresses/?device=mlg-leaf-0" -H "Accept: application/json; indent=4" 

 nb.ipam.ip_addresses.filter(device="mlg-leaf-0") 

الحصول على قائمة عناوين IP بادئة المتاحة:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/28/available-ips/" -H "Accept: application/json; indent=4" 

 prefix = nb.ipam.prefixes.get(site="mlg", role="leaf-loopbacks") prefix.available_ips.list() 

هنا مرة أخرى ، تحتاج إلى تحديد معرف البادئة في عنوان URL الذي نختار منه العنوان - هذه المرة هو 28.
قم بتمييز عنوان IP المجاني التالي في البادئة:

 curl -X POST "http://netbox.linkmeup.ru:45127/api/ipam/prefixes/28/available-ips/" \ -H "accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: TOKEN a9aae70d65c928a554f9a038b9d4703a1583594f" 

 prefix.available_ips.create() 



الافتراضية


نحن لا نزال نقاتل من أجل لقب العاصمة الحديثة. حيث دون الافتراضية.

لا يبدو NetBox ولا يعد مكانًا يستحق تخزين معلومات حول الأجهزة الظاهرية (يمكنك التكهن حول الحاجة إلى تخزين الأجهزة الفعلية فيه). ومع ذلك ، قد يكون هذا مفيدًا لنا ، على سبيل المثال ، يمكنك إدخال معلومات حول عاكسات الطريق ، وحول أجهزة الخدمة ، مثل خوادم NTP و Syslog وخوادم S-Flow وآلات التحكم.

يحتوي VM على قائمة واجهات خاصة به - فهي مختلفة عن واجهات الأجهزة الفعلية ولديها نقطة نهاية منفصلة خاصة بها.

حتى تتمكن من سرد جميع الأجهزة الافتراضية:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/virtualization/virtual-machines/" -H "Accept: application/json; indent=4" 

 nb.virtualization.virtual_machines.all() 

لذلك - من جميع واجهات جميع VMs:

 curl -X GET "http://netbox.linkmeup.ru:45127/api/virtualization/interfaces/" -H "Accept: application/json; indent=4" 

 nb.virtualization.interfaces.all() 

بالنسبة لـ VM ، لا يمكنك تحديد جهاز hypervisor / الفعلي الذي يتم تشغيله عليه ، ولكن يمكنك تحديد كتلة. وإن لم يكن كل شيء ميئوسا منه. اقرأ على.



أشياء لطيفة اضافية


تغطي الوظائف الأساسية لـ NetBox معظم مهام العديد من المستخدمين ، ولكن ليس جميعها. لا يزال ، تم كتابة المنتج أصلاً لحل مشاكل شركة معينة. ومع ذلك ، فإنه يتطور بنشاط والإصدارات الجديدة تخرج في كثير من الأحيان . وفقا لذلك ، تظهر وظائف جديدة.

لذلك ، على سبيل المثال ، منذ التثبيت الأول لـ NetBox منذ بضع سنوات ، ظهرت العلامات فيه ، وسياقات التكوين ، و webhooks ، وذاكرة التخزين المؤقت ، ورابط الإشراف تغير إلى systemd ، وتخزين الملفات الخارجي.

احترس.

الحقول المخصصة


في بعض الأحيان تريد إضافة حقل إلى أي كيان يمكنك فيه وضع بيانات تعسفية.

على سبيل المثال ، أشر إلى رقم اتفاقية التوريد التي تم بموجبها شراء المفتاح أو اسم الجهاز الفعلي الذي يعمل عليه VM.

هذا هو المكان الذي يتم فيه إنقاذ الحقول المخصصة - مثل هذا الحقل الذي يحتوي على قيمة نصية يمكن إضافتها إلى أي كيان تقريبًا في NetBox.

قم بإنشاء حقول مخصصة في لوحة الإدارة



هذا هو الشكل الذي يظهر عند تحرير الجهاز الذي تم إنشاء الحقل المخصص له:



طلب قائمة بالأجهزة حسب القيمة custom_field

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?cf_contract_number=0123456789" -H "Accept: application/json; indent=4" 

 nb.dcim.devices.filter(cf_contract_number="0123456789") 



سياق التكوين


في بعض الأحيان تريد شيء أكثر من نص غير منظم. ثم يأتي سياق التهيئة في عملية الإنقاذ.

هذه فرصة لتقديم مجموعة من البيانات المهيكلة بتنسيق JSON ، والتي ليس لديها مكان آخر لوضعه.

قد يكون هذا ، على سبيل المثال ، مجموعة من مجتمعات BGP أو قائمة بخوادم Syslog.

يمكن أن يكون سياق التكوين محليًا - مكونًا لكائن معين - أو عمومي ، عندما يتم تكوينه مرة واحدة ، ثم ينطبق على جميع الكائنات التي تفي بشروط معينة (على سبيل المثال ، موجودة في نفس الموقع ، أو تعمل على نفس النظام الأساسي).



تتم إضافة سياق التكوين تلقائيًا إلى نتائج الاستعلام. في الوقت نفسه ، تندمج السياقات المحلية والعالمية في سياق واحد.

على سبيل المثال ، بالنسبة للجهاز مجرد فتاة روسية بسيطة ، يوجد لها سياق محلي ، سيحتوي الإخراج على المفتاح "config_context":

 curl -X GET "http://netbox.linkmeup.ru:45127/api/dcim/devices/?q=russian" -H "Accept: application/json; indent=4" 





علامات


من الصعب قول شيء جديد عن العلامات. هم. أنها مريحة لإضافة أي ميزة. على سبيل المثال ، يمكنك تمييز مفاتيح تبديل "byada" من الدُفعة التي تفشل فيها الذاكرة.



Webhooks


شيء لا يمكن الاستغناء عنه عندما تحتاج إلى خدمات أخرى للتعرف على التغييرات في NetBox.
على سبيل المثال ، عند بدء تشغيل مفتاح جديد ، يتم إرسال خطاف إلى نظام التشغيل الآلي ، والذي يبدأ عملية إعداد الجهاز وتشغيله.



استنتاج


في هذه المقالة ، لا أقصد مراعاة جميع ميزات NetBox ، لذلك سأقدم لك كل شيء آخر. فهم ، حاول.

علاوة على ذلك ، كجزء من بناء نظام التشغيل الآلي ، سأتطرق فقط إلى الأجزاء التي نحتاجها حقًا.

أعلاه ، تحدثت لفترة وجيزة عن ماهية NetBox وكيف يتم تخزين البيانات فيه.

أكرر أنني قمت بالفعل بإدخال جميع البيانات الضرورية تقريبًا ، ويمكنك سحب ملف تفريغ قاعدة البيانات بنفسك.

كل شيء جاهز للمرحلة التالية من التشغيل الآلي: كتابة نظام (ahaha ، مجرد نصوص) لتهيئة الأجهزة وإدارة التهيئة.



ولكن قبل الانتهاء من المقال ، سأقول بضع كلمات حول تثبيت وتشغيل مكونات NetBox.

بعض الفروق الدقيقة في تثبيت NetBox


لن أصف عملية التثبيت بالتفصيل - إنها أكثر من الموصوفة في الوثائق الرسمية .

يمكنك إلقاء نظرة على عملية إطلاق صورة عامل ميناء NetBox والعمل في واجهة المستخدم الرسومية في فيديو Dima Figol ( مرة واحدة ومرتين ) وإميل Garipov .

بشكل عام ، إذا اتبعت خطوات التثبيت / بدء التشغيل بدقة ، فسيعمل كل شيء.
ولكن هنا الفروق الدقيقة التي يمكنك نسيانها عن طريق الخطأ.

  • في ملف config.py ، يجب ملء المعلمة ALLOWED_HOSTS :
     ALLOWED_HOSTS = ['netbox.linkmeup.ru', 'localhost'] 

    تحتاج هنا إلى تحديد جميع أسماء NetBox المحتملة التي ستقوم بالوصول إليها ، على سبيل المثال ، قد يكون هناك عنوان IP خارجي أو 127.0.0.1 أو اسم DNS مستعار.
    إذا لم يتم ذلك ، فلن يتم فتح موقع NetBox على الويب وسيظهر 400.
  • في نفس الملف ، يجب تحديد SECRET_KEY ، بحيث يمكنك اختراع نفسك أو إنشاء برنامج نصي.
  • ستظهر الصفحة الرئيسية 502 بوابة سيئة إذا حدث خطأ ما في إعداد قاعدة بيانات PostgreSQL: تحقق من المضيف (إذا كان مثبتًا على جهاز آخر) ، والمنفذ ، واسم قاعدة البيانات ، واسم المستخدم ، وكلمة المرور.
  • لبعض الوقت الآن ، لا يمنح NetBox بشكل افتراضي أي حقوق قراءة بدون إذن.

    كل هذه التغييرات في نفس التكوين.

     EXEMPT_VIEW_PERMISSIONS = ['*'] 
  • وكذلك طلبات API ستعود 200 ولن تعمل إذا لم يكن هناك شرطة مائلة في عنوان URL لواجهة برمجة التطبيقات في النهاية.
     curl -X GET -H "Accept: application/json; indent=4" "http://netbox.linkmeup.ru:45127/api/dcim/devices" 




قليلا عن بوستجرس


للاتصال بالخادم:

 psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> 

على سبيل المثال:

 psql -U netbox -h localhost netbox 

لعرض جميع الجداول:

 /dt 

للخروج:

 /q 

لتفريغ قاعدة البيانات:

 pg_dump -U <i>username</i> -h <i>hostname</i> <i>db_name</i> > netbox.sql 

إذا كنت لا تريد إدخال كلمة مرور في كل مرة:

 echo *:*:*:<i>username</i>:<i>password</i> > ~/.pgpass chmod 600 ~/.pgpass 

إذا كان لديك التثبيت الخاص بك ولا تريد إجراء كل شيء يدويًا ، فيمكنك القيام بذلك ببساطة عن طريق تفريغ قاعدة بيانات NetBox الحالية هنا :

 psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> < netbox_initial_db.sql 

إذا كنت بحاجة أولاً إلى إسقاط جميع الجداول (وعليك القيام بذلك) ، فيمكنك إعداد الملف مسبقًا:

 psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> \o drop_all_tables.sql select 'drop table ' || tablename || ' cascade;' from pg_tables; \q psql -U <i>username</i> -h <i>hostname</i> <i>db_name</i> -f drop_all_tables.sql 



روابط مفيدة


Source: https://habr.com/ru/post/ar486000/


All Articles