انسیبل چیست؟ معرفی کامل و مقدمه ای بر انسیبل

ansible

انسیبل چیست؟ معرفی کامل و مقدمه ای بر انسیبل

انسیبل یک ابزار متن باز است که به منظور مدیریت کانفیگ و توسعه اپلیکیشن های نرم افزاری روی کلاینت ها بدون هیچ وقفه ای و تنها با استفاده ازSSL استفاده می شود این ابزار بر روی لینوکس نصب شده و قادر به آن است که سایر سرورها و کلاینت های لینوکسی را کنترل کند انسیبل بر مبنای پایتون می باشد.

از نرم‌افزارهای مشابه و رقیب آن می توان به Chef , Puppet اشاره کرد اما برخلاف این دو پلتفورم انسیبل نیازی به Agent  بر روی سیستم میزبان ندارد.

وظایف انسیبل شامل مدیریت تنظیمات سیستم عامل و نرم افزارها, تنظیم و هماهنگی Pass در VMWare یا فضاهای ابری ، توسعه نرم افزار و … میشود.

این ابزار به سرعت در حال بالا رفتن در لیست ابزارهای اتوماسیون دنیاست.

مزایای انسیبل

رایگان: این ابزار کد باز (Open Sorce) می‌باشد

راه اندازی و استفاده از آن بسیار ساده است: برای استفاده از playbookهای انسیبل  مهارت خاصی در برنامه نویسی لازم نیست.

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

سادگی در نصب و استفاده: استفاده از این ابزار بسیار ساده و نیاز به مهارت کد نویسی ندارد و در عین حال بسیار قدرتمند است.

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

کارآمد: از آنجایی که نیاز به نصب هیچ گونه نرم‌افزار اضافی ندارد فضای بیشتری برای منابع در سرور وجود دارد.

بدون نیاز به Agent:نیازی به نصب هیچ نرم افزار یا پورت فایروال دیگری بر روی سیستم های کلاینتی که می خواهید خودکار کنید نیست. همچنین لازم نیست یک ساختار مدیریت جداگانه تنظیم کنید.

 

تاریخچه انسیبل

این ابزار در اکتبر ۲۰۱۵ توسط شرکتی با نام Ansible lnc معرفی شده است و یکی از پروژه های زیر نظرRedhat بوده است و در حال حاضر مالکیت و استراتژی‌های کاری آن توسط ردهت پایه ریزی می شود.

هدف اصلی انسیبل

به گفته شرکت Redhat هدف اصلی طراحی و توسعه انسیبل ساده سازی کار با سرور های لینوکسی و همچنین افزایش امنیت و اعتماد پذیری به سرورهای لینوکسی است.

نقش انسیبل در شبکه

این ابزاری است قابل اطمینان و سازگار که مقیاس پذیری را در زیرساخت شبکه شما فراهم می کند و می توانید پیکربندی های پایگاه داده , ذخیره سازی ، مجازی  سازی ،  فایروال و دیگر ابزارهای شبکه را با استفاده از آن خود کار کنید.

آشنایی با مفاهیم Ansible

بیایید با اصلاحات Ansible آشنا شویم تا بتوانیم درک بهتری از آن داشته باشیم

Control Node (گره کنترل)

گره کنترل سرور لینوکسی است که Ansible روی آن نصب شده است و برای مدیریت هاست یا گره های از راه دور استفاده می شود. این سیستم های از راه دور به عنوان هاست (میزبان) مدیریت شده یا گره های مدیریت شده شناخته می شوند

 

Managed Nodes (گره های مدیریت شده)

سیستمهایی که با استفاده از Ansible کنترل می کنید گره های مدیریت شده نامیده می شوند. Ansible نیاز دارد گره های مدیریت شده از طریق SSH قابل دستیابی باشند ، و پایتون 2 (نسخه 2.6 یا بالاتر) یا پایتون 3 (نسخه 3.5 یا بالاتر) نصب شده باشد.

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

control-node

Inventory

Ansible inventory هاست ها و گروههایی از هاست ها را تعریف می کند که دستورات ، ماژول ها و وظایف یک playbook بر روی آنها عمل می کند. بسته به محیط و پلاگین های Ansible شما می توانید این فایل را در یکی از فرمت های مختلف داشته باشید. … فایل inventory می تواند هاست های جداگانه یا گروه هاست های تعریف شده توسط کاربر را لیست کند.

Tasks

در Ansible ، یک Task (کار) ، واحد مجزایی از کار برای اجرای یک گره مدیریت شده است. هر عملی برای انجام به عنوان یک Task تعریف می شود. کارها می توانند به عنوان یک عمل یک طرفه از طریق دستورات ad-hoc اجرا شوند ، یا در یک Playbook به عنوان بخشی از یک اسکریپت اتوماسیون گنجانده شوند.

Playbook

یک Ansible® playbook طرحی از وظایف اتوماسیون است – که اقدامات پیچیده فناوری اطلاعات با دخالت محدود یا بدون دخالت انسان انجام می شود. Ansible playbook بر روي مجموعه ، گروه يا طبقه بندیي از هاست ها اجرا مي شوند كه با هم يك Ansible invetory را تشكيل مي دهند.

Handlers

Handlers (کنترل کننده ها ) دقیقاً مانند وظایف عادی یک  Ansible playbook هستند اما فقط درصورتی که Task حاوی دستورالعمل “اعلان (notify)” باشد ، اجرا می شوند.بیایید مثالی بزنیم ، این برای اقدامات ثانویه که ممکن است پس از اجرای Task مورد نیاز باشد مفید است. مانند نصب یک nginx جدید پس از نصب ، سپس nginx را در دستگاه راه دور خود اجرا کنید.

Ngnix.yml

- name: mukesh
  hosts: WORKSPACE
  tasks:
         - name: Install nginx
           package:
             name: nginx
             state: present
           notify:
                Start nginx
  handlers:
       - name: Start nginx
         service:
           name: nginx
           state: started

 

می توانیم آن را با دستور ansible-playbook اجرا کنیم:

$  ansible-playbook Nginx.yml	

PLAY [mukesh] ********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [18.191.18.209]

TASK [Install nginx] *************************************************************************************************************************
changed: [18.191.18.209]

RUNNING HANDLER [Start nginx] ****************************************************************************************************************
changed: [18.191.18.209]

PLAY RECAP ***********************************************************************************************************************************
18.191.18.209              : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

همچنین می توانیم  کنترل کننده های چندگانه (Multiple handlers) را در یک کار واحد (سینگل تسک) پرچم گذاری کنیم.  در زیر کنترل کننده های چندگانه  پرچم گذاری شده  (Flagged handlers) در یک کار واحد (single task) را به نمایش گذاشته ایم.

Multiple handler.yml

- name: mukesh
  hosts: WORKSPACE
  become: yes
  tasks:
         - name: update everything
           package:
               name: '*'
               state: latestFor example, it is useful for secondary actions that might be required after running a Task, such as installing a new service after installation then run the service or update configuration of service.
               exclude: kernel*
         - name: Copy using inline content
           copy:
               content: "update the file"
               dest: /home/mukesh.txt
               mode: "0777"
           notify:
                - update
                - data
  handlers:
       - name: update
         find:
                paths: /home/
                patterns: '*.txt'
                recurse: yes
         register: new_file
       - name: data
         debug:
            var: new_file.matched

می توانیم آن را با دستور ansible-playbook اجرا کنیم:

$ ansible-playbook Multiple handler.yml

PLAY [mukesh] ********************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************
ok: [18.191.18.209]

TASK [update everything] *********************************************************************************************************************
ok: [18.191.18.209]

TASK [Copy using inline content] *************************************************************************************************************
changed: [18.191.18.209]

RUNNING HANDLER [update] *********************************************************************************************************************
ok: [18.191.18.209]

RUNNING HANDLER [data] ***********************************************************************************************************************
ok: [18.191.18.209] => {
    "new_file.matched": "14"
}Hi readers, In this blog, we will be discussing the use case of Ansible handlers also we will be looking at how multiple handlers work get notified by single task Ansible.



PLAY RECAP ***********************************************************************************************************************************
18.191.18.209              : ok=5    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

می توانید دستگاه از راه دور Nginx را بررسی کنید:

$ service nginx status
nginx (pid  22488) is running...

Roles

role ، مجموعه ای از Playbook و فایل های مرتبط است که به یک ساختار از پیش تعریف شده توسط Ansible سازمان دهی شده است. role ها استفاده مجدد و بازگشت مجدد از Playbook ها را به بسته های قابل تقسیم اتوماسیون دانه ای برای اهداف خاص مانند نصب یک سرور مجازی وب ، نصب یک محیط PHP یا تنظیم سرور مجازی MySQL تسهیل می کند.

 

کامپوننت های Ansible

Ansible از کامپوننت های زیر تشکیل شده است :

  • Inventories

    توسط Inventory فهرستی از سیستم ها و دستگاه هایی که قرار هستند بوسیله Ansible مدیریت شوند را مشخص می نماییم .این سیستم ها و دستگاه ها با عنوان هاست در Inventory شناخته میشوند.Inventory را میتوان به دو صورت Static or Local و Dynamic مشخص نمود.

  • Static or Local

    در این حالت بصورت پیش فرض هاست ها درون فایل etc//ansible//hosts// مشخص میشوند.همچنین میتوان مسیر دیگری برای آن در نظر گرفت.

  • Dynamic 

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

  • Modules

    ansible یک ابزار ماژولار هست و ماژول ها هم یک واحد کاری در Ansible به حساب می آیند.ماژول ها بصورت standalone اجرا میشوند و همچنین میتوان با زبان های bash ، Perl ، Python و یا ruby آنها را ایجاد کرد.ماژول ها هم بصورت Local و هم بصورت Remote اجرا میشوند. به عنوان مثال ماژولی با نام yum هست که توسط آن میتوان پکیجی را در توزیع های rpm base ssنصب ، حذف و یا به روز رسانی نمود.تا کنون برای Ansible بیش از 700 ماژول تولید شده است.با منتشر شدن ورژن جدیدی از Ansible حداقل 20 ماژول و یا بیشتر هم منتشرخواهد شد.

  • Variables

    : با تعریف متغییر در Ansible میتوان برخی روندها از جمله روند اجرا را سفارشی نمود.

  • Facts

    توسط Ansible Facts میتوان اطلاعاتی اعم از نوع سیستم عامل ، IP Address ، مشخصات CPU ، میزان RAM و غیره را از هاست ها دریافت نمود.

  • Playbooks and plays :

    Playbooks دستورالعمل هایی است که توسط آن میتوان نحوه مدیریت هاست ها را مشخص نمود.Playbooks از زبان YAML که یک زبان پیکربندی ساده هست برای ساختار دستورالعمل های خود استفاده می نماید.یک Play یک Task در Playbooks هست که بصورت Standalone توسط playbooks اجرا میشوند.

انسیبل چگونه کار می کند؟

تمامی Node ها توسط یک Control Machine از طریق SSH مدیریت خواهد شد.Ansible یک ابزار ماژولار هست و ماژول ها هم یک واحد کاری در Ansible به حساب می آیند.ماژول ها بصورت  standalone  اجرا میشوند و همچنین میتوان با زبان های bash ، Perl ، Python و یا ruby آنها را ایجاد کرد.تا کنون برای Ansible بیش از 700 ماژول تولید شده است.با منتشر شدن ورژن جدیدی از Ansible  حداقل 20 ماژول و یا بیشتر هم منتشرخواهد شد.برای تنظیم و مدیریت Node ها Ansible ماژول ها را از طریق SSH به Node ها انتقال میدهد.ماژول ها بصورت موقت در Node ها ذخیره شده و از طریق پروتکل JSON با Control Machine با استفاده از خروجی استاندارد ارتباط برقرار میکند.زمانی که Ansible در حال مدیریت Node ها نباشد هیچ برنامه و یا پردازشی بصورت Background اجرا نشده و به همین دلیل منابعی نیز مصرف نخواهد شد.

Ansible-Working-Model

پیش شرط استفاده از Ansible

هر کامپیوتری که توانایی اتصال از طریق SSH به آن را داشته باشید را می توانید از طریق Ansible مدیریت کنید.

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

آموزش کانفیگ ansible

در این آموزش به یک سرور Ubuntu 16.04 با دسترسی کاربر non-root با مجوز sudo و ارتباط SSH نیاز دارید.

1. نصب Ansible

کار با انسیبل به معنی مدیریت سرور های مختلف است که برای این کار باید انسیبل را حداقل بر روی یک سرور مجازی نصب کنید. در اینجا برای نصب برنامه از یک سرور Ubuntu 16.04 استفاده می کنیم. بهترین روش نصب برای انسیبل ، اضافه کردن آن به PPA ( Personal Package System ( که همان منبع مخازن سیستم می باشد ، است. برای اضافه کردن به PPA می توانید از دستور زیر استفاده کنید :

$ sudo apt-add-repository ppa:ansible/ansible

برای تایید پیام های اضافی PPA دکمه Enter را بزنید. در ادامه باید برای سیستم مدیریت بسته های از بسته های جدید مطلع شود آن را مجددا راه اندازی کنیم ، سپس برنامه را نصب کنیم :

$ sudo apt-get update $ sudo apt-get install ansible

همانطور که گفتیم در درجه اول انسیبل از طریق SSH با کامپیوتر کاربر ارتباط برقرار می کند. در حالی که قابلیت مدیریت با سیستم احراز هویت بر اساس رمز عبور را دارد ، از کلید SSH نیز می تواند برای راحتی کار استفاده کند. تا اینجا همه برنامه های مورد نیاز را برای مدیریت سرورهای مان از طریق برنامه انسیبل را داریم.

2. پیکربندی میزبان های Ansible

برنامه Ansible سرور هایی که در فایل hosts تعریف شده اند را بررسی می کند ، پس برای برقراری ارتباط با کامپیوتر های دیگر باید این فایل را تنظیم کنیم. این فایل را با دسترسی root باز کنید :

$ sudo nano /etc/ansible/hosts

در این فایل تنظیمات نمونه زیادی را مشاهده می کنیم که هیچکدام کارایی لازم را برای ما ندارند ، پس برای شروع پیکربندی با قرار دادن # در ابتدای تمام خطوط ، همه این تنظیمات را به حالت توضیح در می آوریم و در آینده برای سناریو های پیچیده می توانیم از این تنظیمات کمک بگیریم. فایل hosts نسبتا قابل انعطاف است و راه های مختلفی برای تنظیم این فایل وجود دارد. روش و قالبی که ما از آن برای پیکربندی استفاده می کنیم به صورت زیر است :

[group_name] alias ansible_ssh_host=your_server_ip

مقدار group_name برای دسته بندی سرور هاست که باید از یک کلمه استفاده کنید، مقدار alias نیز فقط یک نام است که به سرور اشاره می کند.

در سناریو ها فرض بر این است که سه سرور قرار است که بوسیله Ansible کنترل شوند. این سرور های باید با دستور زیر از سرور Ansible در دسترس باشند :

$ ssh root@your_server_ip

اگر تنظیمات را به درستی انجام داده باشید نباید پیغام رمز عبور را مشاهده کنید و این به این معنی است که باید کلید SSH سرور را به درستی تنظیم کرده باشید. آدرس های IP که به سرور ها اختصاص دادیم 192.0.2.1 ، 192.0.2.2 و 192.0.2.3 می باشند و نام های host1 ، host2 و host3 را با نام گروه servers به آنها اختصاص داده ایم.

تنظیمات هاست

برای انجام این کار باید بلاک زیر را به فایل hosts اضافه کنید :

[servers] host1 ansible_ssh_host=192.0.2.1 host2 ansible_ssh_host=192.0.2.2 host3 ansible_ssh_host=192.0.2.3

هاست ها می توانند در گروه های متفاوتی باشند و هر گروه می تواند تنظیمات جداگانه ای برای اعضای خودش داشته باشد. بعدا این مسئله را امتحان کنید. با تنظیماتی که تا الان انجام شده اگر بخواهیم از طریق انسیبل به سرور های هاست ها متصل شویم با خطا مواجه خواهیم شد ( با فرض اینکه کاربر root نباشید ). به این دلیل که کلید SSH برای کاربر root تعریف شده است و انسیبل به صورت پیش فرض برای اتصال از کاربر فعلی شما استفاده می کند. اگر اقدام به اتصال کنید خطای زیر را مشاهده خواهید کرد :

Ansible connection error host1 | UNREACHABLE! => { changed: false, msg: Failed to connect to the host via ssh., unreachable: true

}

سرور انسبیل

در سرور Ansible از کاربری به نام demo استفاده می کنیم و Ansible تلاش می کند که با این دستور به همه سرور ها متصل شود ssh demo@server ، و اگر این کاربر بر روی سیستم راه دور تعریف نشده باشد ، این دستور کار نمی کند. برای رفع مشکل یک فایل ایجاد می کنیم تا همه سرور های عضو گروه server با کاربر root متصل شوند. برای این کار یک دایرکتوری در ساختار پیکربندی انسیبل با نام group_vars ایجاد می کنیم. در این پوشه برای هر گروهی که می خواهیم تنظیم کنیم یک فایل با فرمت استاندارد YAML ایجاد می کنیم :

$ sudo mkdir /etc/ansible/group_vars $ sudo nano /etc/ansible/group_vars/servers

تنظیمات را در این فایل قرار می دهیم. فایل های YAML با — شروع می شوند ، پس فراموش نکنید که در ابتدای فایل آن را اضافه کنید :

/etc/ansible/group_vars/servers — ansible_ssh_user: root

در انتها فایل را ذخیره کرده و خارج شوید. اگر میخواهید تنظیمات خاصی را برای همه سرور های بدون در نظر گرفتن گروه آنها انجام دهید ، این تنظیمات را در فایل etc/ansible/group_vars/all/ قرار دهید. برای اعمال تنظیمات خاص برای هاست های نیز می توانید در مسیر etc/ansible/host_vars/ فایل های پیکربندی را ایجاد کنید.

3.دستورات ساده Ansible

تا اینجا سرور های هاست ها را تنظیم کردیم و پیکربندی کافی برای اتصال به سرور های هاست ها را انجام دادیم و اکنون می توانیم دستورات اولیه را اجرا کنیم. از سرور هایی که تنظیم کردیم با دستور زیر ping می گیریم :

$ ansible -m ping all

Ping output host1 | SUCCESS => { changed: false, ping: pong }

host3 | SUCCESS => { changed: false, ping: pong }

host2 | SUCCESS => { changed: false, ping: pong }

این یک تست ساده برای بررسی اتصال انسیبل با سرور های هاست های تعریف شده بود. در اینجا کلمه all برای همه هاست استفاده می شود ، اگر می خواهید که از گروه خاصی تست ping بگیرید از دستور زیر استفاده کنید :

$ ansible -m ping servers

همچنین می توانید یک هاست خاص را تعیین کنید :

$ ansible -m ping host1

همچنین چند هاست خاص که آنها را با کولون : از یکدیگر جدا می کنیم :

$ ansible -m ping host1:host2

ماژول پینگ

مقدار m ping- در دستور گفته شده برای استفاده از ماژول ping در ساختار Ansible است. این ها دستورات پایه ای هستند که می توانید بر روی سرور ها هاست ها از راه دور اجرا کنید. ماژول ping در بیشتر موارد مانند ابزار ping لینوکس عمل می کند ولی در Ansible ارتباطات را بررسی می کند.

ماژول ping هیچ آرگومانی را نمی گیرد ولی می توانیم دستور دیگری را امتحان کنیم تا از صحت عملکرد آن مطمئن شویم. می توانیم آرگومان a- را ارسال کنیم. ماژول shell این امکان را برای ما فراهم می کند که دستورات خط فرمان را از راه دور بر روی سرور های هاست ها اجرا کنید و نتیجه را دریافت کنیم. برای مثال از دستور زیر برای پیدا کردن مقدار فضای استفاده شده حافظه رم از سرور host1 استفاده می کنیم :

$ ansible -m shell -a ‘free -m’ host1

Shell output host1 | SUCCESS | rc=0 >> total used free shared buffers cached Mem: 3954 227 3726 0 14 93 -/+ buffers/cache: 119 3834 Swap: 0 0 0

 

 

 

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *