دسته‌ها
ابزارها لینوکس

مکانیزه و اوتوماتیزه با انسیبل

آنچه که از ابزار قدرمند انسیبل(Ansible) باید دانست. قسمت اول

دوستان خوبم سلام؟ خوبید؟ دماغتون چاقه؟ من هم خوبی والله، بدکی نیستم. نیمچه نفسی میاد و میره که بتونیم براتون بنویسیم و اینا.بگذریم. زیاد هم مهم نیست. مهم امروز اینه که میخوام از یه پست داغ در مورد ابزار بسیار مهم و کاربری به اسم انسیبل(Ansible) براتون بگذارم. خوب بریم سر اصل مطلب.

انسیبل یه سری کارهای خیلی خوب میکنه اما قبلش یه تاریخجه ازش بهتون بگم. قبلا (زمانی که دنیای وب به اندازه امروز مهم و همه گیر شد) ادمینها یا سیس‌ادمینها سرورهای زیادی برای مدیریت نداشتند و با قابلیتهایی که زبانهای اسکریپت نویسی مثل شل یا پرل و بعدها پایتون داشتند خالی بودن جای نرم‌افزارهایی مثل این هم محسوس نبود. طبیعتا هرکس نیازی داشت برای خودش اسکریپت مینوشت و مشکلش رو حل میکرد. اما دو عامل باعث شد که بالاخره اواسط دهه اول از قرن بیست و یکم جای خالی اینطور ابزارهایی احساس بشه. اولین دلیل این بود که سیس ادمینهای قدیمی که یه مجموعه رو ترک میکردند سیس‌ادمین جدید مدتی زمان داشت تا با ورک‌فلو اسکریپتهای سیس‌ادمین قبلی آشنا بشه. چونکه هیچ استانداردی برای نوشتن اسکریپت وجود نداشت. یه عامل دیگه این بود بعد از مدتی تعداد سرورهای که باید توسط هر سیس‌ادمین مدیریت میشد بصورت خیلی محسوسی خیلی زیاد شد. یعنی دیگه یکی یا دوتا ماشین نبود که باید مدیریت میشد. بعضأ در شرکتهای بزرگ مثل گوگل یا فیس‌بوک و امثال‌هُم تعداد سرورهاشون به چند هزارتایی رسیده بود. با این تفاسیر حتی کپی کردن یا در بهترین حالت کلون کردن یک سری از اسکریپ برای مدیریت سرورهای یک مجموعه بزرگ کار سردردی بود. این شد که این نوع محصولات تولید شدن. قبل از اینکه شروع به نوشتن کنم یه بررسی کردم و مطمئن شدم که پیشتاز این نوع ابزار پاپت(Puppet) هست. که البته خود من هم برای اولین بار از پاپت استفاده کردم. بعد از اون چف(Chef) بود که معرفی شد اما بالاخره آقامون کلاه‌قرمز(RedHat) اعلام کرد در توسعه ابزاری به اسمل انسیبل مشارکت خواهد کرد. فرق بزرگی که بین انسیبل و رقابش هست اینه که انسیبل ایجنت‌لس(Agent Less) هست و این تفاوت فاحشی ایجاد میکرد. یه فرق خوب دیگه هم دارند و اونم اینه که دوتای اول هر دو با زبان روبی نوشته شده در حالی که انسیبل با پایتون توسعه داده شده. کلی فرق دیگه هم دارند که از حوصله این پست خارجه.

خوب بریم سر اصل مطلب که کار کردن با این ابزار خوبه. راستش خیلی فکر کرده بودم چجوری پستی بگذارم که به درد بخور بشه(بقول معروف، گل لگد نکرده باشم) به این نتیجه رسیدم که بجای اینکه آموزشی چیزی بنویسم تجربیات خودم رو به اشتراک بگذارم. چون داکیومنت و راهنما که به اندازی مکفی داره در سطح ملی و فراملی تولید میشه، پس من یکم متفاوت تر فقط معرفی میکنم و بست‌پرکتیسها(Best Practices) رو به اشتراک میگذارم. که به نظر خودم خیلی هم مهم هستند.

اولین نکته ای که به ذهنم رسید این بود که چجوری باید نصب بشه. میدونید که امروز خیلی راه برای نصب یه نرم‌افزار متن باز وجود داره. میشه از سورس‌کد نصب کرد. میشه از پکیج منیجرها استفاده کرد و حتی میشه از اسکریپت و غیره… اما واقعا بهترین روش هیچ کدوم از اینها نیست. بهترین روش رو براتون توضیج میدم. قبلا گفتیم انسیبل ایجنت‌لس هست و قبلترش گفتیم با پایتون نوشته شده. اولین راهی که یک پایتونیست واقعی برای نصبش باید برسه؟ پیپ(PyPip) که پکیج منیجره مخصوص پایتون هست باید باشه. چرا این روش؟ خیلی دلیل داره که بعدتر به مهم‌هاش میپردازیم. اما قشنگش اینه که به اکوسیستم پایتون احترام میگذاریم. میدونم براتون دلیل قانع کننده‌ای نیست، اما اگه صبور باشید و این پست رو تا آخر بخونید بارها و بارها خواهیم گفت که چرا باید با پیپ نصبش کرد.

برای نصبش با پیپ کار خواصی نمیخواد کرد کافیه دستور زیر و اجرا کنید:

sudo -H pip install ansible==2.7.1

ولی! یه چندتا نکته ریز داره! اول اینکه اگه پایتون کاردید با یه ابزاری به اسم ویرچوال‌انو(Virtualenv) آشنایید! به کمک این ابزار میشه یه محیط کامندلاینی ویرچوال یا مجازی داخل محیط کامندلاینی اصلی خود لینوکس درست کرد و بعدش تمام پیشنیازها و وابستگیهای مربوط به هر پروژه رو داخل همون محیط کامندلاینی نصب کرد بدون اینکه به ابزارهای محیط اصلی دست بخوره! با این کار میشه وابستگیهای هر پروژه داخل محیط مجازی شده خودِ اون پروژه اضافه کرد و طبعا خیلی راحت تر میشه با دیگران به اشتراکشون گذاشت. اما کجا و چجوری تو بحث امروز ما این ابزار کوچولو و بامزه نمود پیدا میکنه؟ فرض کنید که شما بنا به دلایل متعدد! مایلید که از ورژنهای مختلف انسیبل استفاده کنید! چرا ممکنه به اینکار محکوم بشیم و یا علاقه مند بشیم. چونکه انسیبل هر روز در حال توسعه هست و هر روز در حال پیشرفته و ممکنه جایی شما پلی‌بوکی(Playbook) نوشته باشید(بعدتر با مقوله پلی‌بوک هم آشنا میشم اگه تا الان نیستید)  که بنابه هر دلیل فنی نمیتونید با یه ورژن دیگه از انسیل اجراش کنید!. بجز این گفتیم که انسیبل خودش از پایتون استفاده میکنه و برای پارس کردن پلی‌بوکهامون از کتابخونه جینجا۲(Jinja2) بهره میگره. ممکنه شما جایی طی پلی‌پلی‌بوک از یه کتابخونه دیگه کمک گرفته باشید که تمپلیت آن‌د‌فِلای(On-the-fly) تولید بشه و برسه بدست جینجا۲، پس میتونید اینجا هم از تواناییهای ویرچوآل‌انو بهره بگیرد. قبل تر هم گفتیم که انسیبل یه ابزار ایجنت‌لس هست و در سمت ورکرها(Worker) به چیزی نیازی نداره و صرفا از ssh استفاده میکنه! بنظرتون به اندازه کافی منطقیه؟
خوب! یه نکته دیگه مونده که بگم. تو اکثر توزیعها پیپ بروز نیست. بنابراین توصیه میکنم اگه تاحالا بروزش نکردید قبل از هر کاری اول بروزش کنید!

sudo -H pip install -U pip 
  sudo pip install --upgrade virtualenv

همزمان ویرچوال‌انو هم نصب کردیم.
من برای مراحل این پست سه تا ورکر‌ند(Worknode) روی وایگرانت(ٰVagrant) تهیه کردم که باهاتون به اشتراک میگذارم و میتونید استفاده کنید و با دوستانتون به اشتراک بگذارید. فقط یه نکته داره اونم اینکه من بجای ویرچوآل‌باکس(ٰVirtualbox) از لیب‌ویرت استفاده میکنم. نمیدونم خوبه یا بده! به هر حال اگه خواستید میتونید برای ویرچوآل باکس هم بنویسیدش. تمام مطالب این سری پستها رو هم میگذارم توی گیست یا یه جایی شبیه اون که آخرش میگم کجا و میتونید استفاده کنید.

#!/bin/bash
mkdir -p ~/Desktop/Ansible
git clone https://gist.github.com/b4bcbb422481da876a9b3f477ce5f67c.git ~/Desktop/Ansible 
virtualenv ~/Desktop/Ansible/.venv
source ~/Desktop/Ansible/.venv/bin/activate
cd ~/Desktop/Ansible
pip install ansible==2.7.1
vagrant up

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

#!/bin/bash
mkdir -p ~/Desktop/Ansible
https://gist.github.com/82891809462b7fe9a13df87f7d4cd4f2.git ~/Desktop/Ansible/
virtualenv ~/Desktop/Ansible/.venv
source ~/Desktop/Ansible/.venv/bin/activate 
cd ~/Desktop/Ansible
pip install ansible==2.7.1
vagrant up

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

خوب الان یه مرحله مونده تا برسیم به سناریومون! راستش الان دوست ندارم توضیح بدم که مرحله بعدی چی کار میکنه اما! اگه قبلا با انسیبل کار کردید خودتون به فایلهایی که صدا میزنیم نگاهی بندازید اگه هم که تازه کارید بهم اعتماد کنید و فقط این دستور رو اجرا کنید! قبلش فقط بگم که چون تو محیط آزمایشی کار میکنیم من همه یوزرهای سمت ورکندهارو روت(root) در نظر گرفتم. در حالی که در دنیای واقعی هرگز همچین کاری نمیکنم.
دستور بعدی کلیدهای عمومی کامپیوتر هاست(Host)  که به عنوان مسترنود(Master node) هم ازش استفاده میکنم کپی میکنه تو ورکند‌های مختلف:

ansible-playbook -i ansible-inventory-allinone vagrantconfig.yaml

اگر حین اجرای این دستور ارور گرفتید احتمالا باید این اسکریپ رو هر جایی از سیستم (مثلا tmp ) دخیره و اجرا کنید:

#!/bin/bash
for i in 10 11 12
do
   ssh-keygen -R 192.168.121.$i
done

و بعدش دوباره انسیبل‌پلی‌بوک رو با پارمترهایی که گذاشتیم اجرا کنید. خروجی کار میشه مثل این:

تا اینجا ما هنوز کاری نکردیم. و فقط مقدمات کار آماده هست. حالا بریم سراغ اینکه چجوری باهاش کار کنیم و باهاش بیشتر آشنا بشیم.

اولین چیزی که در خصوص انسیبل باید دونست اینوطوری هست. اینوتوری بصورت پیشفرض یه جایی به این آدرس /etc/ansible/hosts سیو میشه ولی روشی که الان دارم بهتون میگم خیلی بهتره! چرا چون من برای پروژهای مختلفم سرورهای مختلف دارم و با تقسیم بندی هر اینونطوری به پروژه مربوطه‌ش میتونم کلی تو وقت و انرژی و تروتمیزی کارم صرفه جویی کنم. خوشبختانه خود انسیبل یه سوئیچ داره به اسمi- که میشه بهش یه مسیر داد و گفت این فایل رو بع عنوان اینونطوری در نظر بگیر. از دست اینوطروی خیلی کار ساخته هست. میشه توش متغیر تعریف کرد بعد موقه پلی‌بوک نوشتن از متغیرها استفاده کرد. میشه هاستهارو گروه بندی کرد مثلا گروه بک‌اند یا گروه پروداکشن و کلی حالت مختلف.
من ترجیحم اینه که باهاش بازی کنیم. بیاید یه فایل درست کنیم. اسمش رو بزاریم ansible-khodemooni.yaml و داخلش اینهار رو بنویسم:

host0 ansible_host=192.168.121.10 ansible_user=root
host1 ansible_host=192.168.121.11 ansible_user=root
host2 ansible_host=192.168.121.12 ansible_user=root

اینجا ما دو جور متغیر داریم. اول که anisble_host تعریف کردیم که بعدا بتونیم همه هاستهامون رو یکجا صدا کنیم حتی بتونیم ایتریتشون کنیم. دوم یه ansible_user داریم گه گفتم قبلا من روت ست کردم چون داریم سناریو آزمایشی میزنیم و در واقعیت هرگز نباید چنین کرد!

ansible -m ping all -i ansible-khodemooni.yaml

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

ansible -i ansible-khodemooni.yaml -m shell -a 'grep DISTRIB_RELEASE /etc/lsb-release' host0

و خروجیش میگه ما از اوبوتو استفاده کردیم نسخه ۱۶.۰۴. دلیلشم این بود که احساس کردم ۱۸.۰۴ خیلی سنگینه و نمیکشه برای این همه بار.

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

ansible -i ansible-khodemooni.yaml -m shell -a 'grep DISTRIB_RELEASE /etc/lsb-release' host1:host2

تو این مثال گفتیم که ازhost1:تاhost2 علاوه بر اینها میشه از وایلدکارد هم استفاده کرد. مثلا *host.

خوب سناریو محور دوباره بر میگردیم روی اینونطوریها و متغیرهامون. اما برای حسن‌ختام این قسمت میخوام یه ماژول دیگه بهتون معرفی کنم. که یکی از مهمترنی ماژولهای انسیبل هست. چرا؟ چون میتونید کلی کار باهاش انجام بدید و همه جا و هرجایی کاربردهای خودش رو داره!
این ماژول اسمتش Setup هست. ولی برخلاف اسمش چیزی ست‌آپ نمیکنه. بلکه آنچه که در ورکرند ست‌آپ شده است را بصورت یه جِی‌سون برمیگرداند. اینکه JSON برمیگردونه خیلی مهمه. حتما میتونید تصور کنید چه کارهایی میشه باهاش کرد. بزارید ببینیمش. چون خروجیش خیلی طولانیه من فقط یکی از ندهارو صدا میکنم. صدا میکنم:

ansible -i ansible-khodemooni.yaml -m setup host0

اما خود این ابرار قدرمند هم به تنهایی توان این رو داره که کارهایی خروجیهای دلپسند تری بهمون بده. برای مثال خیلی موقعها لازم میشه که بدونیم چه مقداری حافظه رَم آزاد داریم که بتونیم تو الباقی فلو اتوماتیزه کردن براش برنامه ریزی کنیم. چیزی که معمولا خیلی اینروزها پیش میاد. ببینیم:

ansible -i ansible-khodemooni.yaml -m setup -a 'filter=ansible_memtotal_mb' all


درواقع موقع غربال کردن میشه هرچیزی که توی اون لیست بلند بالای اول دیدید استخراج کرد.

ansible -i ansible-khodemooni.yaml -m setup -a 'filter=ansible_kernel' all

خوب فکر برای قسمت اول کافی باشه. خودم هم یه مقدار خسته شدم و ترجیح میدم که متوفقش کنم. بشینید مطالعه کنید اگه تا حالا نکردید منم هم طی پست دوباره به انسیبل برمیگردم. تا اینجا یه کم با اینونطوری آشنا شدیم. یک مقدار خیلی کوچولو با پلی‌بوک و چندتا از ماژولها رو هم شناخیتم.
یه سری لینک هست که میخوام باهاتون به اشتراک بگذارم:

یاداداشت امروز: همه اینها تلاشها و طراحی سناریو کردنها یک علت داره. و اون علت چیزی نیست بجز:

گر رسد عمر به میخانه رسم بار دگر // بجز از خدمت رندان نکنم کاردگر
#حافظ

شاد باشید و ایام بکام.

Berlin, Germany

پاسخی بگذارید