Skill Development

টেমপ্লেট ব্যবহারের ধারণা

Ansible এ টেমপ্লেট হলো Jinja2 টেমপ্লেট ইঞ্জিন ব্যবহার করে তৈরি করা একটি ফাইল যা ডায়নামিক কনফিগারেশন তৈরি করতে ব্যবহৃত হয়। টেমপ্লেট ব্যবহার করলে আপনি সহজেই ভ্যারিয়েবল, লুপ, এবং শর্ত যুক্ত করে ফাইল কনফিগার করতে পারেন। এটি আপনার প্লেবুক বা রোলকে আরও ফ্লেক্সিবল এবং পুনরায় ব্যবহারযোগ্য করে তোলে, কারণ একবার টেমপ্লেট তৈরি করলে আপনি বিভিন্ন ভ্যারিয়েবলের মান ব্যবহার করে সেটিকে বিভিন্ন সার্ভারে প্রয়োগ করতে পারেন।

টেমপ্লেট ব্যবহারের প্রধান সুবিধা

  • ডায়নামিক কনফিগারেশন ফাইল: একই টেমপ্লেট বিভিন্ন ভ্যারিয়েবলের মান অনুযায়ী বিভিন্ন কনফিগারেশন ফাইল তৈরি করতে পারে।
  • সহজ কাস্টমাইজেশন: টেমপ্লেটে ভ্যারিয়েবল এবং লজিক ব্যবহার করে ফাইলকে কাস্টমাইজ করা যায়।
  • পুনরায় ব্যবহারযোগ্যতা: একবার একটি টেমপ্লেট তৈরি করলে, সেটিকে বিভিন্ন প্রজেক্ট বা প্লেবুকে পুনরায় ব্যবহার করা যায়।

টেমপ্লেট তৈরি করার ধাপ

টেমপ্লেট সাধারণত Ansible রোলের templates ডিরেক্টরিতে রাখা হয় এবং ফাইলের এক্সটেনশন সাধারণত .j2 (Jinja2 টেমপ্লেট) হয়। টেমপ্লেটে আপনি ভ্যারিয়েবল, লুপ, এবং কন্ডিশন ব্যবহার করতে পারেন, যা প্লেবুক বা রোলের ভ্যারিয়েবল থেকে মান গ্রহণ করে।

উদাহরণ: একটি সাধারণ টেমপ্লেট

নিচে একটি nginx.conf.j2 টেমপ্লেটের উদাহরণ দেয়া হলো যা nginx সার্ভারের জন্য কনফিগারেশন ফাইল তৈরি করতে ব্যবহৃত হতে পারে:

# templates/nginx.conf.j2

server {
    listen {{ nginx_port }};
    server_name {{ server_name }};

    location / {
        root {{ document_root }};
        index index.html index.htm;
    }

    {% if enable_logging %}
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    {% endif %}
}

ব্যাখ্যা:

  • {{ nginx_port }}: এটি একটি ভ্যারিয়েবল যা প্লেবুক বা রোলের ভ্যারিয়েবল ফাইলে ডিফাইন করা থাকতে পারে।
  • {{ server_name }} এবং {{ document_root }}: এগুলিও ভ্যারিয়েবল, যা আপনি প্লেবুক বা রোলের মাধ্যমে প্রদান করতে পারেন।
  • {% if enable_logging %}: এটি একটি কন্ডিশনাল ব্লক যা চেক করবে যদি enable_logging ভ্যারিয়েবল সত্য হয় (True), তাহলে লগিং কনফিগারেশন যোগ করা হবে।

প্লেবুকে টেমপ্লেট ব্যবহার করা

একবার টেমপ্লেট তৈরি হয়ে গেলে, আপনি এটি template মডিউল ব্যবহার করে প্লেবুকে অন্তর্ভুক্ত করতে পারেন। নিচে একটি উদাহরণ দেয়া হলো:

---
- name: Configure Nginx using a template
  hosts: webservers
  become: yes
  vars:
    nginx_port: 80
    server_name: example.com
    document_root: /var/www/html
    enable_logging: true

  tasks:
    - name: Deploy Nginx configuration
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/nginx.conf
      notify: Restart Nginx

ব্যাখ্যা:

  1. vars: এখানে প্লেবুকের ভ্যারিয়েবলগুলো ডিফাইন করা হয়েছে যা টেমপ্লেটে ব্যবহৃত হবে।
  2. template মডিউল:
    • src: টেমপ্লেট ফাইলের পাথ যা রোল বা প্লেবুক ডিরেক্টরির মধ্যে থাকতে পারে।
    • dest: টেমপ্লেট প্রসেসিং করে যেই ফাইল তৈরি হবে, তার গন্তব্যস্থান।
  3. notify: কনফিগারেশন আপডেট করার পর Restart Nginx হ্যান্ডলার কল করা হয়েছে।

কন্ডিশন, লুপ, এবং ফিল্টার ব্যবহার করে টেমপ্লেট কাস্টমাইজ করা

Ansible টেমপ্লেটে Jinja2 এর মাধ্যমে আরও ডায়নামিক এবং কাস্টমাইজড কনফিগারেশন তৈরি করা যায়। যেমন:

উদাহরণ: লুপ ব্যবহার

# templates/hosts.j2
{% for host in groups['webservers'] %}
{{ host }} ansible_host={{ hostvars[host]['ansible_default_ipv4']['address'] }}
{% endfor %}

ব্যাখ্যা:

  • এই টেমপ্লেটটি webservers গ্রুপের প্রতিটি হোস্টের জন্য একটি লাইন তৈরি করবে এবং হোস্টের আইপি অ্যাড্রেস প্রদর্শন করবে।

উদাহরণ: ফিল্টার ব্যবহার

 

# templates/info.j2
The server {{ ansible_hostname }} is running on {{ ansible_distribution | lower }}.

ব্যাখ্যা:

  • এখানে lower ফিল্টার ব্যবহার করে ansible_distribution ভ্যারিয়েবলের মান ছোট হাতের অক্ষরে (lowercase) প্রদর্শন করা হয়েছে।

টেমপ্লেট ব্যবহারের কিছু সুবিধা

  1. কাস্টমাইজেবল কনফিগারেশন: আপনি টেমপ্লেটের মাধ্যমে একাধিক সার্ভারে বিভিন্ন কনফিগারেশন প্রদান করতে পারেন।
  2. সহজ ডিবাগিং: ভ্যারিয়েবল এবং কন্ডিশন ব্যবহার করে টেমপ্লেটের আউটপুট সহজে যাচাই এবং ডিবাগ করা যায়।
  3. ডায়নামিক কনফিগারেশন: একই টেমপ্লেট দিয়ে বিভিন্ন সার্ভার কনফিগার করা যায়, যা কোড রিইউজেবল করে তোলে।

সংক্ষেপে টেমপ্লেট ব্যবহারের ধাপসমূহ

  1. টেমপ্লেট তৈরি করুন: Jinja2 ফরম্যাটে .j2 এক্সটেনশনে।
  2. ভ্যারিয়েবল ও কন্ডিশন যোগ করুন: প্লেবুক বা রোলের মাধ্যমে মান পাওয়ার জন্য।
  3. প্লেবুকে অন্তর্ভুক্ত করুন: template মডিউল ব্যবহার করে টেমপ্লেট প্রয়োগ করুন।

Ansible টেমপ্লেটের মাধ্যমে আপনি প্লেবুক বা রোলকে আরও ফ্লেক্সিবল, ডায়নামিক, এবং রিইউজেবল করতে পারবেন। এটি বিশেষ করে বড় স্কেল ডিপ্লয়মেন্ট বা কনফিগারেশন ব্যবস্থাপনার জন্য অত্যন্ত কার্যকর।

Jinja2 টেমপ্লেট ইঞ্জিনের ধারণা

Jinja2 হলো একটি শক্তিশালী এবং ফ্লেক্সিবল টেমপ্লেট ইঞ্জিন, যা সাধারণত Python প্রোগ্রামিং ল্যাঙ্গুয়েজের সাথে ব্যবহৃত হয়। Ansible এ এটি ব্যবহার করা হয় টেমপ্লেট তৈরি এবং প্লেবুকের মধ্যে ডাইনামিক কনটেন্ট যোগ করতে। Jinja2 এর মাধ্যমে আপনি টেমপ্লেট তৈরি করে, তা রেন্ডার করে কাস্টম কনফিগারেশন ফাইল, স্ক্রিপ্ট, বা অন্যান্য টেক্সট ফাইল তৈরি করতে পারেন, যা বিভিন্ন ভ্যারিয়েবল এবং লজিক্যাল এক্সপ্রেশন সমর্থন করে।

Jinja2 টেমপ্লেট ইঞ্জিনের ধারণা

Jinja2 টেমপ্লেট ইঞ্জিন মূলত একটি ডাটারেন্ডারিং ইঞ্জিন, যেখানে আপনি বিভিন্ন ভ্যারিয়েবল, কন্ডিশনাল স্টেটমেন্ট, লুপ এবং অন্যান্য লজিক ব্যবহার করে টেমপ্লেট তৈরি করতে পারেন। এটি সাধারণত .j2 এক্সটেনশনের ফাইল হিসেবে সংরক্ষণ করা হয়, যেমন config.j2

Jinja2 টেমপ্লেটের ব্যবহার

Ansible এ Jinja2 টেমপ্লেটের মাধ্যমে কনফিগারেশন ফাইল বা অন্যান্য টেক্সট ফাইল ডাইনামিকভাবে তৈরি করা যায়। প্লেবুকে Jinja2 টেমপ্লেট ব্যবহার করে হোস্টের বিভিন্ন ইনফরমেশন (facts) এবং ভ্যারিয়েবল দিয়ে টেমপ্লেট রেন্ডার করা যায়।

Jinja2 টেমপ্লেটের উদাহরণ

নিচে একটি সাধারণ Jinja2 টেমপ্লেটের উদাহরণ দেয়া হলো:

hosts.j2:

[webservers]
{% for host in webservers %}
{{ host }}
{% endfor %}

এই টেমপ্লেটটি [webservers] সেকশনে সমস্ত হোস্টের নাম তালিকাভুক্ত করবে যা webservers ভ্যারিয়েবলে থাকবে।

Jinja2 টেমপ্লেটের সাধারণ ফিচারসমূহ

১. ভ্যারিয়েবল: Jinja2 টেমপ্লেটে সরাসরি ভ্যারিয়েবল ব্যবহার করা যায়। উদাহরণ:

Server IP: {{ server_ip }}

২. লুপ: Jinja2 টেমপ্লেটের মাধ্যমে লুপ ব্যবহার করে রিপিটিটিভ কনটেন্ট তৈরি করা যায়:

{% for user in users %}
Username: {{ user.name }}
Email: {{ user.email }}
{% endfor %}

৩. কন্ডিশনাল স্টেটমেন্ট: টেমপ্লেটে if, else, এবং elif ব্যবহার করে কন্ডিশনাল লজিক ব্যবহার করা যায়:

{% if env == "production" %}
This is the production environment.
{% else %}
This is the development environment.
{% endif %}

Ansible প্লেবুকে Jinja2 টেমপ্লেট ব্যবহার করা

Ansible এ Jinja2 টেমপ্লেট ব্যবহার করতে template মডিউল ব্যবহার করা হয়, যা টেমপ্লেট ফাইল রেন্ডার করে নির্দিষ্ট লোকেশনে কপি করে।

উদাহরণ:

apache_config.j2:

 

<VirtualHost *:{{ port }}>
    ServerAdmin {{ admin_email }}
    DocumentRoot {{ doc_root }}
    ServerName {{ server_name }}
</VirtualHost>

playbook.yml:

 

---
- name: Deploy Apache configuration
  hosts: webservers
  become: yes
  vars:
    port: 80
    admin_email: admin@example.com
    doc_root: /var/www/html
    server_name: example.com

  tasks:
    - name: Deploy Apache config using Jinja2 template
      template:
        src: templates/apache_config.j2
        dest: /etc/apache2/sites-available/000-default.conf

এখানে, template মডিউল apache_config.j2 ফাইলটি রেন্ডার করে /etc/apache2/sites-available/000-default.conf লোকেশনে কপি করবে। রেন্ডার করার সময় প্লেবুকের ভ্যারিয়েবলগুলো টেমপ্লেট ফাইলে ইনজেক্ট করা হবে।

Jinja2 টেমপ্লেটের বিশেষ ফিচার এবং ফিল্টার

Jinja2 টেমপ্লেটের কিছু বিশেষ ফিচার এবং ফিল্টার রয়েছে, যা টেমপ্লেট রেন্ডারিংকে আরও শক্তিশালী করে:

১. ফিল্টার: ভ্যারিয়েবল বা এক্সপ্রেশনের উপর বিভিন্ন ফিল্টার প্রয়োগ করা যায়। উদাহরণ:

  • lower: টেক্সট ছোট হরফে রূপান্তর করা:
{{ username | lower }}
  • default: কোনো মান না থাকলে ডিফল্ট মান সেট করা:
{{ server_name | default("localhost") }}

২. জটিল ডাটা স্ট্রাকচার এবং লুপ:

Users:
{% for user in users %}
  - Name: {{ user.name }}
    Email: {{ user.email }}
{% endfor %}

সংক্ষেপে

  • Jinja2 হলো একটি টেমপ্লেট ইঞ্জিন যা Ansible এ ডাইনামিক কনটেন্ট তৈরি এবং রেন্ডার করতে ব্যবহৃত হয়।
  • এটি ভ্যারিয়েবল, লুপ, এবং কন্ডিশনাল লজিক সমর্থন করে, যা টেমপ্লেটকে আরও ফ্লেক্সিবল ও পুনরায় ব্যবহারযোগ্য করে তোলে।
  • Ansible প্লেবুকে template মডিউলের মাধ্যমে Jinja2 টেমপ্লেট ব্যবহার করা হয়।

Jinja2 টেমপ্লেট ব্যবহার করে Ansible প্লেবুককে আরও ডাইনামিক এবং কাস্টমাইজড করা যায়, যা বড় এবং জটিল ইনফ্রাস্ট্রাকচারে কার্যকর।

template মডিউল এবং এর ব্যবহার

Ansible-এ template মডিউল ব্যবহার করা হয় Jinja2 টেম্পলেট ফাইল থেকে কনফিগারেশন ফাইল বা অন্যান্য ফাইল তৈরি করার জন্য। এই মডিউলটি ডায়নামিক কনফিগারেশন ফাইল তৈরি করতে সহায়ক, যেখানে ভ্যারিয়েবল বা কন্ডিশনাল লজিক ব্যবহার করে ফাইল কাস্টমাইজ করা যায়।

template মডিউল কীভাবে কাজ করে?

template মডিউল Jinja2 টেম্পলেট ফাইলটি সোর্স হিসেবে ব্যবহার করে এবং টার্গেট সিস্টেমে (রিমোট হোস্ট) এটি কপি করে। টেম্পলেট ফাইলে Jinja2 সিনট্যাক্স ব্যবহার করে ভ্যারিয়েবল এবং লজিক যুক্ত করা যায়, যা Ansible প্লেবুক বা ইনভেন্টরি থেকে ডেটা নিয়ে ডায়নামিক কনফিগারেশন তৈরি করে।

template মডিউল এর সিনট্যাক্স

 

- name: টেম্পলেট ব্যবহার করে ফাইল কপি করা
  template:
    src: /path/to/template_file.j2
    dest: /path/to/destination_file
    owner: user
    group: group
    mode: '0644'

template মডিউল এর উপাদানগুলো

  • src: টেম্পলেট ফাইলের সোর্স পাথ (লোকাল সিস্টেমে)। এই ফাইলটি Jinja2 সিনট্যাক্স ব্যবহার করে তৈরি করা হয়।
  • dest: টার্গেট পাথ যেখানে টেম্পলেট ফাইলটি রিমোট সিস্টেমে কপি করা হবে।
  • owner, group, এবং mode: টার্গেট ফাইলের মালিকানা, গ্রুপ, এবং পারমিশন সেট করতে ব্যবহৃত হয় (ঐচ্ছিক)।

উদাহরণ

ধরা যাক, আপনার একটি Nginx কনফিগারেশন ফাইল আছে যা ডায়নামিক ভ্যারিয়েবল ব্যবহার করে তৈরি করা হবে।

১. টেম্পলেট ফাইল তৈরি করা (nginx.conf.j2):

 

server {
    listen {{ http_port }};
    server_name {{ domain_name }};

    location / {
        proxy_pass http://{{ backend_server }};
    }
}

২. প্লেবুকের মাধ্যমে টেম্পলেট ব্যবহার করা:

 

---
- name: Deploy Nginx configuration
  hosts: webservers
  become: yes
  vars:
    http_port: 80
    domain_name: example.com
    backend_server: 192.168.1.10
  tasks:
    - name: Copy Nginx configuration using template
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/conf.d/nginx.conf
        owner: root
        group: root
        mode: '0644'

বিশ্লেষণ:

  • http_port, domain_name, এবং backend_server ভ্যারিয়েবলগুলো প্লেবুকের vars সেকশনে উল্লেখ করা হয়েছে, যা টেম্পলেট ফাইল (nginx.conf.j2) এ ব্যবহার করা হয়েছে।
  • template মডিউল টেম্পলেট ফাইলটি /etc/nginx/conf.d/nginx.conf এ কপি করবে এবং ফাইলের মালিকানা, গ্রুপ, ও পারমিশন সেট করবে।

ব্যবহার ক্ষেত্র

  1. কনফিগারেশন ফাইল তৈরি করা: Nginx, Apache, MySQL ইত্যাদি সার্ভারের কনফিগারেশন ফাইল ডায়নামিকভাবে তৈরি করা।
  2. স্ক্রিপ্ট ডিপ্লয়মেন্ট: ডায়নামিক স্ক্রিপ্ট তৈরি এবং সেটআপ করা যেখানে প্লেবুক বা ইনভেন্টরি থেকে ডেটা ব্যবহার করা হয়।
  3. অ্যাপ্লিকেশন সেটিংস ফাইল: অ্যাপ্লিকেশনের জন্য YAML, JSON বা অন্যান্য ফরম্যাটের কনফিগারেশন ফাইল তৈরি করা।

template মডিউল এবং Jinja2

template মডিউল Jinja2 সিনট্যাক্স ব্যবহার করে, যা নিচের ফিচারগুলো সমর্থন করে:

  • ভ্যারিয়েবল: {{ variable_name }} ব্যবহার করে ভ্যারিয়েবল উল্লেখ করা যায়।
  • লুপ: {% for item in list %} ব্যবহার করে লুপ করা যায়।
  • কন্ডিশনাল লজিক: {% if condition %} ব্যবহার করে শর্ত অনুযায়ী কনফিগারেশন তৈরি করা যায়।

উদাহরণ: Jinja2 কন্ডিশনাল লজিক

 

server {
    listen 80;
    server_name {{ domain_name }};

    {% if ssl_enabled %}
    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/{{ domain_name }}.crt;
    ssl_certificate_key /etc/nginx/ssl/{{ domain_name }}.key;
    {% endif %}
}

উপরের টেম্পলেট ফাইলে, যদি ssl_enabled ভ্যারিয়েবলটি true হয়, তাহলে SSL কনফিগারেশন অংশটি যুক্ত হবে। অন্যথায়, এই অংশটি এড়িয়ে যাবে।

সারাংশ

  • template মডিউল ব্যবহার করে Jinja2 টেম্পলেটের মাধ্যমে ডায়নামিক কনফিগারেশন ফাইল তৈরি করা যায়।
  • এটি ভ্যারিয়েবল এবং লজিক ব্যবহারের মাধ্যমে কাস্টমাইজড কনফিগারেশন তৈরিতে সহায়ক।
  • Ansible-এ template মডিউল একটি অত্যন্ত শক্তিশালী টুল, যা প্লেবুকের পুনঃব্যবহারযোগ্যতা ও কার্যকারিতা বাড়ায়।

template মডিউল ব্যবহার করে আপনি সহজেই ডায়নামিক কনফিগারেশন এবং ফাইল ম্যানেজমেন্ট করতে পারবেন, যা আপনার প্লেবুক এবং রোলগুলিকে আরও শক্তিশালী করবে।

কনফিগারেশন ফাইল তৈরি এবং ডিপ্লয়

Ansible-এ কনফিগারেশন ফাইল তৈরি এবং ডিপ্লয় করা একটি সাধারণ কাজ, বিশেষ করে যখন সার্ভার, অ্যাপ্লিকেশন বা অন্যান্য সার্ভিসগুলোর সেটআপ অটোমেট করতে হয়। এটি করার জন্য Ansible-এ সাধারণত template মডিউল ব্যবহার করা হয়, যেখানে Jinja2 টেম্পলেটের মাধ্যমে কনফিগারেশন ফাইল তৈরি এবং রিমোট হোস্টে ডিপ্লয় করা হয়। এখানে কনফিগারেশন ফাইল তৈরি এবং ডিপ্লয় করার একটি উদাহরণ দেখানো হলো।

ধাপ ১: টেম্পলেট ফাইল তৈরি করা

প্রথমে, আপনার টেম্পলেট ফাইল তৈরি করতে হবে। টেম্পলেট ফাইল সাধারণত templates/ ডিরেক্টরিতে সংরক্ষণ করা হয় এবং এটি Jinja2 সিনট্যাক্স ব্যবহার করে।

উদাহরণ টেম্পলেট ফাইল: templates/nginx.conf.j2

 

server {
    listen {{ http_port }};
    server_name {{ domain_name }};

    location / {
        proxy_pass http://{{ backend_server }};
    }
}

বিশ্লেষণ:

  • এখানে {{ http_port }}, {{ domain_name }}, এবং {{ backend_server }} ভ্যারিয়েবলগুলোর মাধ্যমে ডায়নামিক মান ব্যবহার করা হয়েছে।
  • Ansible প্লেবুক বা ইনভেন্টরি থেকে এই ভ্যারিয়েবলগুলোর মান আসবে।

ধাপ ২: প্লেবুক তৈরি করা

এরপর, আপনি একটি প্লেবুক তৈরি করবেন যেখানে template মডিউল ব্যবহার করে টেম্পলেট ফাইলটি রিমোট হোস্টে ডিপ্লয় করবেন।

উদাহরণ প্লেবুক: deploy_nginx.yml

 

---
- name: Deploy Nginx configuration file
  hosts: webservers
  become: yes
  vars:
    http_port: 80
    domain_name: example.com
    backend_server: 192.168.1.10
  tasks:
    - name: Copy Nginx configuration using template
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/conf.d/nginx.conf
        owner: root
        group: root
        mode: '0644'
    - name: Restart Nginx service
      service:
        name: nginx
        state: restarted

বিশ্লেষণ:

  1. ভ্যারিয়েবল:
    • http_port, domain_name, এবং backend_server ভ্যারিয়েবলগুলো প্লেবুকের vars সেকশনে উল্লেখ করা হয়েছে।
  2. template মডিউল:
    • src: টেম্পলেট ফাইলের পাথ (লোকাল সিস্টেমে)।
    • dest: রিমোট সিস্টেমে টেম্পলেট ফাইলটি কপি করার স্থান।
    • owner, group, এবং mode: টার্গেট ফাইলের মালিকানা এবং পারমিশন সেট করা হয়েছে।
  3. Nginx রিস্টার্ট করা:
    • কনফিগারেশন পরিবর্তনের পরে Nginx সার্ভিস রিস্টার্ট করতে service মডিউল ব্যবহার করা হয়েছে।

ধাপ ৩: প্লেবুক রান করা

এখন, প্লেবুক রান করে কনফিগারেশন ফাইল তৈরি এবং ডিপ্লয় করতে হবে।

 

ansible-playbook -i inventory deploy_nginx.yml
  • -i inventory: এখানে আপনার ইনভেন্টরি ফাইলের পাথ দিতে হবে যা টার্গেট হোস্ট বা হোস্ট গ্রুপ নির্ধারণ করে।

সারাংশ

  • টেম্পলেট ফাইল তৈরি: Jinja2 টেম্পলেট ব্যবহার করে একটি কনফিগারেশন ফাইল তৈরি করা।
  • প্লেবুক তৈরি: template মডিউল ব্যবহার করে টেম্পলেট ফাইলটি রিমোট হোস্টে কপি করা এবং সেট করা।
  • সার্ভিস রিস্টার্ট: কনফিগারেশন পরিবর্তনের পর সার্ভিস রিস্টার্ট করা।

এই পদ্ধতি অনুসরণ করে, আপনি সহজেই কনফিগারেশন ফাইল তৈরি ও ডিপ্লয় করতে পারবেন। Ansible-এর টেম্পলেট মডিউল এবং প্লেবুক ব্যবহারে কনফিগারেশন ম্যানেজমেন্ট সহজ এবং কার্যকর হয়ে ওঠে।

আরও দেখুন...

Promotion