خودکارسازی شبکه: Python و Ansible
جواب کوتاه
خودکارسازی شبکه یعنی کاری را که باید روی دهها دستگاه تکرار شود، یک بار بنویسید و برنامه آن را روی همه اجرا کند. Ansible ابزاری رایگان و متنباز برای همین است: روی یک رایانه (control node) نصب میشود، فهرست دستگاهها (inventory) و دستور کار (playbook، به زبان YAML) را میخواند، و با SSH به دستگاهها وصل میشود، بی آنکه رویشان چیزی نصب شود. اجرای دوباره همان نتیجه را میدهد و فقط چیزی را که لازم است عوض میکند، و با --check میشود پیش از اجرا دید چه عوض میشد. پایتون هم برای ساختن تنظیم و نوشتن ابزارهای کوچک به کار میآید.
نام
خودکارسازی، یا اتوماسیون، شبکه یعنی کاری که باید روی دهها یا صدها دستگاه تکرار شود، یک بار نوشته شود و برنامه آن را روی همه اجرا کند؛ بهجای اینکه به تکتک دستگاهها وصل شوید و همان فرمانها را تایپ کنید.
«اتوماسیون شبکه» را برای شبکهی برق هم به کار میبرند؛ اینجا منظور شبکهی رایانهای است، و دو ابزار رایگانش: Ansible و زبان برنامهنویسی Python.
کارتهای نوروز
فرض کنید میخواهید برای صد نفر کارت تبریک نوروز بفرستید. دو راه دارید:
خودکارسازی همان راه دوم است. فهرست نامها همان فهرست دستگاههاست، و قالب همان دستور کاری که روی همه اجرا میشود. و اگر به کسی کارت رسیده، دوباره برایش نمیفرستید.
Ansible چیست
Ansible ابزاری رایگان و متنباز برای خودکارسازی است: تنظیم سرورها، نصب برنامهها، و خودکارسازی شبکه. دو ویژگیاش آن را برای شبکه مناسب میکند. یکی اینکه روی دستگاهها چیزی نصب نمیشود و با همان SSH که دارند به آنها وصل میشود. دیگری اینکه دستور کار را به زبانی مینویسید که هم آدم میخواند و هم ماشین.
چهار جزء
control node رایانهای است که Ansible رویش نصب است، مثلا لپتاپ شما. inventory فهرست دستگاهها و گروههایشان است. playbook دستور کار است: چه کاری، روی کدام گروه، به چه ترتیب. و هر کار را یک ماژول انجام میدهد؛ ماژولهای شبکه برای هر سازنده در مجموعهی خودشاناند و روی خود control node اجرا میشوند، نه روی دستگاه.
یک فهرست و یک playbook
فهرست، دو سوییچ در گروه switches:
[switches] sw1 ansible_host=192.168.1.2 sw2 ansible_host=192.168.1.3
و playbook، به زبان YAML، که روی همهی سوییچها VLAN کارکنان را میسازد:
---
- name: VLANs of the office
hosts: switches
connection: ansible.netcommon.network_cli
gather_facts: false
tasks:
- name: Create VLAN 10
<vendor>.<collection>.vlans:
config:
- vlan_id: 10
name: STAFFconnection: network_cli یعنی همان خط فرمان، روی SSH. بهجای <vendor>.<collection> نام مجموعهی ماژول سازندهی سوییچتان میآید، و گزینهها در هر مجموعه کمی فرق دارند؛ فکر همان است. اجرا:
ansible-playbook -i inventory.ini vlans.yml
همان VLANی که در درس پیکربندی سوییچ با دست ساختید، حالا روی هر چند سوییچی که در فهرست باشد ساخته میشود.
یک بار یا صد بار
Ansible بهجای «این فرمانها را بزن» میگوید «دستگاه باید اینطور باشد». اگر هست، کاری نمیکند؛ اگر نیست، درستش میکند. پس یک بار اجرا همان نتیجهی صد بار اجراست. به این idempotent بودن میگویند:
آزمون پیش از اجرا
ansible-playbook -i inventory.ini vlans.yml --check --diff
--check هیچ چیزی را عوض نمیکند و فقط میگوید چه عوض میشد. --diff نشان میدهد دقیقا چه عوض میشود. ولی check جای محیط آزمایشی را نمیگیرد، چون خطاهای پیشبینینشده و اثرهای زنجیرهای را نمیبیند؛ همان احتیاطی که در درس مدیریت تغییر گفتیم.
پایتون برای شبکه
Python زبان برنامهنویسی رایگانی است که برای کارهای کوچک شبکه هم به کار میآید. سادهترین کارش ساختن متن تنظیم از روی یک فهرست است، مثل همان کارتهای نوروز:
switches = ["S1", "S2", "S3"]
for name in switches:
print(f"hostname {name}")
print("vlan 10")
print(" name STAFF")این چند خط برای هر سوییچ تنظیمش را مینویسد؛ با صد نام هم همین چند خط است. Ansible هم خودش با پایتون نوشته شده است. بعدتر میشود با پایتون به دستگاهها وصل شد و از API آنها پرسید؛ درس بعد.
اولین خودکارسازی، قدمبهقدم
- از خواندن شروع کنید: اولین playbook فقط چیزی را بخواند، مثلا نسخه یا تنظیم دستگاهها؛ چیزی را عوض نکند.
- فهرست را بنویسید: دستگاهها را با نشانیشان در inventory بنویسید و در گروهها بگذارید.
- یک دستگاه آزمایشی: اولین تغییر را روی یک دستگاه آزمایشی بزنید، نه روی همه.
- --check و --diff: پیش از اجرای واقعی ببینید چه عوض میشود.
- مثل هر تغییر دیگر: پشتیبان، برنامه و ثبت در دفتر تغییرات؛ خودکارسازی فقط دست را سریعتر میکند.
سه اشتباه
- «خودکار است، پس خطا نمیکند.»اگر playbook اشتباه باشد، همان اشتباه را روی همهی دستگاهها، با هم، میزند. اول روی یکی بیازمایید.
- «--check گفت مشکلی نیست؛ محیط آزمایشی لازم نیست.»check فقط میگوید چه عوض میشد؛ اثرهای زنجیرهای و خطاهای پیشبینینشده را نمیبیند.
- «رمزها را در خود playbook مینویسم.»playbook را آدمهای زیادی میبینند و در مخزن نگه میدارند؛ رمز جای جدا و امن دارد، همان قاعدهی درس مستندسازی.
جمعبندی. آنچه از این درس با خودتان میبرید.
- خودکارسازی: یک بار نوشتن، همهجا اجرا.
- Ansible: control node، inventory، playbook، ماژول.
- بی نصب روی دستگاهها؛ با SSH.
- idempotent: اجرای دوباره، همان نتیجه.
- --check و --diff پیش از اجرا؛ ولی محیط آزمایشی هم.
- پایتون: ساختن تنظیم از روی فهرست.
خودتان را بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخر آزمون فقط کارنامه را میبینید: چند درست، چند نادرست.