در مقاله قبل از این سری آموزش های Ansible، ما توضیح دادیم که Ansible یک ابزار بدون نیاز به Agent میباشد که برای شما امکان مدیریت سریع و موثر چندین سیستم (همچنین با عنوان node هم شناخته میشود و قصد توسعه روی آنها را داریم) را از یک سیستم مجزا فراهم می آورد.
بعد از نصب نرم افزار در ماشین کنترل کننده و ایجاد key ها به منظور ssh کردن بدون وارد کردن پسورد و کپی آنها در node ها (کلاینت ها) اکنون زمان آموزش نحوه بهینه سازی مرحله مدیریت این چنین سیستم های ریموتی با استفاده از Ansible رسیده است.
محیط آزمایشی Ansible
در طول این مقاله و همچنین مقاله بعدی، ما از محیط آزمایشی زیر استفاده خواهیم کرد. تمامی هاست ها سیستم عامل CentOS 7 میباشند.
علاوه براین لطفا دقت کنید که هر 2 عدد node در بخش webserver از فایل /etc/ansible/hosts اضافه شده باشند.
معرفی Playbook های Ansible
همانطور که در آموزش قبلی توضیح داده شد شما میتوانید از ابزار ansible به منظور اجرا کردن دستورات در node های ریموت همانند زیر استفاده کنید.
در مثال بالا ما دستور hostnamectl —static را روی node1 و node2 اجرا کردیم. برای هر کس واضح و روشن است که این روش از اجرا کردن تسک ها روی کامپیوترهای ریموت برای دستورات کوتاه به خوبی کار میکند، اما برای تسک های پیچیده تر که نیاز به پارامترهای کانفیگی ساختاری اضافه یا تعامل با سایر سرویس ها دارند این روش دردسر ساز و مشکل خواهد بود.
به طور مثال نصب و کانفیگ WordPress روی چندین هاست - که ما در مقاله بعدی آنرا پوشش خواهیم داد. در این چنین شرایطی Playbook ها به صحنه خواهند آمد.
Playbook ها در حقیقت فایل های متنی ساده که به فرمت YAML نوشته شده اند میباشند و شامل لیستی از آیتم ها با یک جفت key/value یا بیشتر میباشند (همچنین با عنوان یک hash یا یک dictionary شناخته میشوند).
درون هر Playbook شما یک یا چندین گروه از هاست ها را پیدا خواهید کرد (هر کدام از این گروه ها همچنین یک Play نیز نامیده میشوند) که تسک های مورد نظر در آنها اجرا میشوند.
یک مثال از داکیومنت های رسمی به ما کمک میکند که موارد زیر را نشان دهیم :
1 - Host ها :
لیستی از ماشین ها (با توجه به /etc/ansible/hosts) که تسک های زیر در آنها اجرا خواهند شد.
2 - remote_user :
اکانت ریموتی که برای اجرا شدن تسک ها مورد استفاده قرار خواهد گرفت.
3 - vars :
متغییرهایی که برای تغییر رفتار سیستم های ریموت مورد استفاده قرار میگیرند.
4 - task ها به ترتیبی که تعریف شده اند و برای تمام ماشین هایی که با Hosts یکی باشد اجرا میشوند. درون یک play، تمامی Host ها در حقیقت Directive یکسانی برای تعریف task خواهند داشت.
اگر شما نیاز به اجرا کردن مجموعه ای متفاوت از task های مربوطه برای یک host خاص دارید، در Playbook جاری یک play دیگر را ایجاد کنید (به عبارت دیگر هدف یک play ترسیم مجموعه ای خاص از هاست ها، برای تسک های تعریف شده میباشد).
در این مورد، یک play جدید را با اضافه کردن دایرکتیو hosts در پایین فایل آغاز میکنیم.
5 - handler ها در حقیقت اکشن هایی هستند که در پایان بخش تسک ها در هر play نوشته می شوند و غالبا برای restart کردن سرویس ها و یا اعمال reboot در سیستم های ریموت استفاده می شوند.
فایلی به نام apache.yml درون آن با محتوای زیر اضافه کنید.
سپس دایرکتوری /static_files را در مسیر دایرکتوری "/" ایجاد کنید.
که در آن فایل index.html خودمان را با محتوای زیر ذخیره خواهیم کرد.
اکنون زمان استفاده از این playbook به منظور اجرا کردن تسک هایی که قبلا به آن اشاره شد میباشد. شما متوجه خواهید شد که ansible به هر تسک به صورت همزمان و با استفاده از هاست خواهد پرداخت و وضعیت تسک ها را گزارش خواهد کرد.
اکنون ببینیم اگر یک مرورگر را باز کنیم و ip آدرس 192.168.10.240 و 192.168.10.248 را در آن وارد کنیم چه اتفاقی خواهد افتاد :
یک مرحله جلوتر میرویم و به صورت دستی apache را روی node1 و node2 متوقف و غیرفعال میکنیم.
سپس مجدد دستور زیر را اجرا میکنیم.
این بار تسک گزارش میدهد که وب سرور آپاچی روی هر هاست start و enable شده است.
لطفا مثال بالا را به عنوان نگاه سریعی روی قدرت ansible در نظر بگیرید. در حالیکه موارد مطرح شده هنگامی که روی تعداد کمی از سرورها اجرا شوند، نسبتا تسک های آسانی هستند. اگر شما نیاز به انجام تسک های یکسان روی سرورهای بیشماری (شاید 100 ها سرور) داشته باشید این امر بسیار خسته کننده و وقت گیر خواهد شد.
خلاصه
در این پست ما نحوه اجرا کردن دستورات و پیاده سازی تسک های پیچیده روی چندین هاست ریموت به صورت همزمان و با استفاده از ansible را شرح دادیم. داکیومنت رسمی و ریپازیتوری GitHub مثال ها و راهنماهای زیادی روی نحوه استفاده از ansible (برای دستیابی به اکثر تسک های قابل تصور) فراهم آورده اند.
همچنین توصیه میشود مطالعه کنید : آموزش اتوماتیک کردن Task ها در هاست های لینوکسی با استفاده از Shell Script
شنیدن نظرات سوالات و پیشنهادات ارزشمند شما باعث دلگرمی و خوشحالی ماست.
بعد از نصب نرم افزار در ماشین کنترل کننده و ایجاد key ها به منظور ssh کردن بدون وارد کردن پسورد و کپی آنها در node ها (کلاینت ها) اکنون زمان آموزش نحوه بهینه سازی مرحله مدیریت این چنین سیستم های ریموتی با استفاده از Ansible رسیده است.
محیط آزمایشی Ansible
در طول این مقاله و همچنین مقاله بعدی، ما از محیط آزمایشی زیر استفاده خواهیم کرد. تمامی هاست ها سیستم عامل CentOS 7 میباشند.
کد PHP:
Controller machine (where Ansible is installed): 192.168.10.230
Node1: 192.168.10.240
Node2: 192.168.10.248
علاوه براین لطفا دقت کنید که هر 2 عدد node در بخش webserver از فایل /etc/ansible/hosts اضافه شده باشند.
معرفی Playbook های Ansible
همانطور که در آموزش قبلی توضیح داده شد شما میتوانید از ابزار ansible به منظور اجرا کردن دستورات در node های ریموت همانند زیر استفاده کنید.
کد PHP:
# ansible -a "/bin/hostnamectl --static" webservers
در مثال بالا ما دستور hostnamectl —static را روی node1 و node2 اجرا کردیم. برای هر کس واضح و روشن است که این روش از اجرا کردن تسک ها روی کامپیوترهای ریموت برای دستورات کوتاه به خوبی کار میکند، اما برای تسک های پیچیده تر که نیاز به پارامترهای کانفیگی ساختاری اضافه یا تعامل با سایر سرویس ها دارند این روش دردسر ساز و مشکل خواهد بود.
به طور مثال نصب و کانفیگ WordPress روی چندین هاست - که ما در مقاله بعدی آنرا پوشش خواهیم داد. در این چنین شرایطی Playbook ها به صحنه خواهند آمد.
Playbook ها در حقیقت فایل های متنی ساده که به فرمت YAML نوشته شده اند میباشند و شامل لیستی از آیتم ها با یک جفت key/value یا بیشتر میباشند (همچنین با عنوان یک hash یا یک dictionary شناخته میشوند).
درون هر Playbook شما یک یا چندین گروه از هاست ها را پیدا خواهید کرد (هر کدام از این گروه ها همچنین یک Play نیز نامیده میشوند) که تسک های مورد نظر در آنها اجرا میشوند.
یک مثال از داکیومنت های رسمی به ما کمک میکند که موارد زیر را نشان دهیم :
1 - Host ها :
لیستی از ماشین ها (با توجه به /etc/ansible/hosts) که تسک های زیر در آنها اجرا خواهند شد.
2 - remote_user :
اکانت ریموتی که برای اجرا شدن تسک ها مورد استفاده قرار خواهد گرفت.
3 - vars :
متغییرهایی که برای تغییر رفتار سیستم های ریموت مورد استفاده قرار میگیرند.
4 - task ها به ترتیبی که تعریف شده اند و برای تمام ماشین هایی که با Hosts یکی باشد اجرا میشوند. درون یک play، تمامی Host ها در حقیقت Directive یکسانی برای تعریف task خواهند داشت.
اگر شما نیاز به اجرا کردن مجموعه ای متفاوت از task های مربوطه برای یک host خاص دارید، در Playbook جاری یک play دیگر را ایجاد کنید (به عبارت دیگر هدف یک play ترسیم مجموعه ای خاص از هاست ها، برای تسک های تعریف شده میباشد).
در این مورد، یک play جدید را با اضافه کردن دایرکتیو hosts در پایین فایل آغاز میکنیم.
کد PHP:
---
- hosts: webservers
remote_user: root
vars:
variable1: value1
variable2: value2
remote_user: root
tasks:
- name: description for task1
task1: parameter1=value_for_parameter1 parameter2=value_for_parameter2
- name: description for task1
task2: parameter1=value_for_parameter1 parameter2=value_for_parameter2
handlers:
- name: description for handler 1
service: name=name_of_service state=service_status
- hosts: dbservers
remote_user: root
vars:
variable1: value1
variable2: value2
…
5 - handler ها در حقیقت اکشن هایی هستند که در پایان بخش تسک ها در هر play نوشته می شوند و غالبا برای restart کردن سرویس ها و یا اعمال reboot در سیستم های ریموت استفاده می شوند.
کد PHP:
# mkdir /etc/ansible/playbooks
فایلی به نام apache.yml درون آن با محتوای زیر اضافه کنید.
کد PHP:
---
- hosts: webservers
vars:
http_port: 80
max_clients: 200
remote_user: root
tasks:
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: replace default index.html file
copy: src=/static_files/index.html dest=/var/www/html/ mode=0644
notify:
- restart apache
- name: ensure apache is running (and enable it at boot)
service: name=httpd state=started enabled=yes
handlers:
- name: restart apache
service: name=httpd state=restarted
کد PHP:
# mkdir /static_files
کد PHP:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
</script>
</head>
<body>
<h1>Apache was started in this host via Ansible</h1><br>
<h2>Brought to you by linux-zone.org/forums</h2>
</body>
</html>
اکنون زمان استفاده از این playbook به منظور اجرا کردن تسک هایی که قبلا به آن اشاره شد میباشد. شما متوجه خواهید شد که ansible به هر تسک به صورت همزمان و با استفاده از هاست خواهد پرداخت و وضعیت تسک ها را گزارش خواهد کرد.
کد PHP:
# ansible-playbook /etc/ansible/playbooks/apache.yml
اکنون ببینیم اگر یک مرورگر را باز کنیم و ip آدرس 192.168.10.240 و 192.168.10.248 را در آن وارد کنیم چه اتفاقی خواهد افتاد :
یک مرحله جلوتر میرویم و به صورت دستی apache را روی node1 و node2 متوقف و غیرفعال میکنیم.
کد PHP:
# systemctl stop httpd
# systemctl disable httpd
# systemctl is-active httpd
# systemctl is-enabled httpd
سپس مجدد دستور زیر را اجرا میکنیم.
کد PHP:
# ansible-playbook /etc/ansible/playbooks/apache.yml
لطفا مثال بالا را به عنوان نگاه سریعی روی قدرت ansible در نظر بگیرید. در حالیکه موارد مطرح شده هنگامی که روی تعداد کمی از سرورها اجرا شوند، نسبتا تسک های آسانی هستند. اگر شما نیاز به انجام تسک های یکسان روی سرورهای بیشماری (شاید 100 ها سرور) داشته باشید این امر بسیار خسته کننده و وقت گیر خواهد شد.
خلاصه
در این پست ما نحوه اجرا کردن دستورات و پیاده سازی تسک های پیچیده روی چندین هاست ریموت به صورت همزمان و با استفاده از ansible را شرح دادیم. داکیومنت رسمی و ریپازیتوری GitHub مثال ها و راهنماهای زیادی روی نحوه استفاده از ansible (برای دستیابی به اکثر تسک های قابل تصور) فراهم آورده اند.
کد:
https://docs.ansible.com/ansible/index.html
همچنین توصیه میشود مطالعه کنید : آموزش اتوماتیک کردن Task ها در هاست های لینوکسی با استفاده از Shell Script
شنیدن نظرات سوالات و پیشنهادات ارزشمند شما باعث دلگرمی و خوشحالی ماست.