چرا بهعنوان یک مهندس شبکه باید پایتون یاد بگیرم، شرکت همین الان هم کلی برنامهنویس داره! دیگه نیازی به مهندس شبکه با دانش برنامهنویسی نداره! همه کارهام رو بدون پایتون هم انجام میدم، ارزش افزوده ای برای من نداره! واقعیت این هست که سرعت رشد شبکهها و سرویسها و اهمیت فزاینده دردسترس بودن سرویسهای امروزی و از طرفی عدم رشد تعداد نیرو در واحدهای فناوری اطلاعات متناسب با فشار کاری، دلیلی بر وجود استرس بیش از گذشته شده. نگهداری شبکه و کارهای روزمره خودش تمام یا اکثر وقت تیم رو میگیره و توسعه شبکه و بازطراحی بعضی وقتها جایی تو کارها نداره! در نتیجه باید فکری برای بهرهوری کرد.
خیلی کارها رو میشه دستی انجام داد ولی فکر کنید کاری که چندین ساعت طول میکشه رو بتونیم، با یک اسکریپت و تو چند دقیقه انجام بدیم. مثلاً فکر کنید که رفتید جایی و مستندی از شبکه وجود نداره و می خواید با cdp یه نقشه حداقلی از شبکه بکشید، لاگین کردن و گرفتن show cdp neighbors روی تجهیزات، درست کردن description اینترفیسها و آوردنشون رو نقشه، خوب این کلی کار هست، اگر اسکریپت نوشته میشد که این کار ها رو حداقل یک قسمتش رو خودکار انجام بده خوب بود. چنین چیزی رو برای نمونه نوشتم و آخر مطلب بهعنوان نمونه در اختیار میگذارم و جزو اسکریپتهایی هست که بعضی وقتها به کارم میآید. این فقط یک مثال بود، اعمال هاردنینگ روی تجهیزات، یا بازبینی پیکربندی گذشته، در بازههای زمانی مختلف و یک خروار کارهای تکراری که میتونه انجام شدنش با یک اسکریپت خیلی راحتتر شه، تا اینکه ssh بزنیم به چند صد تجهیز و چشمی بازبینی کنیم. خطای کار هم بسیار پایینتر خواهد بود. در کل خودکار سازی کارهای تکراری و یا پیکربندیهای پیچیده چیزی هست که بهشدت نیازمندی اون دیده می شه. یا مثلاً گزارشهای مختلف که بعضی وقتها نیاز هستند.
مثال واقعی میشه بازبینی rule های فایروال! خروجی خود فایروال ها با اسم object هست که دید درستی به صاحبان سرویس برای تصمیمگیری اینکه دسترسی موردنظر نیاز هست یا نه نمیده، حالا فرض کنید نیاز هست لیست دسترسیها، به همراه IP سرویس و پورت رو بهشون بدید. این گزارشها هر از چند گاهی مدتزمان زیادی از ما میگرفت، اما با استفاده از API های موجود در تجهیزات و چند خط اسکریپت اینجور کارها بسیار راحتتر شده و کاری که قبلاً چند روز زمان از یک نفر میگرفت بهصورت خودکار توسط یک اسکریپت و در زمان بسیار کوتاهی انجام می شه. پس بیش از این نیازی به گفتن واضحات نیست.
حالا چرا پایتون رو انتخاب کنیم! یا حداقل من چرا انتخاب کردم:
- یادگیری راحت و منابع خوب برای شروع
- سازندگان تجهیزات بهخصوص سیسکو از این زبان استفاده کردهاند
- سیسکو در تجهیزات جدید shell پایتون را قرار داده
- شبکهها در حال بزرگتر شدن هستند اما تیمهای فناوری اطلاعات نه، ما باید راههای بهتری پیدا کنیم تا کارهای بیشتری با محدودیتهای فعلی انجام بدیم
- متمایز شدن از افرادی که کار رو به شیوه سنتی انجام میدند
- پایتون جامعه بسیار خوبی داره و رفع مشکلات احتمالی رو برای ما ساده میکنه
- سیسکو در برنامه DevNet خودش بهشدت استفاده از این زبان رو توصیه میکنه
- بسیاری از تجهیزات جدید دارای API هستند، این به معنی این هست که پیکربندیهای مختلف با چند خط کد قابلیت انجام داره.
در پایان یک نمونه کد میگزارم، این کد بر اساس خروجی دستور cdp ، description اینترفیس ها رو درست میکنه و خروجی رو هم تو یه فایل ذخیره میکنه، فقط کافیه ip تجهیزات رو تو فایل IPAddresses(هر IP توی یک خط) بگزارید. عوض اینکه تو n تا تجهیز لاگین و این کار رو دستی انجام بدیم، اسکریپت این کار رو برای ما میکنه. این اسکریپت رو وقتی نوشتم که تو پروژهای که هیچ داکیومنتی از شبکه وجود نداشت و سرو ته شبکه معلوم نبود گیر کردم و نیاز داشتم سریع یه دیدی حداقلی اما درست از شبکه و اتصالات داشته باشم و انصافا هم کار راه انداز بود. شاید خیلی از اصول برنامه نویسی توش رعایت نشده باشه، نیازی هم نبوده برای من کار کردنش مهم بوده. با استفاده از خروجی فایل راحت تونستم یه نقشه حداقلی از شبکه داشته باشم و البته که خودکار توضیحات اینترفیسها رو هم درست کردم.
حالا فرض کنید جای این اسکریپت خودم میرفتم و یکی یکی این کار هار رو انجام میدادم، شدنی بود ولی تفاوت زمانی این کجا و آن کجا، بماند که زمان نوشتن این اسکریپت یک بار هست و استفاده از اون نامحدود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
[crayon-6758b945e8c70113232555 ]from __future__ import print_function from netmiko import ConnectHandler import sys import time import select import paramiko import re fd = open(r'cdp-output.txt','w') # OutputFile old_stdout = sys.stdout sys.stdout = fd platform = 'cisco_ios' username = 'USERNAME' # edit to reflect password = 'PASSWORD' # edit to reflect ip_add_file = open(r'IPAddressList.txt','r') # a simple list of IP addresses you want to connect to each one on a new line for host in ip_add_file: host = host.strip() device = ConnectHandler(device_type=platform, ip=host, username=username, password=password) output = device.send_command('terminal length 0') output = device.send_command('enable') #Editable to be what ever is needed print('######################'+host+'########################################\n') print('...................show int description......................\n') print(device.send_command('show int description')) print('...................show cdp neighbors detail......................\n') output = device.send_command('show cdp neighbors detail') lines=output.split('-------------------------') for l in lines: localint='' remoteint='' remotedevice='' if len(l) > len('\nTotal cdp entries displayed : 0'): try: match0=re.search('Device\sID:\s(.+)',l) if match0 is not None: remotedevice=match0.group(1) else: print("No match found!") match1=re.search('Interface:\s(\S+)\,',l) if match1 is not None: localint= match1.group(1) else: print("No match found!") match3=re.search('Port ID(.+)',l) if match3 is not None: match2=re.search('(\S+)$',match3.group(1)) remoteint= match2.group(1) else: print("No match found!") print(localint+' To-'+remotedevice+'-'+remoteint) #cfg = device.send_config_set(['int '+localint, 'description '+'To-'+remotedevice+'-'+remoteint]) #Uncomment if you want to change description except: print("Something else went wrong") print('...................show int description......................\n') print(device.send_command('show int description')) print('##############################################################\n') fd.close() |