Ansible roles


  • برای نگارش پرونده‌های 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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *