راهنمای مسیر یک NetDevOps
این فایل برای راهنمایی مهندسین شبکه که آشنایی با DevOps ندارند و قصد دارند برای مدیریت شبکه بصورت Infrastructure as Code ازش استفاده کنند تهیه شده است.
برای اینکه یه سری از موارد جا بیفته که چرا دارین اصلا همچین کاری می کنیم خیلی از موارد رو با مثال تعریف می کنم و اینکه چه دغدغه هایی وجود داشت که با استفاده از این ابزار ها برطرف شد.
در ابتدا هر نیازمندی و ابزارهای مورد نیازش رو معرفی می کنیم و در انتهای پست منابع مفید و ترجیحن رایگانش رو بهتون معرفی می کنیم.
NetDevOps
1- اتومیشن: کاهش خطای انسانی، شب و نیمه شب بیدار شدن – خیلی وقت ها کسی که CR/Maintenance/Change رو شب اجرا می کنه با کسی که کانفیگ ها رو در آورده متفاوت هست و ممکنه خود شخص نباشه بنابرین فرد مورد نظر می تونه کانفیگ ها رو بر اساس چیزی که توی ریپازیتوری هست دیپلوی کنه و بر اساس چک لیستی که بهش دادن انتظار یه خروجی رو داشته باشه و اگر به خطای پیش بینی نشده ای خورد نهایتا Revert کنه تمام کانفیگ ها رو.
برای اتوماتیک سازی می توانید از ابزار های مختلفی استفاده کنید مثل:
2- در حین این اتومیشن سازی با Data Formats and Data Models های مختلفی آشنا میشید مثل:
یکی از فایل هایی که احتمالا اگر از انسیبل یا پایتون برای اتومیشن استفاده کنید باهاش برخورد می کنید yaml فایل ها هستند و نیاز هست که با ساختارش آشنا بشید. چون تقریبا تمام فایل هایی که حاوی متغیر ها هستند از این نوع است.
3- توی قدم بعدی برای اینکه بتونید کانفیگ ها رو تولید بکنید نیاز پیدا می کنید به اینکه از یه template خاص برای این منظور استفاده کنید. مثلا:
hostname {{ hostname }}
no ip domain lookup
ip domain name local.lab
ip name-server {{ name_server_pri }}
ip name-server {{ name_server_sec }}
حالا کافیه که بجای اون متغیر های داخل پرانتز اسم hostname روتر/سوییچ یا هر تجهیزی که استفاده می کنید رو قرار بدین، برای این منظور از زبان template سازی Jinja استفاده می کنند.
بعد برای اینکه بتونید کانفیگ ها رو ایجاد کنید نیاز پیدا می کنید به اینکه یه سری template ایجاد کنید و بر اساس این template ها می توانید کانفیگ را تولید کنید اینجا به jinja2 برخورد می کنید که یه جور زبان اسکریپتینگ خیلی ساده است برای تمپلیت سازی.
4- بعد اینکه تمپلیت ساخته شد، می خوایم اطلاعات سیتم ها رو یه جوری بخونیم می تونیم اطلاعات تو فرمت yaml بخونیم یا بهتره که از یه فایل که خوندنش برای آدم هم راحت تر باشه بخونیم مثل json. فرمت json مخفف JavaScript Object Notation هست و هدفش این بوده که یه نسخه سبک تری باشه که بتونه جایگزین XML بشه و فرمتش این شکلی میشه:
{
"interfaces": [
{
"name": "Vlan177",
"enabled": true,
"address": "10.77.1.68/28",
"description": "Lan In-Band Network",
"load_interval": 5
},
{
"name": "Management1",
"description": "lab01 - Eth100/1/37",
"enabled": true,
"instance": "MANAGEMENT",
"address": "10.17.17.177/23",
"load_interval": 5
}
]
}
5- بعد اینکه کانفیگ ها رو ساختین و اجرا شد برای اینکه بدانید کِی چه تغییراتی رو دادین، چه تغییری دادین و اگر یه روزی این تجهیز خراب شد بتواند با سرعت هرچه بیشتری جایگزینش کنید نیاز دارین به اینکه این ها رو یه جا نگهداری کنید، بتونید مقایسه کنید که چه تغییراتی دادین یا گاهی توی تیم دارید کار میکنید مثلا من دارم تنظیمات ospf رو درست می کنم دوستم داره interface ها رو در میاره یا qos و … برای اینکار نیاز پیدا می کنید به versioncontrol که برای این منظور از git استفاده میشه.
Git به شما این امکان رو میده که بتونید نسخه های مختلفی از کدهاتون رو داشته باشید، بتویند همزمان روی کد ها کار کنید، اگر اشتباهی انجام دادین برگردونین به حالت قبل و کلی قابلیت دیگه.
برای اینکه بتونید این تغییرات رو جایی نگه داری کنید هم از github یا gitlab استفاده می کنیم که بهشون میگن ریپازیتوری.
6- این ریپازیتوری ها یه امکانی به شما میدهد که شما مطمئن بشید این کانفیگی که درست کردین ساختار درستی داره در واقع باید براش یه سری رویه تست تعریف کنید که سیستم بصورت اتوماتیک چک کنه این ساختار درست است یا نه برای این کار به CI/CD نیاز پیدا می کنید. استفاده اولیه این CI/CD برای مهندس نرم افزار بوده، اینجا یه تعریف ساده ازش نوشتن که چی هست و اصلا چرا ازش استفاده میشه اما توی شبکه هم به این صورت برای اتومیشن ازش استفاده می کنیم:
- Treating the Network as Code
- Network Configuration stored in Source Control
- Changes are proposed in code “branches”
- CI/CD Build Servers deploy and test proposed configurations
- Successful configurations automatically deployed to “Production”
7- بعد از اینکه که کانفیگ ها در اومد و دیپلوی شد روی سیستم و از اونور توی مخازن هم ذخیره شده نیاز داریم سیستم و مانیتور کنیم یکی از ابزار هایی که این روز ها برای مانیتورینگ خیلی استفاده میشه Prometheus هست که در کنار Grafana ترکیب بسیار قشنگی رو برای شما ایجاد می کنند البته که با Zabbix و Nagios و چیزای دیگه هم میشه ولی نکته قابل توجه اینه که باید تمامی این کارها نهایتا اتوماتیک انجام بشه تا خطای انسانی کمتری داشته باشیم.
8- بعد از مانیتور کردن سیستم ما نیاز داریم بدونیم چیا تو سیستم داریم چجوری به هم وصل هستند در واقع نیاز به asset management داریم که اون هم بشه اتوماتیک خیلی کاراشو کرد مثل نقشه کابل کشی که هر پورت به چی وصل است چه مدل تجهیزاتی داریم چندتا رک داریم تو هر رک چی هست و … برای اینکار می تونید از RackTables یا Netbox استفاده کنید که هر دو محصول open source هستند و امکان اینکه بشود با استفاده از اسکریپت و ابزار های مثل انسیبل بصورت اتوماتیک اطلاعات رو واردشون بکنیم هست.
باید به این نکته هم اشاره کنم که اگر این ابزار Netbox یا Racktables رو درست بروز کرده باشید به عنوان source of truth هم ازش استفاده کنید. به این صورت که اگر توی کانفیگ زده پورت 1 به فلان تجهیز باید متصل باشه باهاش چک کنید اگر درست نبود پیغام خطا نشون بده بهتون یا توی CI/CD تو مرحله تست اون رو fail می کنه !
9- توی اجرای مانیتورینگ یا asset management که با استفاده از Racktables یا Netbox هست بسته به نحوه پیاده سازی و داکیومنت هایی که ازش پیروی می کنید ممکنه درگیر کار با Docker بشید و بهش نیاز پیدا می کنید.
اینا تقریبا تمام چیز هایی هست که به عنوان یک NetDevOps باهاش ممکنه با بعضیاش روبرو بشید.
اگر می خواین یه مقایسه ای بکنید با DevOps می تونید یه نگاه به این RoadMap داشته باشید و ابزار هایی که این وسط برای شبکه استفاده شده رو شما ازش استفاده کنید.
ابزاری که باید یاد بگیریم به ترتیب و اولویت:
- Linux
- Ansible/python
- jinja2, YAML, JSON
- git/gitlab/github
ابزار هایی که کار شما رو راحت تر و شکیل تر می کنند
- CICD
- prometheus and Grafanna
- netbox/racktables
- docker
منابعی که می تونید استفاده کنید:
1- برای آشنایی با لینوکس و کار کردن تا سطح قابل قبولی بنظرم ویدیو های جادی که برای LPIC1, LPIC2 توی اینترنت هستند کافی هست. اگر زبان خوبی دارین کتاب هاش رو توصیه می کنم و یا ویدیوهای CBT nuggets هم وجود دارد.
2- برای انسیبل من این ویدیو رو پیشنهاد می کنم برای شبکه کافیه:
Network Automation with Ansible (v2)
3- این کتاب پایتون برای مهندسین شبکه به انگلیسی هست و رایگان:
https://pyneng.readthedocs.io/en/latest
4- برای Jinja2 این سایت اختصاصی jinja2 رو برای شبکه آموزش داده و رایگان هست
https://ttl255.com/jinja2-tutorial-part-1-introduction-and-variable-substitution
5- برای آشنایی مختصر با Git ازاین ویدیو رایگان می تونید استفاده کنید
https://faradars.org/courses/fvgit9609-git-github-gitlab
6- این ویدیو رایگان آموزش Docker در یوتیوب هم حسابی کارتون رو راه میندازه و شاید در حد یه مهندس شبکه کافی هم باشه
https://www.youtube.com/watch?v=zJ6WbK9zFpI
7- برای آشنایی با Gitlab می تونید از ویدیو زیر بصورت رایگان استفاده کنید:
https://www.leveluptutorials.com/tutorials/gitlab-ce-tutorials/series-introduction
8- برای آشنایی با CI/CD در شبکه می تونید از این ارایه سیسکولایو استفاده کنید.
https://www.ciscolive.com/c/dam/r/ciscolive/apjc/docs/2019/pdf/DEVWKS-2203.pdf
در آخر هم تشکر میکنیم از مهندس Keyvan Ghadimi که این راهنما رو در linkedin خودشون نوشتن