آشنایی با ansible و ansible-role
در این آموزش به صورت مختصر به معرفی انسیبل و نحوه ی نصب آن بر روی ویندوز خواهم پرداخت. اگر بخواهم یک تعریف ساده داشته باشم در واقع انسیبل یک ابزار تنظیم خودکار و اتوماسیون زیرساختی است که بر پایه ی پایتون نوشته شده و از پایتون استفاده می کند. انسیبل از SSH برای برقراری ارتباط بین ابزارهای شبکه استفاده می کند و نیازی به نصب Agent بر روی کلاینت ندارد ، همچنین انسیبل از Playbook ها برای انجام کار اتوماسیون بهره می برد.
Playbook ها از YAML ( یک زبان سریال سازی داده هاست ) استفاده می کنند.
نقش انسیبل در شبکه
انسیبل ابزاری قابل اطمینان و سازگار که مقیاس پذیری را در زیرساخت شبکه ی شما فراهم می کند و می توانید پیکربندی های پایگاه داده ، ذخیره سازی ، مجازی سازی ، فایروال ها و دیگر ابزارهای شبکه را با استفاده از انسیبل خودکار کنید.
برخی از ویژگی های مهم انسیبل
Agentless : این بدان معناست که هیچ نوع نرم افزار یا عامل دیگری جهت کار با سیستم کلاینت ها نیاز نمی باشد.
SSH : استفاده از پروتکل احراز هویت شبکه بدون رمز عبور که بسیار ساده و امن است که از طریق یک کلید انجام می شود.
پایتون : انسیبل بر پایه ی پایتون ساخته شده است که در حال حاضر یکی از زبان های قدرتمند و سریع برنامه نویسی در دنیای امروزیست.
معماری ساده : تنها کاری که باید انجام دهید این است که تنظیمات (Playbook) را بنویسید و با اجرا کردن آن تغییرات به هزاران سرور در چند دقیقه اعمال می گردد. انسیبل به ما کمک میکند به صورت خودکار تنظیمات و استقرار نرم افزارها و مدیریت عمومی زیرساخت های شبکه ای مد نظر خود را پیاده سازی کنیم.
انسیبل در ابتدا بر روی لینوکس توزیع گردید. با این حال با توجه به دیدگاه جدید مایکروسافت در مورد منابع آزاد ، پیشرفت های جامعه و پذیرش آن ها از روش توسعه نرم افزاری با چابک تر شدن پشتیبانی ویندوز به این سیستم عامل هم راه پیدا کرد.
نکته : جهت بهره برداری بهتر توصیه میشود که بر روی سیستم عامل لینوکس نصب گردد.
Ansible چگونه کار میکند ؟
Ansibleاز دو بخش تشکیل شده است :
Control Machine
- Node
تمامی 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 :
Ansible از کامپوننت های زیر تشکیل شده است :
Inventories
Modules
Variables
Facts
Playbooks and plays
Configuration Files
Templates
Handlers
Roles
Ansible Vault
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 نصب ، حذف و یا به روز رسانی نمود.تا کنون برای Ansible بیش از 700 ماژول تولید شده است.با منتشر شدن ورژن جدیدی از Ansible حداقل 20 ماژول و یا بیشتر هم منتشرخواهد شد.
Variables :
با تعریف متغییر در Ansible میتوان برخی روندها از جمله روند اجرا را سفارشی نمود.
Facts :
توسط Ansible Facts میتوان اطلاعاتی اعم از نوع سیستم عامل ، IP Address ، مشخصات CPU ، میزان RAM و غیره را از هاست ها دریافت نمود.
Playbooks and plays :
Playbooks دستورالعمل هایی است که توسط آن میتوان نحوه مدیریت هاست ها را مشخص نمود.
Playbooks از زبان YAML که یک زبان پیکربندی ساده هست برای ساختار دستورالعمل های خود استفاده می نماید.
یک Play یک Task در Playbooks هست که بصورت Standalone توسط playbooks اجرا میشوند.
مثالی از playbooks و ساختار زبان YAML :
---
- name: This is a test
hosts: centos
remote_user: ansible
become: yes
become_method: sudo
connection: ssh
tasks:
- name: install apache on centos
yum:
name: httpd
state: latest
…
Configuration Files :
مسیر پیش فرض فایل کانفیگ Ansible در مسیر etc/ansible/ansible.cfg/ هست که میتوان مسیر دیگری نیز مشخص نمود.Playbooks در زمان اجرای کانفیگ های Ansible را از این فایل دریافت می نماید.
Templates :
Template یک ماژول در Ansible می باشد که به شما اجازه میدهد فایلی با متغییرهای مورد نیاز با پسوند .j2 ایجاد و در زمان اجرای این ماژول آن را جایگزین فایل کانفیگ سرویسی و یا فایل مورد نظر خود نمایید.فایل با پسوند .j2 یک فایل text ساده هست که محتوای آن میتواند کانفیگ سرویسی و یا محتوایی که ما مشخص می نماییم باشد.تمپلیت ها توسط زبان تمپلیتی jinja2 پردازش میشوند.
Handlers :
Handlers یک Task درون Playbooks می باشد که توسط آن میتوانیم Error ها را Handle نماییم.
Roles :
یک Roles یک Playbooks هست که از یک یا چندین Playbooks تشکیل شده است و توسط Playbooks های یک role میتوانیم عملیاتی را بر روی هاست ها انجام دهیم.به عنوان مثال میتوانیم role را برای نصب آپاچی ایجاد نماییم و هر زمان که نیاز به نصب آپاچی داریم این role را در Playbooks فراخوانی کنیم تا سرویس آپاچی برای ما نصب شود.ما میتوانیم Role ها را بصورت دستی و یا توسط مخزن Ansible Galaxy نصب و ایجاد نماییم.
Ansible Vault :
توسط Ansible Vault میتوانیم فایل های حساس به عنوان مثال فایل های حاوی پسورد را رمزگذاری و هر زمان هم که نیاز بود آنها را رمزگشایی نماییم.در کل Ansible Vault ابزاری برای رمزگذاری و نگهداری از فایل های حساس در سیستم می باشد.
Ansible به دو روش اجرا میشود :
- Ad-hoc command
- Playbooks
Ad-Hoc command :
در این روش میتوان از دستور ansible به همراه ماژول های آن استفاده نمود به عنوان مثال :
Ansible all -s –m yum –a “name=httpd state=latest"
در مثال بالا با استفاده از دستور Ansible و ماژول yum پکیج آپاچی را بر روی تمامی هاست های مشخص شده در فایل hosts نصب خواهد کرد.
Playbooks :
در این روش میبایست فایلی را با پسوند yaml. و یا .yml ایجاد و درون آن هم از ساختار زبان YAML که یک زبان پیکربندی ساده هست استفاده نمود.همچنین درون این فایل میتوان به هر تعداد ماژول که نیاز هست استفاده نمود.در روش Ad-Hoc در هر بار اجرا میتوان یک ماژول رو اجرا نمود اما در روش playbooks همانطور که عنوان شد میتوان به هر تعداد ماژول که نیاز هست استفاده نمود.در روش playbooks همچنین میتوان مدیریت و کنترلی را بر روی اجرای ماژول ها داشته باشیم.از دستور زیر هم برای اجرای playbook استفاده می کنیم :
Ansible-playbook test.yaml
مقدمه ای بر ansible role
هرچه تعداد و تنوع سیستم ها بیشتر شود.مدیریت و کنترل node ها در ansible پیچیده تر می شود. اگر با ansible آشنا باشید منطقی است که باید task ها را با هم در playbook انسیبل تعریف کنیم. با استفاده از playbook ، دیگر نیازی به اجرای بسیاری از کارهای جداگانه روی سیستم های از راه دور نیست ، در عوض به شما امکان می دهد تمام محیط ها را همزمان با یک فایل پیکربندی کنید.
با این حال ، playbook ها هم میتوانند به مرور پیچیده و سخت شوند هنگامی که سیستم های متفاوت با task های مختلف تعریف شوند، بنابراین Ansible به شما این امکان را می دهد وظایف را در یک ساختار دایرکتوری به نام Role سازماندهی کنید. در این پیکربندی ، playbook ها به جای وظایف ، role ها را فراخوانی می کنند ، بنابراین می توانید وظایف را با هم گروه بندی کنید و سپس از role ها در سایر playbook ها دوباره استفاده کنید. role ها همچنین به شما امکان می دهند الگوها ، پرونده های ثابت و متغیرها را به همراه وظایف خود در یک قالب جمع آوری کنید.
بگذارید این را با یک مثال توضیح دهم. فرض کنید شما می خواهید playbook ای را ایجاد کنید که 10 وظیفه مختلف را بر روی 5 سیستم مختلف انجام دهد ، آیا برای این کار از یک playbook استفاده می کنید؟ خیر ، استفاده از یک playbook گیج کننده و مستعد اشتباه است. در عوض ، می توانید 10 نقش مختلف ایجاد کنید ، جایی که هر نقش یک وظیفه را انجام دهد. سپس ، تنها کاری که شما باید انجام دهید این است که نام نقش را در داخل playbook ذکر کنید تا آنها را فراخوانی کنید.
قابلیت استفاده مجدد از ansible role :
ansible role ها مستقل از یکدیگر می باشند و اجرای هر role وابسته به دیگر role ها نمی باشد لذا شما می توانید طبق خواسته و نیاز تان role ها را هر زمان تغییر و شخصی سازی کنید. این کار وظیفه ما را برای نوشتن مجدد یک بخش کامل از کد که هر بار به آن نیاز داریم کاهش می دهد ، در نتیجه کار ما ساده تر می شود. برای مثال شما برای تنظیم LAMP stack باید یک playbook بنویسید و 4 نقش ایجاد کنید اگر playbook دیگری برای تنظیم LAMP stack و همچنین نصب وردپرس بخواهید ، آیا دوباره role های جدیدی برای LAMP stack و WordPress ایجاد خواهید کرد؟ نه شما می توانید به سادگی از role های قدیمی (که برای LAMP stack ایجاد کردید) دوباره استفاده کنید و علاوه بر این role جدیدی را برای وردپرس ایجاد می کنید.
ساختار دایرکتوری role ها :
Ansible ویژگی به نام Ansible Galaxy را فراهم می کند که به شما کمک می کن تا با نقش ها بازی کنید. اگر ansible را نصب دارید به مسیر /etc/ansible بروید سپس وارد پوشه roles می شوید و اگر نبود آنرا ایجاد می کنید سپس برای ایجاد یک role جدید دستور زیر را می زنیم:
sudo ansible-galaxy init
شما می توانید role های دیگری نیز در همین دایرکتوری ایجاد کنید. حال با دستور tree دایرکتوری هایی که ایجاد شده است می توانیم مشاهده کنیم که در ادامه به آنها می پردازیم.
Task:
شامل کلیه وظایفی است که قرار است توسط role ها اجرا شوند بدین معنی که تمام task های خودمان را در این مسیر تعریف می کنیم.
Handlers:
شامل کاربرانی است که ممکن است توسط role جاری یا در هر جای دیگر از role جاری استفاده شود.
Defaults:
شامل متغیرهای پیش فرضی است که قرار است توسط این role استفاده شود.
Vars:
این دایرکتوری شامل متغیرهای دیگری است که قرار است توسط این role استفاده شوند. این متغیرها را می توان در playbook نیز تعریف کرد ، اما تعریف آنها در این بخش بهتر است.
Files:
شامل کلیه فایل هایی است که می خواهید توسط این role ایجاد شوند. این شامل فایل هایی است که هنگام پیکربندی role باید به میزبانان ارسال شود.
Meta:
metadate ها را برای این role تعریف می کند. اساساً ، فایل هایی است که وابستگی های role را ایجاد می کنند.
دقت داشته باشید که هر دایرکتوری باید از یک فایل main.yml تشکیل شود که در آن کد واقعی برای آن نقش خاص نوشته شده است.
بیاید برای درک بهتر role ها در ansible با هم سناریویی را پیاده سازی کنیم.
نصب MEAN Stack با ansible role
برای پیاده سازی این سناریو نیاز به ایجاد سه role داریم.
1.نصب پیش نیاز ها
۲.نصب MongoDB
3.نصب NodeJS
قدم اول:
به مسیر /etc/ansible/roles/ می رویم و دستورات زیر را می زنیم:
cd /etc/ansible/roles
sudo ansible-galaxy init prerequisites
sudo ansible-galaxy init mongodb
sudo ansible-galaxy init nodejs
خب پس از زدن دستورات بالا سه پوشه در دایرکتوری role ایجاد خواهد شد.
قدم دوم:
نصب git برای role prerequisites با نوشتن در فایل /tasks/main.yml/
cat prerequisites/tasks/main.yml
---
- name: Install git
apt:
name: git
state: present
update_cache: yes
قدم سوم:
دستورات زیر را در فایل main.yml برای MongoDB role اضافه می کنیم.
cat /mongodb/tasks/main.yml
---
- name: MongoDB - Import public key
apt_key:
keyserver: hkp://keyserver.ubuntu.com:80
id: EA312927
- name: MongoDB - Add repository
apt_repository:
filename: '/etc/apt/sources.list.d/mongodb-org-3.2.list'
repo: 'deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse'
state: present
update_cache: yes
- name: MongoDB - Install MongoDB
apt:
name: mongodb-org
state: present
update_cache: yes
- name: Start mongod
shell: "mongod &"
قدم چهارم:
دستورات زیر را در فایل main.yml برای nodjs role اضافه می کنیم.
cat nodejs/tasks/main.yml
---
- name: Node.js - Get script
get_url:
url: "http://deb.nodesource.com/setup_6.x"
dest: "{{ var_node }}/nodejs.sh"
- name: Node.js - Set execution permission to script
file:
path: "{{ var_node }}/nodejs.sh"
mode: "u+x"
- name: Node.js - Execute installation script
shell: "{{ var_node }}/nodejs.sh"
- name: Node.js - Remove installation script
file:
path: "{{ var_node}}/nodejs.sh"
state: absent
- name: Node.js - Install Node.js
apt: name={{ item }} state=present update_cache=yes
with_items:
- build-essential
- nodejs
- name: Node.js - Install bower and gulp globally
npm: name={{ item }} state=present global=yes
with_items:
- bower
- gulp
قدم پنجم:
خب پس از تکمیل شدن مراحل بالا نیاز داریم یک playbook ایجاد کنیم و role هارا در آن فراخوانی کنیم. پس به مسیر /etc/ansible/ می رویم و فایلی تحت عنوان playbook.yml ایجاد می کنیم و محتویات زیر را وارد می کنیم.
---
- hosts: nodes
remote_user: ansible
become: yes
become_method: sudo
vars:
#variable needed during node installation
var_node: /tmp
roles:
- prerequisites
- mongodb
- nodejs
پس از تکمیل مراحل بالا برای deploy کردن آنها نیاز داریم که playbook خودمان را برای سرور هایی که در inventory تعریف کریم اجرا کنیم. با استفاده از دستور زیر playbook خودمان را run می کنیم.
sudo ansible-playbook /etc/ansible/playbook.yml -K
همانطور که می بینید ، همه task ها اجرا شده و وضعیت آنها تغییر کرده است. این بدان معناست که تغییرات playbook روی سرور و همچنین میزبان اعمال شده است. نصب MEAN Stack فقط یک مثال بود. شما می توانید با استفاده از ansible role به معنای واقعی کلمه هر چیزی را در هر جایی تنظیم کنید.