چندسالی میشود که Vendorهای مختلف به دنبال هدایت متخصصین شبکه به سمت یادگیری یک زبان برنامه نویسی اند؛ اما با اضافه شدن مدرک جدید Devnet به مدارک سیسکو ضرورت یادگیری این موضوع ملموستر شده است و چه بسا در سالهای آینده یکی از تواناییهای مورد انتظار در آگهی های استخدام کارشناسان شبکه، تسلط حداقل بر یک زبان برنامه نویسی باشد.
مطلب پیش رو اولین بخش از مطالبیست که سعی دارد با زبانی ساده الفبای ورود به این حوزه را آموزش دهد و به تدریج و پس از چند پست به استفاده از پایتون در خودکار سازی برخی فرآیندهای متداول و زمانبر مورد استفادهی مهندسین شبکه بپردازد.
API چیست؟
در ساده ترین تعریف ممکن، API یک فرمت یا روش ارسال و دریافت اطلاعات بین دو نرم افزار به حساب میآید. عموما مواجهی کاربران با نرم افزارهای مختلف از طریق صفحهی وب، نرم افزار دسکتاپ، و یا در تجهیزات شبکه از طریق CLI و محیط دستوری است که به ازای اجرای هر دستور در نرم افزار، بین چند صفحه جابجا میشویم و یا چند دستور مختلف را اجرا میکنیم.
اما اگر قرار باشد این فرآیندها یا دستورات، به جای کاربر، از طریق نرم افزار دیگری اجرا شود چطور؟ به عنوان مثال بخواهیم ارسال یک ایمیل یا ساخت یک یوزر در اکتیو دایرکتوری را توسط نرم افزار دیگری به طور خودکار انجام دهیم. طبیعی ست که یک نرم افزار نتواند ابتدا به سرور اکتیور دایرکتوری ریموت دسکتاپ بزند و بعد با حرکت دادن موس یک یوزر ایجاد کند و اطلاعات یوزر را تکمیل کند!
فرض کنید به صورت هفتگی کارمندان جدیدی در سازمان استخدام میشوند و واحد منابع انسانی در نرم افزار اتوماسیون تیکتی جهت ساخت یوزر و همچنین ایمیل کارمندان جدید برای واحد IT ثبت میکند. با وجود API (با فرض اینکه نرم افزار اتوماسیون چنین امکانی را پشتیبانی میکند) میتوان با دریافت تیکت واحد منابع انسانی، درخواست ساخت یوزر به طور خودکار و با پارامترهای وارد شده در فرم تیکت (نام شخص، واحد کاری و …) از طریق API به اکتیو دایرکتوری ارسال شده و یوزر در OU مناسب و با فرمت صحیح نام کاربری ساخت شود. همین کار را در مورد ایمیل شخص نیز میتوان انجام داد و با ارسال مشخصات به سرور اکسچنج یا میل سرور دیگر، ساخت ایمیل را بدون صرف وقت نیروی انسانی انجام داد. یا ادمین یک شبکهی بانکی را فرض کنید که موظف شده است SNMP String ها را در تمام 1000 روتر شعبهها تغییر دهد. چنین درخواستی کمتر از یک هفته زمان نخواهد برد و البته کسل کننده ترین کاریست که از یک ادمین میتوان انتظار داشت. با وجود API، میتوان نرم افزاری نوشت و با ارائهی لیست IP روترها، تمام درخواست مذکور را در کمتر از یک ساعت انجام داد.
REST API چیست؟
اما REST API چیست؟ ارسال و دریافت اطلاعات از طریق API، به چند روش یا قالب مختلف انجام میشود که از جملهی آنها REST و XML است. درخواستهای قالب REST مشابه درخواستهای HTTP است، بنابراین همیشه پای یک کلاینت و یک سرور در میان است. اما استرس نگیرید! تقریبا تا انتهای این سری از آموزش، ما هیچگاه نقش API Server نخواهیم داشت و صرفا به عنوان کلاینت با تجهیزات یا سرویس هایی که REST API ارائه میدهند سر و کار خواهیم داشت. بنابراین عملا نیاز به اطلاع از جزئیات ارسال و دریافت و اجزای این Messageها نخواهیم داشت. اما به عنوان یک مرور کلی، برخی اجزای یک Message Http در تصویر زیر قابل مشاهده اند.

همانطور که در HTTP درخواست مشاهدهی یک صفحه از طریق فراخوانی یک URL انجام میشود، در REST API نیز همینگونه است. به فرمت زیر دقت کنید:

این تصویر نمونهی فرمت صدا زدن یک API را نمایش میدهد. Server or Host آدرس سرور مورد مراجعه را مشخص میکند؛ برای مثال روتری که قصد فراخوانی اطلاعات از آن را داریم. Resource مسیر و اسم تابعی که قصد استفاده از آن داریم را مشخص میکند؛ برای مثال تابع Get Interfaces که لیست اینترفیسهای روتر را نمایش میدهد و Parameters که پارامترهای احتمالی تابع پیشین را مشخص میکند.
معرفی Postman
مشخص شد که API یک روش ارتباطی بین نرم افزارها به حساب میآید. اما تا این لحظه ما با هیچ زبان برنامه نویسیای آشنایی نداریم تا بتوانیم نرم افزاری بنویسیم و از طریق آن به تجهیزات شبکهی مورد نظر وصل شویم. نرم افزار Postman دقیقا همین خلأ را پر میکند. Postman تا آنجایی که مورد استفادهی ما خواهد بود؛ یک API Client است که URLای مشابه تصویر قبل را به همراه برخی پارامترهای مورد نیاز فراخوانی میکند و پاسخ را نمایش میدهد. پیشنهاد میکنم همین الان از این لینک نرم افزار Postman را دانلود کنید و ادامهی این مطلب را که ارسال و دریافت پاسخ از یک تجهیز شبکه از طریق API است را همزمان تجربه کنید.
دستگاهی که قصد اتصال به آن و استفاده از API های آن را داریم روتر مجازی CSR1000 سیسکو است. البته تمامی تجهیزات سیسکو Rest API ارائه نمیکنند و در بین روترها تنها در تجهیزات دارای IOS XE این امکان وجود دارد. سوییچهای سری 9000 فایروالها، سوییچهای دیتاسنتر، Cisco Prime و … از دیگر محصولات سیسکو هستند که امکان استفاده از Rest API را فراهم کرده اند. البته عدم پشتیبانی از API به معنای عدم امکان ارتباط با یک تجهیز نیست و API تنها یکی از راههای ارتباطی ما با تجهیزات شبکه است؛ در مطالب بعدی در این مورد بیشتر خواهیم گفت.
مستند زیر مرجع استفاده از API های روتر CSR1000 است و توابع مورد استفاده در مثالهایی که در ادامه میآیند، در این مستند قابل مشاهده اند.
https://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/restapi/restapi.html
برای ارتباط با این روتر و تبادل اطلاعات با آن، طبق مستند بالا نیاز داریم ابتدا از طریق تابعی به نام token-services بر روی روتر احراز هویت شویم تا بتوانیم از سایر توابع استفاده کنیم.
در POSTMAN آدرس روتر را به همراه پورت 55443 و مسیر و نام تابع مورد استفاده (تصویر زیر) در قسمت URL وارد و متد را نیز همانگونه که در مستند آمده POST انتخاب میکنیم.

در تب Authorization نام کاربری و رمز عبور اتصال به روتر را وارد میکنیم و Send را میزنیم.

پاسخ روتر شبیه تصویر زیر خواهد بود.

در اغلب API های تجهیزات سیسکو احراز هویت اینگونه است که در ابتدای کار توکنی از دستگاه اخذ میشود و این توکن در Header دیگر توابع مورد استفاده قرار میگیرد. اکنون میتوانیم هرکدام از توابع ذکر شده در مستند API Reference این روتر را با استفاده از این توکن فراخوانی کنیم. برای مثال تابع interfaces لیست اینترفیسهای روتر را نمایش خواهد داد. در Postman همانند قبل، URL این تابع را وارد میکنیم، متد را طبق مستند GET انتخاب میکنیم و این بار، در قسمت Header پارامتری به نام X-auth-token اضافه میکنیم و Value آن را معادل مقداری که از تابع token-services اخذ کرده ایم قرار میدهیم. با وجود این توکن دیگر نیازی به استفاده از نام کاربری و رمز عبور در قسمت Authorization نداریم.

تصویر زیر بخشی از خروجی این تابع را نمایش میدهد.

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