چگونه در Playbookهای Ansible از شرط‌ها استفاده کنیم؟

در 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 آموزش می‌بینید سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

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

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