..

چرا IPAM مهمه و چجوری از اون تو زیرساخت خودمون استفاده کنیم؟

تو مقاله مسیری که طی میشود تا به یک وبسایت برسیم به صورت مفصل از اهمیتی که دانش شبکه برای یه مهندس دواپس داره صحبت کردم یعنی دانشی که کمک میکنه متوجه بشه چه خطایی ممکنه تو سیستم اتفاق افتاده باشه.

اما دانش خطایابی تنها یکی از اون چیزاییه که یه مهندس دواپس خوب رو میسازه و معماری صحیح سیستم یکی دیگه از اون مهارت هایی که کمک میکنه مهندس های بهتری باشیم.

برای معماری درست زیرساخت ما ابتدا باید شاکله اصلی یعنی تخصیص درست منابع رو بلد باشیم و همون طور که میدونید تعداد IP ها و range های اون ها هم بی انتها نیست و اکثر مواقع برای اینکه بین range های ما همپوشانی وجود نداشته باشه باید دست به دامن ابزارهای مستندسازی بشیم.

⚠️ توجه: داشتن دانش حداقلی از IP برای فهم مطالب زیر الزامیه. توصیه میکنم اگه نیاز به آموزش دارین دوره رایگان network+ اردشیر کاویانی رو روی یوتوب ببینید.

چه روش هایی برای subnetting وجود داره؟

ساده ترین راه اینه که از یه وبسایت مثل این استفاده کنیم و subnet های خودمون رو بر اساس bitmask که میخوایم بسازیم برای مثال اگه از بازه 192.168.0.0/16 استفاده کنیم میتونیم این رو به دو یا چند subnet دیگه بشکونیم به این صورت تصویری که میبینید

این روش با اینکه ساده است اما معایبی هم داره مثل:

  1. بعد از تقسیم بازه به subnet های کوچکتر باید مستندسازی رو جای دیگری انجام داد مثلا تو یک فایل متنی ذخیره کرد.
  2. باید هربار داده های قبلی رو اضافه کرد و سیستم کمکی به ما جهت تخصیص منابع نمیکنه مثلا اگه از قبل یه بازه استفاده شده باشه هشدار نمیده.

اما راه ساده تر و بهتری هم برای مستندسازی و ایجاد IP و Prefix وجود داره و اونم استفاده از ابزارهای IPAM هستش ابزارهایی مثل

  1. netbox
  2. phpipam

کاری که این ابزارها انجام میدن فراهم کردن یه رابط کاربری/API برای ایجاد و مدیریت و نگهداری دیتایی که درمورد IP تو سیستم ما وجود داره حالا این IP میتونه یه range/prefix باشه میتونه firewall باشه میتونه virtual machine باشه ولی اصل ماجرا اینه که یه source of truth وجود داره که میتونیم بهش اطمینان کنیم که IP رو به درستی تخصیص دادیم. در ادامه چند مثال رو به وسیله netbox terraform provider میزنم تا موضوع بیشتر جا بیفته.

چطور میتونیم از netbox برای ایجاد subnet استفاده کنیم؟

مرحله اول نصب netbox هستش که از حوصله این مقاله خارجه ولی میتونید از این helm chart برای نصب netbox آستفاده کنیم.

مرحله بعدی استفاده از api_token است که میتونه متعلق به admin باشه که به صورت پیشفرض مقدارش 0123456789abcdef0123456789abcdef01234567 است.

استفاده از netbox terraform provider

ساختار پروژه تستی ما به این صورت است

+-- main.tf
\-- providers.tf

محتوای providers.tf

terraform {
  required_providers {
    netbox = {
      source  = "e-breuninger/netbox"
      version = "3.8.5"
    }
  }
}

provider "netbox" {
  server_url = "https://yournetbox.com"
  api_token  = "0123456789abcdef0123456789abcdef01234567"
}

محتوای main.tf


resource "netbox_prefix" "test" {
  prefix = "192.168.0.0/16"
  status = "active"
}

resource "netbox_available_prefix" "test" {
  parent_prefix_id = netbox_prefix.test.id
  description      = "Test"
  prefix_length    = 25
  status           = "active"
}

output "test" {
  value = netbox_available_prefix.test
}

خروجی terraform plan

➜  netbox tf plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # netbox_available_prefix.test will be created
  + resource "netbox_available_prefix" "test" {
      + description      = "Test"
      + id               = (known after apply)
      + parent_prefix_id = (known after apply)
      + prefix           = (known after apply)
      + prefix_length    = 25
      + status           = "active"
    }

  # netbox_prefix.test will be created
  + resource "netbox_prefix" "test" {
      + id     = (known after apply)
      + prefix = "192.168.0.0/16"
      + status = "active"
    }

Plan: 2 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + test = {
      + description      = "Test"
      + id               = (known after apply)
      + is_pool          = null
      + mark_utilized    = null
      + parent_prefix_id = (known after apply)
      + prefix           = (known after apply)
      + prefix_length    = 25
      + role_id          = null
      + site_id          = null
      + status           = "active"
      + tags             = null
      + tenant_id        = null
      + vlan_id          = null
      + vrf_id           = null
    }

اگه همه چی به خوبی پیش رفته باشه با اجرای terraform apply باید 192.168.0.0/16 به عنوان parent و یه اولین رنج خالی به عنوان subnet ساخته شده باشه.

کاربرد واقعی استفاده از netbox terraform provider کجاست؟

مثال بالا سناریو ساده ساختن یه نتورک و ایجاد یه سابنت بود ولی تو دنیای واقعی زیرساخت بسیار بزرگ تر و پیچیده تر از اونه که بتونیم همه prefix ها و IP ها رو به خاطر بسپاریم علاوه بر این تخصیص دستی manual و هربار داکیومنت کردنش وقتگیر و غیر ضروریه اینجاست که netbox به کمک ما میاد تا این پیچیدگی ها رو ساده کنه.

از اونجایی که terraform به صورت defacto زبان کلاود تبدیل شده این یکپارچگی با netbox کمک میکنه زیرساخت قابل فهم تری داشته باشیم که تو مقیاس بزرگتر دید بهتری رو به معمار و تیم توسعه و نگهداری میده.