در Ansible، میتوانید شرطهایی تعریف کنید که قبل از اجرای یک تسک ارزیابی میشوند. زمانی که شرط برقرار نباشد، تسک نادیده گرفته میشود. این کار با کلیدواژه when انجام میشود که عبارتهایی را میپذیرد که معمولاً بر اساس یک متغیر یا فکت هستند.
مثال زیر دو متغیر تعریف میکند: create_user_file و user. هنگامی که create_user_file مقدار true داشته باشد، فایل جدیدی در پوشه home کاربران با نام کاربری تعریف شده در متغیر user ایجاد خواهد شد:
یک فایل جدید به نام playbook-04.yml در دایرکتوری ansible-practice خود ایجاد کنید:
nano ~/ansible-practice/playbook-04.yml
سپس خطوط زیر را به این فایل اضافه کنید:
---
- hosts: all
vars:
- create_user_file: yes
- user: sammy
tasks:
- name: create file for user
file:
path: /home/{{ user }}/myfile
state: touch
when: create_user_file
فایل را ذخیره و ببندید.
برای اجرای این playbook روی سرورهای موجود در فایل inventory، از دستور ansible-playbook با پارامترهای اتصال مشابهی که قبلاً استفاده کردهاید بهره ببرید. دوباره از فایل inventory با نام inventory و کاربر sammy برای اتصال به سرورها استفاده میکنیم:
ansible-playbook -i inventory playbook-04.yml -u sammy
اگر شرط برقرار باشد، در خروجی اجرای play وضعیت changed را مشاهده خواهید کرد:
Output
...
TASK [create file for user] *****************************************************************************
changed: [203.0.113.10]
...
اگر مقدار create_user_file را به no تغییر دهید، شرط false ارزیابی میشود. در این حالت، وضعیت skipping را در خروجی play میبینید که نشان میدهد تسک اجرا نشده است:
Output
...
TASK [create file for user] *****************************************************************************
skipping: [203.0.113.10]
...
یکی از کاربردهای رایج شرطها در Playbookهای Ansible، ترکیب آنها با کلیدواژه register است. این کلمه کلیدی یک متغیر جدید ایجاد میکند و خروجی یک فرمان را به آن اختصاص میدهد. به این ترتیب میتوانید با استفاده از هر فرمان خارجی، اجرای یک تسک را ارزیابی کنید.
یک نکته مهم این است که به صورت پیشفرض، اگر فرمانی که برای ارزیابی شرط استفاده میکنید با خطا مواجه شود، اجرای play متوقف میشود. به همین دلیل، باید در این تسک، پارامتر ignore_errors را با مقدار yes قرار دهید تا Ansible به اجرای ادامه تسکها ادامه دهد.
مثال زیر تنها زمانی یک فایل جدید در پوشه home کاربر ایجاد میکند که این فایل هنوز وجود نداشته باشد. بررسی وجود فایل با دستور ls انجام میشود. اگر فایل موجود باشد، با استفاده از ماژول debug پیغامی نمایش داده خواهد شد.
یک فایل جدید به نام playbook-05.yml در دایرکتوری ansible-practice ایجاد کنید:
nano ~/ansible-practice/playbook-05.yml
سپس این محتوا را به فایل جدید اضافه کنید:
---
- hosts: all
vars:
- user: sammy
tasks:
- name: Check if file already exists
command: ls /home/{{ user }}/myfile
register: file_exists
ignore_errors: yes
- name: create file for user
file:
path: /home/{{ user }}/myfile
state: touch
when: file_exists is failed
- name: show message if file exists
debug:
msg: The user file already exists.
when: file_exists is succeeded
فایل را ذخیره و ببندید.
سپس، playbook را با همان پارامترهای اتصال قبلی اجرا کنید. در اینجا، از فایل inventory و کاربر sammy استفاده شده اما شما باید این موارد را متناسب تغییر دهید:
ansible-playbook -i inventory playbook-05.yml -u sammy
نخستین اجرای این playbook با خطا مواجه میشود چون فایل تعیین شده در مسیر وجود ندارد. تسک ایجاد فایل اجرا خواهد شد و تسک آخر نادیده گرفته میشود:
...
[secondary_label Output]
TASK [Check if file already exists] *********************************************************************
fatal: [203.0.113.10]: FAILED! => {"changed": true, "cmd": ["ls", "/home/sammy/myfile"], "delta": "0:00:00.004258", "end": "2020-10-22 13:10:12.680074", "msg": "non-zero return code", "rc": 2, "start": "2020-10-22 13:10:12.675816", "stderr": "ls: cannot access '/home/sammy/myfile': No such file or directory", "stderr_lines": ["ls: cannot access '/home/sammy/myfile': No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoring
TASK [create file for user] *****************************************************************************
changed: [203.0.113.10]
TASK [show message if file exists] **********************************************************************
skipping: [203.0.113.10]
...
در خروجی مشاهده میکنید که تسک create file for user باعث اعمال تغییر در سرور شده که یعنی فایل ایجاد شده است. اکنون playbook را دوباره اجرا کنید، نتیجه متفاوتی میبینید:
ansible-playbook -i inventory playbook-05.yml -u sammy
Output
...
TASK [Check if file already exists] *********************************************************************
changed: [203.0.113.10]
TASK [create file for user] *****************************************************************************
skipping: [203.0.113.10]
TASK [show message if file exists] **********************************************************************
ok: [203.0.113.10] => {
"msg": "The user file already exists."
}
...
اگر مایلید درباره استفاده از شرطها در playbookهای Ansible بیشتر بدانید، به مستندات رسمی مراجعه کنید.
از اینکه با جامعه ParminCloud آموزش میبینید سپاسگزاریم.
نظرات کاربران