سلام, توی این پست می خوام به ساده ترین روش ممکن توضیح بدم Ansible چیه و چه کاربردی داره. مثل همیشه از مثال های ساده و ابتدایی استفاده می کنم که کانسپت اصلی درکش راحت باشه.
خوب قبل اینکه بخوام توضیح بدم انسیبل چی هست و چجوری استفاده می شه باید یه مقدمه ی کوچیک بگم.
این روز ها واژه ی Automation یا IT Automation رو زیاد می شنوید, automation به زبان ساده یعنی تبدیل کردن یه سری فرایند های تکراری از حالت دستی به حالت اتومات, حالا توی صنعت IT هم همینه, یه سری کار ها هست که معمولا زیاد انجام می دیم... مثلا اگر SysAdmin باشید نصب خرت و پرت روی سرور ها رو احتمالا هر روز انجام می دید, خوب اگر بحث 4 تا 5 تا سرور باشه انجام این کار به صورت دستی قابل تحمله, اما اگر 5 تا سرور بشه 50 تا چی ؟ خوب اینجاست که مفهوم Automation خودش رو نشون می ده. حالا این Automation چجوری باید انجام بشه ؟ به وسیله ابزار های مختلف که این روز ها به وفور در دسترس هستند.
خوب, همونطور که Nginx ,Apache,Tomcat و ... به عنوان وب سرور در دسترس هستند یا مثلا Git و SVN و ... به عنوان سورس کنترل یا PHP, Python و Nodejs به عنوان زبان برنامه نویسی, برای پیاده سازی فرایند Automation هم ابزار های مختلفی داره که معروف ترین هاش Puppet, Chef و Ansible هستن.
احتمالا یه سوال تکراری براتون به وجود میاد که کدومش بهتره ؟ این سوال که کدوم بهتره همیشه جوابش اینه: بستگی داره!
بستگی داره که با سینتکس کدوم بهتر ارتباط برقرار می کنید, یاد گیری کدوم براتون راحت تر, کدوم به زیرساخت شما نزدیک تره و ... انتخاب من Ansible بود به دلایل زیر:
برای من همین 2 تا دلیل کافی بود تا Ansible رو انتخاب کنم.
خوب مثل همیشه نصب انسیبل رو توضیح نمی دوم چون خیلی ساده هست. انسیبل کلا با دو تا فایل کار می کنه, یکی فایلی که لیست سرور ها رو توی می نویسید که بهش می گن inventory یکی هم فایلی که تسک هایی که قراره روی اون سرور ها انجا بشه رو توش می نویسید که بهش می گن playbook.
اول فایل inventory رو توضیح می دم, یه نمونه ی ساده از فایل inventory رو می تونید اینجا ببینید:
#inventory.cnf [web] 192.168.1.10 192.168.1.11 192.168.1.12 [cache] 192.168.1.13 [blog] 192.168.1.14 [database] 192.168.1.15
خوب فکر کنم خیلی ساده هست... یه سری سرور داریم که هرکدوم یه ip دارن و اومدیم توی یه فایل inventory.cnf همشون رو تعریف کردیم و به هرکدوم به اسم دادیم. از این اسم ها بعدا توی فایل تسک ها استفاده می کنیم, تنها نکته ی گنگ این نمونه فایل اون قسمت اول یعنی [web] هست که 3 تا ip داخلشه... این به این معنی هست که ما سه تا سرور داریم که گذاشتیمشون توی یک گروه به اسم web این کار رو معمولا وقتی انجام می دیم که این سرور ها دقیقا باید مثل هم باشن, مثلا سرور هایی که Load Balance کردیم, اینطوری وقتی یه تسک رو روی گروه web اجرا کنیم هر 3 تا سرور ما آپدیت می شن.
اما یک نمونه فایل playbook به شکل زیر هست:
( اگر با سینتکس YAML آشنا نیستید به سرچ بکنید تا آشنا بشید, کل playbook های ansible با سینتکس YAML نوشته می شه )
کار این playbook این هست که بره وضعیت Nginx رو روی سرور های web و blog ما چک کنه ببینه فعال هست یا نه... اگر نه اون رو start کنه.
#my_playook.yml - hosts: - web - blog tasks: - name: Check nginx status service: name: nginx state: started
خوب اجازه بدید قسمت های مختلف این فایل رو توضیح بدم:
قسمت hosts:
همونطور که مشخصه توی این قسمت مشخص می کنید که این playbook و تسک هایی که توی اون تعریف کردید رو کدوم سرور ها اجرا بشه که اینجا ما سرور های web و blog رو گذاشتیم که در مجموع می شه 4 تا سرور چون اگر یادتون باشه 3 تا سرور web داشتیم و یدونه blog.
قسمت Tasks:
در این قسمت تسک ها یا کارهایی که قراره روی سرور ها انجام بشه رو می نویسید. هر تسک یک نام داره که با - name مشخص می شه و چیز خیلی مهمی نیست فقط موقع اجرای playbook توی کنسول نمایش داده می شه تا بدونید کدوم تسک در حال اجرا هست.
خوب در اینجا باید توضیح بدم که ansible یه سری ماژول داره که اجرای دستورات رو راحت تر می کنه و برنامه نویس های دنیا این ماژول ها رو توسعه می دن ( با تشکر ویژه از دنیای open source ). البته خیلی از این ماژول ها توسط خود انسیبل توسعه داده شده. به عنوان مثال انسیبل برای git برای apt برای pip و برای خیلی از چیزای دیگه ماژول داره... مثلا با استفاده از ماژول git می تونید خیلی ساده روی سرور ها بدون اینکه بهشون ssh بزنید pull بگیرید!
حالا ما اینجا ما از ماژول service استفاده کردیم که 2 تا پارامتر می گیره:
name: اسم سرویس
state: وضعیتی که تمایل داریم سرویس ما داشته باشه... در اینجا started
اتفاقی که میفته اینه که انسیبل میاد از طریق ssh وصل می شه به سرور ما و می ره سراغ تسک ها که در اینجا ما یه تسک بیشتر نداریم, یعنی اطمینان از اینکه nginx در وضعیت start هست, اگر در این مرحله سرویس nginx از قبل در وضعیت start باشه انسیبل کاری انجام نمی ده اما اگر start نباشه سرویس nginx رو start می کنه.
خوب حالا وقتشه که playbook خودمون رو اجرا کنیم, با دستور زیر این کار رو انجام می دیم:
ansible-playbook my_playbook.yml -i inventory.conf -u root -k
همونطور که مشخصه گفتیم کدوم playbook رو اجرا کن و آدرس فایل inventory هم با فلگ -i مشخص کردیم... تنها نکتش اینه که گفتیم با یوزر root تسک ها رو اجرا کن و اون -k آخر هم واسه اینه که پسورد root رو از ورودی بگیره ( به صورت prompt ).
این دستور رو که اجرا کنید اول بهتون می گه پسورد روت رو وارد کنید بعد هم می ره playbook رو اجرا می کنه. بعد از اتمام اجرا اگر مشکل ارتباطی و خطای سنتکس و اینا نداشته باشید نتیجه به صورت زیر نمایش داده می شه بهتون:
ok تعدا تسک های موفق
changed تعداد تغییرات انجام شده روی سرور
failed تعداد تسک های ناموفق
ignore تعداد تسک هایی که کلا اجرا نشدن
تمام!
انسیبل خیلی گسترده هست و این پست فقط جهت آشنایی اولیه با نحوه ی کار بود.
من 2 تا playbook نوشتم و روی Github گذاشتم که یکیش Nginx و PHP رو نصب و کانفیگ می کنه و اونیکی برای نصب و کانفیگ Redis هست. می تونید هم استفاده کنید به صورت عملی و هم نگاه کنید برای آشنایی بیشتر.
آدرس گیت هاب من: https://github.com/ordidaad