Using conditions in ansible PlayBook


  • همانند تمام زبان‌های برنامه نویسی، در زبان Yaml نیز می‌توان از شروط در حالات مختلف استفاده نمود.
  • برای درک بهتر این مبحث، مثال‌هایی در زیر جمع آوری شده است.

  • به عنوان مثال کد زیر باعث می‌شود تا :
    • ابتدا بررسی شود آیا توزیع از مشتقات RedHat است یا خیر.
    • سپس آخرین نسخه از سرویس httpd بر روی آن نصب یا بروز رسانی می‌شود.
---
- name: PlayBook name
  hosts: centos-servers
  gather_facts: yes
  tasks:
  - name: install httpd package
    yum: name=httpd state=latest
    when: ansible_os_family == "RedHat"
...

 

  • به منظور اجرای پرونده‌ی PlayBook به شکل زیر عمل کنید :
# ansible-playbook playbook.yaml

 

  • نکته: توجه داشته باشید از آن جایی که از متغیر ansible_os_family استفاده کردیم، انتظار می‌رود که مقدار کلید gather_facts بر روی yes تنظیم شده باشد.
  • نکته: با استفاده از کلمه‌ی when تعیین کردیم در صورتی که ماژول yum فراخوانی شود که مقدار متغییر ansible_os_family برابر با RedHat باشد.
  • نکته: مقدار متغییر (در مثال بالا RedHat) به حروف بزرگ و کوچک حساس می‌باشد. یعنی RedHat و redhat دو کلمه‌ی جدا از هم در نظر گرفته می‌شود.
  • نکته: در صورتی که شرط برقرار نباشد، فرآیند مربوطه اصطلاحا به صورت skipping یا تعلیق در خواهد آمد.

  • به عنوان مثال کد زیر باعث می‌شود تا :
    • ابتدا بررسی شود که توزیع از جنس Debian ، Ubuntu یا CentOS است.
    • سپس متناسب با آن، متنی با مضمون نام توزیع چاپ شود.
---
- name: PlayBook name
  hosts: all
  gather_facts: yes
  tasks:
  - debug: msg="host is centos"
    when: ansible_distribution=="CentOS"
  - debug: msg="host is debian"
    when: ansible_distribution=="Debian"
  - debug: msg="host is ubuntu"
    when: ansible_distribution=="Ubuntu"
...

 

  • به منظور اجرای پرونده‌ی PlayBook به شکل زیر عمل کنید :
# ansible-playbook playbook.yaml

 

  • نکته: توجه داشته باشید از آن جایی که از متغیر ansible_distribution استفاده کردیم، انتظار می‌رود که مقدار کلید gather_facts بر روی yes تنظیم شده باشد.

  • به عنوان مثال کد زیر باعث می‌شود تا :
    • ابتدا بررسی شود آیا توزیع از جنس Debian است یا خیر.
    • سپس متنی متناسب با آن چاپ شود.
---
- name: PlayBook name
  hosts: all
  gather_facts: yes
  tasks:
  - name: echo msg
    debug: msg="I am Debian !"
    when: ansible_facts['distribution'] == "Debian"
    # note that all variables can be used directly in conditionals without double curly braces
...
  • به منظور اجرای پرونده‌ی PlayBook به شکل زیر عمل کنید :
# ansible-playbook playbook.yaml
  • نکته: در مثال بالا به نحوه استفاده از متغیر توجه کنید.

  • به عنوان مثال کد زیر باعث می‌شود تا :
    • ابتدا بررسی شود آیا توزیع از جنس Debian است یا خیر.
    • سپس بررسی می‌شود آیا نسخه توزیع برابر با ۱۰ است یا خیر.
    • در نهایت متنی متناسب با پاسخ، چاپ خواهد شد.
---
- name: PlayBook name
  hosts: all
  gather_facts: yes
  tasks:
  - name: "Find only debian 10"
    debug: msg="I am Debian 10 !"
    when:
      - ansible_facts['distribution'] == "Debian"
      - ansible_facts['distribution_major_version'] == "10"
...
  • به منظور اجرای پرونده‌ی PlayBook به شکل زیر عمل کنید :
# ansible-playbook playbook.yaml
  • نکته: در مثال بالا از دو شرط به صورت هم زمان استفاده کردیم لذا زمانی شرط اجرا می‌شود که هر دو شرط صحیح و برقرار باشد. به بیان دیگر در این مثال به “و منطقی” پرداخته شده است.

  • به عنوان مثال کد زیر باعث می‌شود تا :
    • ابتدا بررسی شود آیا توزیع از جنس Debian است یا خیر.
    • سپس بررسی می‌شود آیا توزیع از جنس Ubuntu است یا خیر.
    • در نهایت در صورتی که یکی از شروط صدق کرد، متنی دلخواه چاپ شود.
---
- name: PlayBook name
  hosts: all
  gather_facts: yes
  tasks:
  - name: "Find debian base"
    debug: msg="debian base"
    when: (ansible_facts['distribution'] == "Debian") or
          (ansible_facts['distribution'] == "Ubuntu")
...

 

  • به منظور اجرای پرونده‌ی PlayBook به شکل زیر عمل کنید :
# ansible-playbook playbook.yaml

 

  • نکته: در کد بالا از دو شرط به صورت هم‌زمان استفاده کردیم اما زمانی شرط اجرا می‌شود که تنها یکی از شروط برقرار باشد. به بیان دیگر در این مثال به “یا” پرداخته شده است.

  • به عنوان مثال کد زیر باعث می‌شود تا :
    • ابتدا با استفاده از دستور ls بررسی شود آیا پرونده‌ای با نام null.file در پوشه‌ی tmp/ وجود دارد یا خیر.
    • سپس خروجی دستور ls درون متغیری با نام result_variable ریخته شود.
    • در نهایت متناسب با خروجی دستور ls متنی با مضمون fail یا succeed چاپ شود.
---
- name: PlayBook name
  hosts: debian-servers
  gather_facts: yes
  tasks:
  - command: ls /tmp/null.file
    register: result_variable # This is just a variable name
    ignore_errors: True

  - debug: msg="fail"
    when: result_variable is failed

  # In older versions of ansible use ``success``, now both are valid but succeeded uses the correct tense.
  - debug: msg="succeed"
    when: result_variable is succeeded
...
  • به منظور اجرای پرونده‌ی PlayBook به شکل زیر عمل کنید :
# ansible-playbook playbook.yaml

  • به عنوان مثال کد زیر باعث می‌شود تا :
    • ابتدا بررسی شود آیا توزیع از جنس Debian است یا خیر.
    • سپس بررسی شود آیا نسخه‌ی توزیع بالاتر از ۶ است یا خیر.
    • در نهایت متناسب با پاسخ، متنی چاپ شود.
---
- name: PlayBook name
  hosts: debian-servers
  gather_facts: yes
  tasks:
  - name: "finding version greater than 6"
    debug: msg="finding version greater than 6"
    when: ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] | int >= 6
...
  • به منظور اجرای پرونده‌ی PlayBook به شکل زیر عمل کنید :
# ansible-playbook playbook.yaml
  • نکته: در مثال بالا از دو شرط به صورت هم زمان استفاده کردیم لذا زمانی شرط اجرا می‌شود که هر دو شرط صحیح و برقرار باشد. به بیان دیگر در این مثال به “و منطقی” پرداخته شده است.

  • به منظور مطالعه‌ی بیشتر لینک زیر پیشنهاد می‌شود :
https://docs.ansible.com/ansible/latest/user_guide/playbooks_conditionals.html

  • آزمایش شده بر روی Ansible نسخه‌ی 2.5.1
  • آزمایش شده بر روی سیستم عامل Ubuntu 18.04

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

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