- برای نگارش پروندههای yaml نیازی نیست تا تمام دستورالعملها اعم از Task ، handlers ، Template و … را در درون یک پرونده ایجاد کرد.
- این کار خطایابی را با مشکل روبهرو میکند.
- راهکار دیگر استفاده از مفهوم roles میباشد.
- این راهکار اجازه میدهد تا تمام مواردی که قرار است در درون پروندهی PlayBook استفاده شود، در درون پوشهها و پروندههایی جدا از هم نگارش شود.
- به عنوان مثال فرض کنید :
- قصد نصب سرویس Apache بر روی گروهی خاص از خادمهای تحت مدیریت را دارید.
- سپس در صورتی که نصب به صورت موفقیت آمیز طی شد، سرویس Apache به منظور پیکربندی متوقف شود.
- برای این منظور کافیست در پوشهی جاری یک پوشه با نام roles ایجاد کنید :
# mkdir roles
- نکته: حتما باید از نام roles استفاده شود.
- در مرحله بعد پوشهای با نام PlayBook اصلی ایجاد کنید :
# mkdir roles/install_apache
- نکته: نام install_apache فرضی بوده و باید تغییر یابد.
- در مرحلهی بعد پوشههای tasks و handlers را درون این پوشه ایجاد کنید :
# mkdir roles/install_apache/tasks
# mkdir roles/install_apache/handlers
- در مرحلهی بعد پروندهای درون پوشهی tasks و handlers ایجاد کنید.
# touch roles/install_apache/tasks/main.yaml
# nano roles/install_apache/tasks/main.yaml
---
- name: install apache web server
yum: name=apache2 state=latest
notify:
- start_service
# touch roles/install_apache/handlers/main.yaml
# nano roles/install_apache/handlers/main.yaml
---
- name: start_service
service: name=apache2 state=stoped
- نکته: نام main.yaml مثال بوده و باید تغییر یابد.
- نکته: انتخاب نام start_service کاملا اختیاری میباشد.
- نکته: محتویات پروندهها را عینا مطابق بالا در نظر بگیرید.
- نکته: برای مشاهده ساختار درختی پوشهها و پروندههای ایجاد شده، پیشنهاد میشود از دستور tree استفاده کنید.
# tree roles/
roles/
└── install_apache
├── handlers
│ └── main.yaml
└── tasks
└── main.yaml
3 directories, 2 files
- سپس میتوان PlayBook اصلی را ایجاد کرد و درون آن به PlayBook هایی که قبلا ایجاد کردیم، اشاره نمود.
- برای این منظور :
touch roles.yaml
nano roles.yaml
---
- hosts: debian-servers
roles:
- install_apache
- نکته: انتخاب نام roles.yaml فرضی بوده و میتوان هر نام دیگری نیز اختیار کرد.
- نکته: پروندهی roles.yaml خارج از پوشهی roles باید قرار گیرد.
- در نهایت کافیست PlayBook اصلی را به شکل زیر اجرا کنید :
# ansible-playbook roles.yaml
- در صورتی که کد بالا به صورت موفقیت آمیز اجرا شده باشد، خروجیای مشابه زیر دریافت خواهید کرد :
PLAY [debian-servers] ************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [172.16.0.247]
TASK [install_apache : install apache web server] ********************************************************************************************************************
changed: [172.16.0.247]
RUNNING HANDLER [install_apache : start_service] *********************************************************************************************************************
changed: [172.16.0.247]
PLAY RECAP ***********************************************************************************************************************************************************
172.16.0.247 : ok=3 changed=2 unreachable=0 failed=0
- به عنوان مثالی دیگر فرض کنید قصد :
- نصب سرویس Apache را بر روی گروهی خاص از خادمهای تحت مدیریت دارید.
- سپس در صورتی که سرویس Apache به صورت موفقیت آمیز نصب شد، به منظور پیکربندی متوقف شود.
- سپس در مرحله آخر با استفاده از ماژول template و vars پروندهی پیکربندی از پیش آماده شده به خادمهای تحت مدیریت انتقال داده شود.
- برای این منظور کافیست در پوشهی جاری یک پوشه با نام roles ایجاد کنید :
# mkdir roles
- نکته: حتما باید از نام roles استفاده شود.
- در مرحله بعد پوشهای با نام PlayBook اصلی ایجاد کنید :
# mkdir roles/install_apache
- در مرحلهی بعد پوشههای tasks و handlers را درون این پوشه ایجاد کنید :
# mkdir roles/install_apache/tasks
# mkdir roles/install_apache/handlers
# mkdir roles/install_apache/vars
# mkdir roles/install_apache/templates
- در مرحلهی بعد پروندهای درون پوشهی tasks و handlers ایجاد کنید.
# touch roles/install_apache/tasks/main.yaml
# nano roles/install_apache/tasks/main.yaml
---
- name: install apache
yum: name=apache2 state=latest
notify:
- start_service
- name: apache configuration file
template: src=roles/install_apache/templates/apache2.conf dest=/etc/apache2/
# touch roles/install_apache/handlers/main.yaml
# nano roles/install_apache/handlers/main.yaml
---
- name: start_service
service: name=apache2 state=restarted
- نکته: نیازی به وارد کردن آدرس کامل پروندهی j2 در پوشهی template برای پارامتر src نیست.
- در ادامه پروندهی پیکربندی مورد نظر با پسوند j2 را درون پوشهی templates قرار دهید.
# cp /etc/apache2/apache2.j2 /root/roles/install_apache/templates
- نکته: مسیر etc/apache2/apache2.j2/ فرضی بوده و باید متناسب با خادمی که در اختیار دارید، آن را تغییر دهید.
- نکته: درون پروندهی j2 متغییر با نام webmaster به صورت زیر در نظر گرفته شده است :
...
Timeout {{time}}
...
- در مرحله بعد یک PlayBook در پوشهی vars ایجاد کنید و محتویات زیر را برای آن در نظر بگیرید :
---
time: 450
- نکته: انتخاب نام متغیر time فرضی بوده و باید متناسب با PlayBook شما تغییر یابد.
- نکته: برای مشاهده ساختار درختی پوشهها و پروندههای ایجاد شده، پیشنهاد میشود از دستور tree استفاده کنید.
# tree roles/
roles/
└── install_apache
├── handlers
│ └── main.yaml
├── tasks
│ └── main.yaml
├── templates
│ └── apache2.j2
└── vars
5 directories, 3 files
- سپس میتوان PlayBook اصلی را ایجاد کرد و درون آن به PlayBook هایی که قبلا ایجاد کردیم، اشاره نمود.
- برای این منظور :
touch roles.yaml
nano roles.yaml
---
- hosts: debian-servers
roles:
- install_apache
- نکته: انتخاب نام roles.yaml فرضی بوده و میتوان هر نام دیگری نیز اختیار کرد.
- نکته: پروندهی roles.yaml خارج از پوشهی roles باید قرار گیرد.
- در نهایت کافیست PlayBook اصلی را به شکل زیر اجرا کنید :
# ansible-playbook roles.yaml
- در صورتی که کد بالا به صورت موفقیت آمیز اجرا شده باشد، خروجیای مشابه زیر دریافت خواهید کرد :
PLAY [debian-servers] ************************************************************************************************************************************************
TASK [Gathering Facts] ***********************************************************************************************************************************************
ok: [172.16.0.247]
TASK [install_apache : install apache web server] ********************************************************************************************************************
changed: [172.16.0.247]
TASK [install_apache : test] *****************************************************************************************************************************************
changed: [172.16.0.247]
RUNNING HANDLER [install_apache : start_service] *********************************************************************************************************************
changed: [172.16.0.247]
PLAY RECAP ***********************************************************************************************************************************************************
172.16.0.247 : ok=4 changed=3 unreachable=0 failed=0
- به عنوان مثالی دیگر، فرض کنید میخواهیم :
- سرویس polipo بر روی گروهی از خادمهای تحت مدیریت نصب شود.
- سپس پروندهی تنظیمات این سرویس از خادم مرکزی بر روی گروهی خاص از خادمهای تحت مدیریت انتقال داده شود.
- برای این منظور کافیست در پوشهی جاری یک پوشه با نام roles ایجاد کنید :
# mkdir roles
- نکته: حتما باید از نام roles استفاده شود.
- در مرحله بعد پوشهای با نام PlayBook اصلی ایجاد کنید :
# mkdir roles/install_polipo
- در مرحلهی بعد پوشههای tasks را درون این پوشه ایجاد کنید :
# mkdir roles/install_polipo/tasks
- در مرحله بعد پروندهی main.yaml را در درون پوشههای ایجاد شده، بسازید و محتویات آن را به صورت زیر در نظر بگیرید :
# touch roles/install_polipo/tasks/main.yaml
# nano roles/install_polipo/tasks/main.yaml
---
- name: install polipo service using apt mudole
apt: name=polipo state=latest
- name: copy polipo configuration file to other servers
copy: src=/etc/polipo/config dest=/etc/polipo/config
- نکته: برای مشاهده ساختار درختی پوشهها و پروندههای ایجاد شده، پیشنهاد میشود از دستور tree استفاده کنید.
# tree install_polipo/
install_polipo/
└── tasks
└── main.yaml
1 directory, 1 file
- سپس میتوان PlayBook اصلی را ایجاد کرد و درون آن به PlayBook هایی که قبلا ایجاد کردیم، اشاره نمود.
touch install_polipo.yaml
nano install_polipo.yaml
---
- hosts: debian-servers
roles:
- install_apache
---
- hosts: debian-servers
roles:
- install_polipo
- نکته: امکان اشاره به چندین role وجود دارد. به عنوان مثال در کد بالا به صورت همزمان به role های install_polipo و install_apache اشاره شده است.
- نکته: نامهای استفاده شده در مثال بالا فرضی میباشد.
- در نهایت کافیست PlayBook اصلی را به شکل زیر اجرا کنید :
# ansible-playbook playbook.yaml
- به منظور مطالعهی بیشتر لینک زیر پیشنهاد میشود :
https://docs.ansible.com/ansible/latest/user_guide/playbooks_reuse_roles.html
- آزمایش شده بر روی Ansible نسخهی 2.5.1
- آزمایش شده بر روی سیستم عامل Ubuntu 18.04