Ansible ابزاری برای مدیریت و پیکربندی سرورها است که برای کنترل و اتوماسیون task ها برای ادمین ها و تیم های عملیاتی طراحی شده است. با Ansible می توانید از یک سرور مرکزی واحد برای کنترل و پیکربندی سیستم های مختلف از راه دور با استفاده از پروتکل SSH استفاده کنید.
مقدمه ای بر 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-name>
شما می توانید 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.نصب پیش نیاز ها
2.نصب 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/
cd prerequisites/tasks/main.yml
---
- name: Install git
apt:
name: git
state: present
update_cache: yes
قدم سوم:
دستورات زیر را در فایل main.yml برای MongoDB role اضافه می کنیم.
cd /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 <a href="http://repo.mongodb.org/apt/ubuntu">http://repo.mongodb.org/apt/ubuntu</a> 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 اضافه می کنیم.
cd nodejs/tasks/main.yml
---
- name: Node.js - Get script
get_url:
url: "<a href="http://deb.nodesource.com/setup_6.x">http://deb.nodesource.com/setup_6.x</a>"
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 به معنای واقعی کلمه هر چیزی را در هر جایی تنظیم کنید.
منابع :