Ansible چیست؟

avatar Pouya Dustdar
پنج‌شنبه، 18 ژانویه 2024
0 نظر

ابزار Ansible نوعی Configuration Manager است. از Configuration Manager ها برای اتومیشن زیر ساخت یا به اصطلاح Infrastructure as a code استفاده میشود.

Infrastructure as Code (IaC) چیست؟

در پروژه های بزرگ که تعداد زیادی سرور و اپلیکیشن داریم بحث مدیریت زیر ساخت مسئله مهمی خواهد بود. وقتی تعداد سرور های یک اپلیکیشن بیشتر میشود (مثلا ۵۰ vm) مدیریت سرور ها بسیار کار دشوار و طاقت فرسایی میشه. شما نیاز هست تا همیشه ایپی ها و اپلیکیشن ها و حتی تنظیمات اپلیکیشن هایی که در اون ای پی ها درحال سرویس دهی هستن رو به یاد داشته باشید. یا اگر نیاز باشه یک سرویسی شبیه به سرویسی که درحال حاظر توی زیر ساخت دارید رو بالا بیارید با تمام مراحل و تنظیمات رو دوباره طی کنید.در این مواقع هستش که ارزو میکنید کاش میشد همه اینا کد میشدن تا فقط شما توی کد تغییراتتون رو انجام میدادید و میزدید که اعمال میشد. بله IaC این کار رو براتون انجام میده. تمام تنظیمات خودتون رو به صورت کد بنویسید و هر جایی که لازم داشتید اجرا کنید.
مثال:
مسئله ای را در نظر بگیرید که ما نیاز داریم یک کلاستر کوبر بر روی 20 نود بالا بیاریم در این شرایط ما نیاز داریم بر روی 20 نود سرویس های مختلف و تنظیمات مختلفی را انجام دهیم تا بتوانیم تعدادی مستر و تعدادی ورکر به کلاستر اضافه کنیم. نصب تمام این سرویس ها بر روی تک تک سرور ها میتواند بسیار زمانبر باشد. پس ما نیاز داریم تمام تنظیمات و سرویس هایی که قرار بر نصب شدن هست را به صورت کد(IaC) دراورده و بر روی تمام سرور ها نصب کنیم. در این شرایط Configuration Manager ها به ما کمک میکنند.

ابزار Ansible چیست؟

انسیبل یک ابزار Open Source هست که به منظور پیاده سازی IaC با استفاده از ارتباط ssh به سرور های مورد نظر (inventory) متصل شده و فرایند هایی که به صورت کد در امده (مانند: نصب نرمافزار یا سرویس ، استقرار نرمافزار و یا تنظیم سرویس یا نرمافزار …)را به ترتیب اجرا میکند. این ابزار نیازی به سرور اضافه یا daemon و یا سرویس دیگری ندارد.
انسیبل با واحدی به نام Ansible playbook کار میکند. Ansible playbook یک فایل yml هست که در این فایل تمام دستورات به صورت plugin تعریف میشود. برای مثال اگر شما نیاز داشته باشید تا nano را بر روی Ubuntu نصب کنید باید از پلاگین apt برای این کار استفاده کنید که هر plugin یک سری پارامتر ها را به عنوان ورودی از شما میگیرد. پس playbook ما برای نصب nano میتواند به این شکل باشد:

file: main.yml
- hosts: all
  become: yes
  gather_facts: yes
  tasks:
    - name: install nano
      apt:
        name: nano
        state: present

در yaml فایل هایی که با ansible playbook اجرا میکنیم، پارامتر root به صورت ارایه هست پس ما میتوانیم بر روی یک فایل yaml بیشتر از یک playbook داشته باشیم. پس هر playbook با یک “-” شروع میشود.
هر playbook شامل برخی پارامتر های اجباری و برخی پارامتر های اختیاری هست که ما در این مثال فقط پارامتر های اجباری را توضیح خواهیم داد.

پارامتر hosts:

در بخش های قبلی گفتیم که انسیبل میتواند دستورات را همزمان بر روی چندین سرور اجرا کند. موقع تعریف سرور ها (inventory) سرور ها دسته بندی میشوند. مثلا اگر شما یک نود manager دارید و چند نود worker، میتوانید این سرور ها را از هم دیگر جدا کنید. مثال زیر را ببینید:

file: inventory
[managers]
manager ansible_host=192.168.1.1
[worker]
worker1 ansible_host=192.168.1.2
worker2 ansible_host=192.168.1.3

پارامتر become:

درصورتی که دستورات شما باید در حالت root اجرا شوند یا به اصطلاح باید با sudo اجرا شوند مقدار این پارامتر را با true مقدار دهی میکنیم.

پارامتر gather_facts:

انسیبل قبل از این که دستورات را اجرا کند یک سری واقعیت ها ( facts ) از هاست ها استخراج میکند مثلا سرور چه مقدار رم و cpu و هارد و … دارد و یا شبکه چگونه تنظیم شده و یا از چه سیستم عاملی درحال استفاده است و … و شما میتوانید در اجرای playbook برای ایجاد شرط و یا تنظیم برخی موارد از این اطلاعات استفاده کنید. در صورتی که به این اطلاعات نیاز دارید مقدار این پارامتر را با true و در غیر این صورت false مقدار دهی کنید. ( خاموش بودن این فیچر به سرعت اجرای playbook تاثیر گزار است).

پارامتر tasks:

این پارامتر شامل ارایه ای از task ها هست در انسیبل از task به عنوان واحد اجرایی یک دستور یاد میشود.

واحد Task چیست؟

در انسیبل از task برای اجرای یک دستور به کار میرود برای مثال برای نصب یک نرمافزار با استفاده از apt ما باید یک task داشته باشیم تا از plugin apt برای نصب سرویس و یا نرمافزار مورد نظر استفاده کند.
هر تسک به این شکل تعریف میشود:

- name: <task name>
  <plugin>:
         <plugin parameters>

پس در مثال بالا ما یک تسک با نام install nano ساختیم که از plugin apt برای نصب پکیجی به نام nano استفاده میکند. برای اطلاع از همه پارامتر های هر پلاگین به داکیومنتیشن انسیبل مراجعه کنید.

اجرای Playbook:

برای اجرای هر playbook بعد از نصب ansible بر روی سیستم خود از دستور زیر استفاده میکنیم:

ansible-playbook -i inventory main.yml

avatar
Pouya Dustdar

عاشق برنامه نویسی و مهندسی DevOps. تقریبا 8 ساله که برنامه نویسی میکنم و حدود 2 سال هم هست که به حوزه زیر ساخت و DevOps شدیدا علاقه مند شدم :)