آموزش مدیریت پیکربندی و نوشتن Playbook های Ansible

ansible playbook نوشتن آموزش banner

آموزش مدیریت پیکربندی و نوشتن Playbook های Ansible
Configuration Management – Writing Ansible Playbooks

 

معرفی Ansible 

به صورت خلاصه مدیریت پیکربندی سرور ( در اینجا منظور خودکار سازی مدیریت IT است ) ، یک راه حل برای تبدیل مدیریت زیر ساخت به صورت بر مبنای کد Codebase است ، و برای انجام این کار نیاز به استقرار یک سرور برای تهیه اسکریپت هایی با قابلیت نسخه بندی و استفاده مجدد است. با این کار می توان زیرساخت همه سرور ها را به صورت جامع بهبود بخشید.در این آموزش درباره نحوه خودکار سازی مدیریت سرور ها بوسیله Ansible و طریقه نوشتن آن ها صحبت می کنیم. برنامه Ansible یک ابزار برای خودکار سازی مدیریت پیکربندی است که چهار چوب های کامل و قابلیت تنظیمات را با هدف ساده سازی و خلاصه کردن تنظیمات در اختیار ما قرار می دهد. در این آموزش بر روی نوشتن نحوه دستوری ، اصطلاحات و ویژگی های مورد نیاز برای ایجاد یک نمونه ساده روند خودکار سازی ساده و توسعه آن بر روی سرور Ubuntu 14.04 و با وب سرور Apache تمرکز می کنیم.

در زیر لیست مراحلی که باید برای رسیدن به هدف خودکار سازی تنظیمات سرور ها را انجام دهیم آورده ایم :

  1. به روز رسانی مخزن apt
  2. نصب Apache
  3. ساخت root directory سفارشی
  4. قرار دادن index.html در root directory سفارشی
  5. اعمال یک قالب برای راه اندازی یک هاست مجازی
  6. راه اندازی مجدد Apache

با نگاهی به ویژگی های اصلی زبانی که برای نوشتن Playbook ها استفاده می شود ،کار را با بررسی اصطلاحات استفاده شده در Ansible شروع می کنیم. در انتهای این آموزش مثال های کاملی را با شما به اشتراک می گذاریم تا خودتان آن ها را امتحان کنید.

نکته : این آموزش آماده شده تا زبان Ansible و نحوه نوشتن Playbook ها برای خودکار سازی تنظیمات سرور ها را به شما معرفی کند. برای مشاهده مقدمات بیشتر درباره Ansible و مراحل مورد نیاز برای نصب و شروع کار با آن آموزش نصب و راه اندازی Ansible بر روی Ubuntu 14.04 را مطالعه کنید.

شروع

قبل از شروع اصطلاحات Ansible به صورت کلی مرور می کنیم ، آشنایی با اصطلاحات و مفاهیم Ansible بسیار مهم است :

اصطلاحات Ansible

  • Controller Machine : ماشین یا سروری است که Ansible بر روی آن نصب شده و مسئولیت اجرای سرویس دهی به سرور هایی است که می خواهید آن ها را مدیریت کنید.
  • Inventory : یک فایل INI  که شامل اطلاعات سرور هایی است که می خواهید آن ها را مدیریت کنید.
  • Playbook : نقطه شروع تنظیمات و مقررات Ansible ، که وظایف خودکار سازی در آن با قالب بندی YAML تعریف شده است.
  • Task : یک بلاک که یک روش را برای اجرا شدن تعریف می کند ، مانند نصب یک بسته.
  • Module : یک ماژول معمولا وظایف یا کارهای سیستم را خلاصه می کند ، مانند برخورد با بسته ها یا ایجاد و تغییر فایل ها.
  • Role : به Playbook های از پیش تعیین شده و سازماندهی شده می گویند که به راحتی به برای استفاده مجدد به اشتراک گذاشته می شوند.
  • Play : کارهایی که از شروع تا پایان انجام می شوند را یک play می گویند.
  • Facts : متغیرهای عمومی که شامل اطلاعات سیستم مانند رابط های شبکه یا سیستم عامل می باشند.
  • Handlers : برای تغییر وضعیت یک سرویس استفاده می شود مانند راه اندازی یا متوقف کردن یک سرویس می باشد.

مقررات و تنظیمات Ansible با YAML که یک زبان ساده برای مرتب سازی داده ها است استفاده می شود.

وظایف – Tasks

یک وظیفه یا Task یک کاری را تعریف می کند که باعث اجرای یک مرحله از موارد مورد نیاز می شود. این وظایف معمولا شامل استفاده از یک ماژول یا یک دستور ساده می شود ( ماژول ها نیز  دستوراتی را تولید می کنند که در انتها این دستورات اجرا می شوند). در اینجا یک وظیفه یا Task را می بینیم :

مقدار name معمولا اختیاری است ولی برای اینکه در خروجی اجرای وظایف بتوانید نام آن را مشاهده کنید پیشنهاد می شود که از آن استفاده کنید. Apt نیز یک ماژول توکار Ansible است که ابزار مدیریت بسته در توزیع های مبتنی بر دبیان است. این وظیفه به Ansible می گوید که وضعیت بسته vim باید به latest تغییر کند، با این دستور اگر تاکنون بسته vim نصب نشده باشد آن بسته نصب و به روز می شود.

قالب بندی Playbook

Playbook ها نقطه اصلی تنظیمات Ansible می باشد. آن ها شامل اطلاعات سیستم هایی هستند که باید مدیریت شوند ، همچنین دستورالعمل ها و مراحلی که باید اجرا شوند. در زیر یک نمونه Playbook آورده شده که دو کار را انجام می دهد : به روز رسانی apt سپس نصب vim.

 

در زبان YAML برای طبقه بندی داده ها از دندانه گذاری استفاده می شود و به همین دلیل موقع نوشتن Playbook ها و مخصوصا هنگام کپی کردن مثال های Playbook ها  باید بسیار دقت کنید که ظاهر صحیح آن حفظ شود.

نوشتن Playbook ها

کار با متغیر ها

روش های مختلفی برای تعریف متغیر در Ansible وجود دارد. ساده ترین روش استفاده از قسمت vars در playbook می باشد. در مثال زیر متغیر package تعریف شده است که قبلا در وظایف از آن استفاده کردیم :

متغیر package در همه سرور ها قابل دسترس است که شامل فایل ها و قالب ها است.

استفاده از Loop

حلقه ها یا Loop ها برای تکرار یک وظیفه یا Task با استفاده مقادیر متفاوت است. برای نمونه به جای ایجاد کردن ۱۰ وظیفه برای نصب ۱۰ بسته ، یک وظیفه ایجاد می کنیم و با استفاده از Loop آن وظیفه را با بسته های مورد نظرتان برای نصب تکرار می کنیم.

برای ساخت حلقه با یک وظیفه از with_items با آرایه ای از مقادیر استفاده می کنیم. برای دسترسی به محتوا نیز از طریق متغیر item به مقادیر دسترسی داشته باشد ، مانند مثال زیر :

همچنین از متغیر آرایه برای تعریف مقادیر نیز می توانید استفاده کنید :

استفاده از شرط ها

از شرط ها به صورت پویا و بر مبنای یک متغیر یا خروجی یک دستور ، می توانید برای اجرا شدن یا نشدن یک فرمان استفاده کنید. در مثال زیر ، یک وظیفه فقط بر روی سیستم های مبتنی بر دبیان اجرا می شود :

شرط when آرگومان اظهار شده را برای ارزیابی دریافت می کند و وظیفه فقط زمانی اجرا می شود که مقدار دریافت شده true باشد. در اینجا ما فقط بررسی می کنیم که سیستم عضو خانواده دبیان باشد.

عمومی ترین استفاده از شرط ها در روند خودکار سازی، زمانی است که اجرا شدن یک وظیفه به مقدار خروجی یک دستور دیگر دارد. راه کار اجرایی برای این کار این است که یک متغیر برای نگهداری خروجی دستور تعریف می کنیم ، سپس در وظیفه مورد نظر آن را بررسی می کنیم. برای بررسی خروجی دستور می توان وضعیت خروجی را که با موفقیت اجرا شده است یا خیر را بررسی کرد یا اینکه محتوای خروجی دستور را بررسی کنیم که در این حالت ممکن است به regex expressions یا دستورات تحلیل رشته ها نیاز داشته باشیم.

در مثال زیر دو وظیفه آورده شده است که برای اجرا شدن به خروجی دستور php -v نیاز دارند. همانطور که می دانید اگر PHP بر روی سرور نصب نباشد اجرای این دستور با خطا مواجه خواهد شد ، پس برای بررسی شرط خروجی این دستور ، وضعیت اجرای دستور را بررسی می کنیم. قسمت ignore_errors بخش مهمی از یک وظیفه است و برای ادامه فعالیت یک وظیفه نسبت به خروجی دستور نقش مهمی را دارد.

 

ماژول Debug که در اینجا استفاده کردیم یکی ماژول بسیار کاربردی برای نمایش مقدار متغیر ها و تحلیل پیام هاست. این ماژول می تواند یک رشته را چاپ کند ( زمانی که از آرگومان msg استفاده شود ) یا اینکه محتوای یک متغیر را چاپ کنید ( زمانی که از آرگومان var استفاده شود ).

کار با قالب ها

قالب ها معمولا برای فایل های تنظیمات پیکربندی استفاده می شوند که با استفاده از متغیر ها یا ویژگی های مورد نظرمان می توانیم از این فایل ها برای مقاصد دیگر نیز استفاده کنیم. Ansible از قالب موتور Jinja2 استفاده می کند.

در مثال زیر یک قالب برای تنظیم یک هاست Apache آورده شده است که از یک متغیر برای تعیین مسیر ریشه هاست استفاده می کنیم :

ماژول توکار template برای اعمال قالب می باشد که به صورت یک وظیفه عمل می کند. اگر نام قالب که در بالا تعریف کردیم را vhost.tpl گذاشته باشید و در همان مسیری باشد که Playbook شما قرار داشته باشد ، با صورتی که در زیر آورده شده می توانید قالب را با قالب پیش فرض تعیین هاست Apache جایگزین و اعمال کنید :

تعریف و راه اندازی کنترل کننده ها –  Handlers

از کنترل کننده ها یا همان Handler ها به عنوان تغییر دهنده وضعیت یک سرویس ، مانند متوقف کردن یا راه اندازی مجدد استفاده می شود. کنترل کننده ها رفتاری شبیه به وظیفه ها دارند و دستور تعریف شده را اجرا می کنند ، با این تفاوت که برای اجرا باید notify در آن وظیفه تعریف شده باشد. کنترل کننده ها معمولا از قبل در یک آرایه در قسمت handlers از playbook تعریف شده اند.

برای نمونه نگاهی به مثال قبل که از یک قالب نمونه برای ایجاد هاست مجازی Apache استفاده کردیم می اندازیم. اگر بخواهیم که Apache بعد از تغییرات هاست مجازی مجددا راه اندازی شود ، باید یک کنترل کننده برای سرویس Apache بنویسم. به صورت زیر یک کنترل کننده یا Handler برای Playbook می نویسیم :

در اینجا قسمت name بسیار مهم است ، زیرا تعیین کننده یک نام واحد و Unique برای کنترل کننده یا Hnadler است. برای اجرا شدن این کنترل کننده در یک وظیفه باید از گزینه notify استفاده کنید :

یک نمونه Playbook

اکنون به Playbook ای که در این آموزش برای خودکار سازی نصب Apache بر روی سرور Ubuntu 14.04 نوشتیم ، نگاه دقیق تری می کنیم. این یک مثال کامل است که شامل قالب و راه اندازی Apache و یک فایل HTML است که توسط وب سرور نمایش داده می شود که از اینجا می توانید این فایل را بدست آورید. همچنین این پوشه حاوی Vagrantfile است که از آن برای بررسی و تست ساده Playbook با ماشین مجازی مدیریت شده با Vagrant مدیریت می شود ، می توانید استفاده کنید.

در زیر Playbook به صورت کامل آورده شده :

توضیحات Playbook

hosts: all

فایل Playbook با اظهار اینکه تنظیمات باید به تمامی هاست ها ( host: all ) اعمال شوند ، شروع می شود. این مقدار می تواند به هاست های بخصوص یا گروهی از هاست ها تغییر کند.

become: true

این قسمت به Ansible می گوید که از افزایش دسترسی (sudo) برای اجرای تمامی دستورات استفاده کند. این گزینه می تواند برای هر وظیفه ای و بازنویسی شود.

vars

تعریف متغیر doc_root ، که قبلا در وظیفه Task از آن استفاده کردیم. در این قسمت می توان متغیر های متفاوت دیگری را نیز تعریف کرد.

tasks

در این قسمت خود وظیفه یا Task تعریف می شود. ابتدا بسته apt را به روز می کند و در وظیفه بعدی بسته apache2 را نصب می کند.

وظیفه سوم از ماژول file برای ساخت دایرکتوری در مسیر ریشه ای که برای سرویس دهی استفاده می کنیم ، ایجاد می کند. از این ماژول برای مدیریت فایل و دایرکتوری استفاده می شود.

چهارمین وظیفه از ماژول copy برای کپی کردن فایل سیستم محلی به سرور استفاده می کند. یک فایل HTML ساده را برای سرویس دهی وب  Apache کپی می کنیم.

handlers

در انتهای نیز قسمت handlers را داریم که سرویس ها در آن معرفی شدند. یک کنترل کننده restart apache تعریف کردیم تا تغییرات Apache اعمال شوند.

Leave a Reply