در یک نگاه کلی، handlers ها کارهای ویژهای هستند که تنها زمانی اجرا میشوند که توسط دستور notify فعال شوند. handlersها در انتهای اجرای play، پس از اتمام تمام تسکها، اجرا میشوند.در Ansible، handlers معمولاً برای شروع، بارگذاری مجدد، ریستارت و توقف سرویسها استفاده میشوند. اگر playbook شما شامل تغییر فایلهای پیکربندی باشد، احتمال زیادی وجود دارد که نیاز داشته باشید سرویس مورد نظر را ریستارت کنید تا تغییرات اعمال شوند. در این حالت، باید handlerای برای آن سرویس تعریف کنید و دستور notify را در هر تسکی که به آن handler نیاز دارد، وارد کنید.
در بخش قبلی این سری آموزشی، نحوه استفاده از قالب برای جایگزینی صفحه پیشفرض Nginx با یک صفحه HTML سفارشی را دیدهاید. در عمل، وقتی یک وبسرور Nginx راهاندازی میکنید، احتمالاً فایلهای جدیدی در دایرکتوری sites-available اضافه میکنید، لینکهای نمادین ایجاد میکنید یا تنظیماتی را تغییر میدهید که نیاز به بارگذاری مجدد یا ریستارت سرویس دارند.
در چنین شرایطی، یک handler برای ریستارت سرویس Nginx به شکل زیر خواهد بود:
...
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
برای فعال کردن این handler، باید دستور notify را در هر تسکی که به ریستارت Nginx نیاز دارد، وارد کنید.
playbook زیر، مقدار پیشفرض ریشه سند Nginx را با استفاده از ماژول replace در Ansible تغییر میدهد. این ماژول به دنبال الگوهایی در یک فایل بر اساس یک عبارت منظم (regexp) میگردد و هر مطابقتی را با محتوای مشخص شده در replace جایگزین میکند. سپس تسک با ارسال یک اعلان به handlerی با نام “Restart Nginx”، درخواست یک ریستارت در اسرع وقت میدهد. این بدین معنی است که هر چقدر هم تعداد دفعات درخواست ریستارت زیاد باشد، تنها زمانی که تمام تسکها اجرا شدهاند در انتهای فرآیند، handler اجرا خواهد شد. همچنین، اگر الگو در فایل پیدا نشود و تغییری اعمال نشود، handler فراخوانی نخواهد شد.
یک فایل جدید با نام playbook-12.yml در پوشه ansible-practice خود ایجاد کنید:
nano ~/ansible-practice/playbook-12.yml
محتوای زیر را در فایل جدید وارد کنید:
---
- hosts: all
become: yes
vars:
page_title: My Second Landing Page
page_description: This is my second landing page description.
doc_root: /var/www/mypage
tasks:
- name: Install Nginx
apt:
name: nginx
state: latest
- name: Make sure new doc root exists
file:
path: "{{ doc_root }}"
state: directory
mode: '0755'
- name: Apply Page Template
template:
src: files/landing-page.html.j2
dest: "{{ doc_root }}/index.html"
- name: Replace document root on default Nginx configuration
replace:
path: /etc/nginx/sites-available/default
regexp: '(\s+)root /var/www/html;(\s+.*)?$'
replace: \g<1>root {{ doc_root }};\g<2>
notify: Restart Nginx
- name: Allow all access to tcp port 80
ufw:
rule: allow
port: '80'
proto: tcp
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
پس از اتمام، فایل را ذخیره و ببندید.
یک نکته مهم درباره استفاده از handlers این است که تنها زمانی فعال میشوند که تسکی که دستور notify را تعریف کرده است، باعث تغییر در سرور شود. در قالب playbook بالا، دفعه اول اجرای تسک replace فایل پیکربندی Nginx را تغییر میدهد و در نتیجه handler ریستارت اجرا میشود. اما در اجراهای بعدی، چون عبارت مورد نظر دیگر در فایل نیست، هیچ تغییری ایجاد نمیشود و به همین دلیل handler فعال نمیشود.
هنگام اجرای این playbook، حتماً گزینه -K را وارد کنید زیرا نیاز به دسترسی sudo دارد:
ansible-playbook -i inventory playbook-12.yml -u sammy -K
Output
BECOME password:
PLAY [all] **********************************************************************************************
TASK [Gathering Facts] **********************************************************************************
ok: [203.0.113.10]
TASK [Install Nginx] ************************************************************************************
ok: [203.0.113.10]
TASK [Make sure new doc root exists] ********************************************************************
changed: [203.0.113.10]
TASK [Apply Page Template] ******************************************************************************
changed: [203.0.113.10]
TASK [Replace document root on default Nginx configuration] *********************************************
changed: [203.0.113.10]
TASK [Allow all access to tcp port 80] ******************************************************************
ok: [203.0.113.10]
RUNNING HANDLER [Restart Nginx] *************************************************************************
changed: [203.0.113.10]
PLAY RECAP **********************************************************************************************
203.0.113.10 : ok=7 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
در خروجی، خواهید دید که handler با نام “Restart Nginx” درست قبل از پایان play اجرا میشود. پس از آن، اگر با مرورگر به IP سرور متصل شوید، صفحه زیر را مشاهده خواهید کرد:

در بخش بعدی و پایانی این سری آموزشی، همه بخشها را به هم متصل میکنیم و یک playbook نهایی ایجاد میکنیم که به صورت خودکار سرور Nginx را راهاندازی کرده و وبسایت HTML استاتیک را روی آن مستقر میکند.
از اینکه همراه پارمین کلود هستید، سپاسگزاریم.
نظرات کاربران