تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

راه‌اندازی Docker Compose از طریق Ansible در اوبونتو


۱۲ فروردین ۱۴۰۴

تصور کنید هر بار که می‌خواهید یک سرور جدید راه‌اندازی کنید، نیازی نباشد حتی یک فرمان را به‌صورت دستی وارد کنید. بدون خطای انسانی، بدون صرف زمان اضافه و انجام تنظیمات تکراری. اینجاست که مفهوم Automation یا خودکارسازی وارد میدان می‌شود و همه‌چیز را متحول می‌کند. ابزارهایی مانند Ansible طراحی شده‌اند تا فرآیند آماده‌سازی و مدیریت سرورها را از یک کار زمان‌بر و مستعد خطا به یک روند سریع، استاندارد و قابل اطمینان تبدیل کنند.

در این آموزش از وبلاگ لیارا، قصد داریم نحوه استفاده از Ansible برای خودکارسازی فرایند نصب Docker روی اوبونتو 22.04 را به شما آموزش دهیم. با ما همراه باشید تا این فرایند را مرحله‌به‌مرحله بررسی کنیم.

در ادامه بخوانید:

  • پیش‌نیازها
  • پلی‌بوک (Playbook) چیست؟
  • نحوه انجام کار پلی‌بوک
  • مرحله اول: آماده‌سازی پلی‌بوک
  • مرحله دوم: اضافه کردن تسک نصب پکیج‌ها به Playbook
  • مرحله سوم: اضافه کردن تسک نصب داکر به Playbook
  • مرحله چهارم: افزودن ایمیج docker و تسک کانتینر به Playbook
  • مرحله پنجم: بررسی پیکربندی Playbook
  • مرحله ششم: اجرای Playbook
  • جمع‌بندی
  • سوالات متداول

پیش‌نیازها

بهتر است برای دنبال کردن این آموزش به موارد زیر توجه داشته باشید:

برای استفاده از Ansible، به یک نود کنترلی (Control Node) نیاز دارید. این نود در واقع همان سیستمی است که دستورات Ansible از طریق آن اجرا می‌شود. این سیستم باید از توزیع Ubuntu 22.04 استفاده کند، Ansible روی آن نصب شده باشد و امکان اتصال به سرورهای هدف از طریق SSH روی آن فراهم شده باشد. همچنین بهتر است کاربری که از آن استفاده می‌کنید، دسترسی sudo داشته باشد و فایروال سیستم هم فعال و به‌درستی تنظیم شده باشد.

علاوه بر نود کنترلی، به یک یا چند سرور مقصد (Managed Nodes) نیاز دارید که Ansible قرار است آن‌ها را مدیریت کند. این سرورها هم باید از توزیع Ubuntu 22.04 استفاده کنند تا هماهنگی و سازگاری لازم با دستورالعمل‌های این آموزش برقرار باشد.

به شدت توصیه می‌شود قبل از مطالعه این آموزش، مقاله‌های زیر را بخوانید:

پلی‌بوک (Playbook) چیست؟

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

فرض کنید می‌خواهید روی چندین سرور پکیجی به‌نام curl را نصب کنید، به‌جای اینکه هر بار به‌صورت دستی وارد هر سرور شوید و دستور نصب را اجرا کنید، می‌توانید یک پلی‌بوک Ansible بنویسید که این کار را به‌طور خودکار انجام دهد.

مثال زیر یک پلی‌بوک نوشته شده را نشان می‌دهد:

---
- name: Install curl on all servers
  hosts: all
  become: true
  tasks:
    - name: Install curl package
      apt:
        name: curl
        state: present
        update_cache: yes

حالا کافی است، دستور curl را به‌صورت خودکار روی تمام سرورهای مشخص شده نصب کنید:

ansible-playbook install_curl.yml

با این کار، Ansible به‌طور خودکار تمام سرورها را بررسی کرده و پکیج curl را نصب می‌کند، بدون اینکه نیاز به ورود دستی به هر سرور باشد.

همچنین بخوانید: انسیبل (Ansible) چیست؟

نحوه انجام کار Playbook

استفاده از Playbook در Ansible یک روش سریع و خودکار برای نصب Docker روی سرور اوبونتو است و جایگزین اجرای دستی مراحل نصب به‌شمار می‌آید. با اجرای این Playbook، مجموعه‌ای از اقدامات به‌صورت خودکار روی سرورهای هدف (Ansible Hosts) انجام می‌شود که شامل مراحل زیر است:

  • نصب Aptitude به‌عنوان ابزار مدیریت بسته‌ها که Ansible استفاده از آن را به‌جای apt توصیه می‌کند.
  • نصب پکیج‌های موردنیاز سیستم.
  • افزودن کلید GPG مربوط به Docker برای تأیید اعتبار بسته‌ها.
  • اضافه کردن ریپوزیتوری رسمی Docker به منابع apt.
  • نصب Docker.
  • نصب ماژول Docker برای Python با استفاده از pip.
  • دانلود (pull) ایمیج پیش‌فرض از Docker Hub، که مقدار آن از طریق متغیر default_container_image تعیین شده است.
  • ایجاد تعداد مشخصی کانتینر بر اساس مقدار container_count. هر کانتینر از ایمیج مشخص‌شده در default_container_image ساخته می‌شود و دستوری که در default_container_command تعریف شده، در آن اجرا خواهد شد.

در پایان اجرای این Playbook، کانتینرهای موردنظر شما مطابق با مقادیر تعریف‌شده در متغیرهای پیکربندی ایجاد و آماده استفاده خواهند بود.

شاید این مطلب برای شما مفید باشد: نصب داکر روی اوبونتو 22.04

مرحله اول: آماده‌سازی Playbook

پیش از ورود به مراحل عملی، بهتر است با یک مفهوم کلیدی در این آموزش آشنا شوید. هر زمان در ادامه این راهنما از واژه «Task» یا «تسک» استفاده شد، منظور یک واحد کوچک و مشخص از عملیات است که با کمک Playbook در Ansible می‌توانید اجرای آن را به‌صورت خودکار انجام دهید.

تمامی تسک‌ها در فایل اصلی Playbook که با نام playbook.yml شناخته می‌شود، تعریف خواهند شد.

در این مرحله، لازم است فایل Playbook را ایجاد کرده و آن را با ویرایشگر موردنظر خود باز کنید:

nano playbook.yml

با این دستور، شما یک فایل خالی YAML خالی را باز می‌کنید. قبل از اینکه اضافه کردن تسک‌های جدید به پلی‌بوک را شروع کنیم، ابتدا کدهای زیر را به فایل اضافه کنید:

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1

تقریباً تمام Playbookهایی که در محیط Ansible با آن‌ها سروکار خواهید داشت، ساختاری مشابه با نمونه زیر دارند. در این ساختار، هر بخش وظیفه مشخصی دارد و تعیین می‌کند که اجرای دستورها به چه صورتی انجام شود.

در این بخش از فایل Playbook، با مفاهیم زیر روبه‌رو می‌شوید:

vars: این بخش امکان تعریف متغیرها را فراهم می‌کند. استفاده از متغیرها باعث می‌شود در صورت نیاز به تغییر مقادیر، تنها کافی باشد همین بخش از فایل را ویرایش کنید، بدون آن‌که نیازی به تغییر در سایر قسمت‌های Playbook وجود داشته باشد.

hosts: مشخص می‌کند که این Playbook قرار است روی کدام سرورها اجرا شود. درواقع این بخش هدف اجرای Playbook را تعیین می‌کند.

become: تعیین می‌کند که آیا دستورات موجود در Playbook باید با دسترسی Root اجرا شوند یا خیر.

در ادامه یک نمونه ساده از ساختار ابتدایی Playbook را مشاهده می‌کنید:

- hosts: all
  become: yes

  vars:
    container_count: 3
    default_container_name: docker_container
    default_container_image: ubuntu
    default_container_command: sleep infinity

در این مثال:

  • تعداد کانتینرها توسط container_count مشخص شده است.
  • نام پیش‌فرض کانتینرها در default_container_name تعریف شده.
  • ایمیج مورد استفاده از Docker Hub توسط default_container_image تعیین می‌شود.
  • و دستوری که هر کانتینر پس از اجرا باید اجرا کند، در default_container_command قرار دارد.
همین الان، بدون کمترین پیچیدگی، سرور مجازی خودتون رو در کمتر از ۳۰ ثانیه، راه‌اندازی کنید.
✅ عملکرد پایدار ✅ ترافیک نامحدود ✅ هزینه به‌صرفه
خرید سرور مجازی ابری

مرحله دوم: اضافه کردن تسک نصب پکیج‌ها به Playbook

به‌طور پیش‌فرض، Ansible تسک‌های موجود در Playbook را به‌ترتیب از بالا تا پائین و به‌صورت مرحله‌به‌مرحله اجرا می‌کند. به این معنی که اجرای تسک‌ تا زمانی آغاز نمی‌شود که تسک قبلی با موفقیت به پایان رسیده باشد.

برای مثال:

اگر قصد داشته باشید ابتدا پکیج منیجر را نصب کنید و سپس با آن ابزارهای موردنیاز را دانلود کنید، باید تسک نصب پکیج منیجر پیش از سایر تسک‌ها قرار بگیرد.

نکته مهم دیگری که باید در نظر داشته باشید این است که هر تسک به‌صورت مستقل عمل می‌کند و می‌توانید همان تسک را بدون تغییر در Playbookهای دیگر نیز مورد استفاده قرار دهید.

در ادامه، اولین تسک را به‌عنوان نمونه به فایل Playbook اضافه می‌کنیم. این تسک مسئول نصب ابزار Aptitude است؛ ابزاری که Ansible آن را به‌عنوان جایگزین apt برای مدیریت پکیج‌های لینوکسی توصیه می‌کند:

tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

این تسک ابتدا لیست‌های پکیج‌ها را به‌روزرسانی می‌کند، سپس جدیدترین نسخه Aptitude را روی سرور مقصد نصب خواهد کرد.

مرحله سوم: اضافه کردن تسک نصب داکر به Playbook

این تسک مسئول نصب آخرین نسخه از داکر از ریپوزیتوری رسمی Docker است. در فرایند نصب، ابتدا کلید GPG Docker برای تائید اعتبار دانلودهای ریپوزیتوری به سیستم اضافه می‌شود. سپس ریپوزیتوری رسم داکر به‌عنوان منبع دانلود پکیج‌ها معرفی می‌شود. در آخر با انجام این عملیات داکر را روی سیستم نصب می‌کند.

علاوه بر نصب Docker، این تسک همچنین ماژول Docker برای Python را از طریق pip نصب می‌کند. این ماژول به شما این امکان را می‌دهد که بتوانید از طریق اسکریپت‌های Python با Docker ارتباط برقرار کرده و عملیات مختلفی را روی کانتینرها انجام دهید.

برای انجام این عملیات، کد زیر را به Playbook خود اضافه کنید:

- name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu jammy stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

این تسک‌ها به‌ترتیب مراحل زیر را انجام می‌دهند:

  • نصب Docker.
  • اضافه‌کردن کلید GPG رسمی Docker برای اعتبارسنجی.
  • اضافه‌کردن ریپوزیتوری رسمی Docker.
  • نصب ماژول Docker برای Python.
با ثبت‌نام در لیارا، ۱۰۰ هزار تومان اعتبار هدیه بگیرید و از سرور مجازی رایگان با کیفیت بالا و امکانات عالی استفاده کنید!
پشتیبانی ۲۴ ساعته برای کاربران سرور مجازی رایگان!
خرید سرور مجازی رایگان

مرحله چهارم: افزودن ایمیج docker و تسک کانتینر به Playbook

در این مرحله، فرآیند ایجاد کانتینرهای Docker آغاز خواهد شد. ابتدا، با استفاده از دستور docker pull، ایمیج‌های موردنظر از Docker Hub رسمی به‌طور پیش‌فرض دانلود می‌شوند. پس از دریافت ایمیج‌ها، کانتینرها بر اساس تنظیمات و مشخصاتی که در متغیرهای مربوطه تعیین کرده‌اید، ایجاد خواهند شد.

برای انجام این عملیات، از کد زیر در Playbook خود استفاده کنید:

- name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

در این کد:

  • Pull the default container image: در این تسک، ایمیج موردنظر از Docker Hub با استفاده از متغیر default_container_image دانلود می‌شود.
  • Create containers: در این تسک، تعداد کانتینرها طبق متغیر container_count ایجاد می‌شود. هر کانتینر با استفاده از ایمیج مشخص‌شده در default_container_image ساخته می‌شود و دستور default_container_command در آن اجرا می‌شود.
  • با استفاده از این تسک‌ها، می‌توانید تعداد مشخصی کانتینر را با تنظیمات دلخواه خود ایجاد کرده و به‌طور خودکار آن‌ها را راه‌اندازی کنید.

در این مرحله ابتدا ایمیج پیش‌فرض داکر از داکر هاب را دریافت کرده و سپس کانتینرها را ایجاد کردیم.

مرحله پنجم: بررسی پیکربندی Playbook

توجه داشته باشید که در این مرحله پلی‌بوک شما باید به شکل زیر باشد، اگر تنظیمات را به‌درستی انجام داده باشید.

---
- hosts: all
  become: true
  vars:
    container_count: 4
    default_container_name: docker
    default_container_image: ubuntu
    default_container_command: sleep 1d

  tasks:
    - name: Install aptitude
      apt:
        name: aptitude
        state: latest
        update_cache: true

    - name: Install required system packages
      apt:
        pkg:
          - apt-transport-https
          - ca-certificates
          - curl
          - software-properties-common
          - python3-pip
          - virtualenv
          - python3-setuptools
        state: latest
        update_cache: true

    - name: Add Docker GPG apt Key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present

    - name: Add Docker Repository
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu jammy stable
        state: present

    - name: Update apt and install docker-ce
      apt:
        name: docker-ce
        state: latest
        update_cache: true

    - name: Install Docker Module for Python
      pip:
        name: docker

    - name: Pull default Docker image
      community.docker.docker_image:
        name: "{{ default_container_image }}"
        source: pull

    - name: Create default containers
      community.docker.docker_container:
        name: "{{ default_container_name }}{{ item }}"
        image: "{{ default_container_image }}"
        command: "{{ default_container_command }}"
        state: present
      with_sequence: count={{ container_count }}

بهتر است بدانید که پلی‌بوک شما کاملاً انعطاف‌پذیر است و می‌توانید آن را متناسب با نیازهای خود شخصی‌سازی کنید. برای مثال، می‌توانید با استفاده از ماژول docker_image، ایمیج‌های Docker را برای Push کردن به Docker Hub استفاده کنید یا با ماژول docker_container، شبکه‌های کانتینری را پیکربندی و مدیریت کنید.

پس از اعمال تغییرات، پلی‌بوک را ذخیره کرده و از ویرایشگر متن خارج شوید تا تنظیمات جدید اجرا شوند.

مرحله ششم: اجرای Playbook

در این مرحله آماده‌اید که این پلی‌بوک را روی یک یا چند سرور اجرا کنید. به‌طور پیش‌فرض بیشتر پلی‌بوک‌ها برای اجرا روی تمام سرورهای موجود در فهرست شما تنظیم شده‌اند. اما در اینجا شما سرور مورد نظر خود را مشخص خواهید کرد.

برای اجرای پلی‌بوک تنها روی server1 و اتصال با کاربر sammy، می‌توانید از دستور زیر استفاده کنید:

ansible-playbook playbook.yml -l server1 -u sammy

در این دستور:

  • -i inventory_file مسیر فایل فهرست (inventory) که شامل جزئیات سرورهای شماست را مشخص می‌کند.
  • -u sammy کاربر sammy را برای ورود به سرور با SSH تعیین می‌کند.
  • --limit server1 اجرای پلی‌بوک را به‌طور خاص روی server1 محدود می‌کند.

مطمئن شوید که inventory_file را با مسیر صحیح فایل فهرست خود جایگزین کنید.

نتیجه دستور بالا مشابه زیر است:

Output
. . .
changed: [server1]

TASK [Create default containers] *****************************************************************************************************************
changed: [server1] => (item=1)
changed: [server1] => (item=2)
changed: [server1] => (item=3)
changed: [server1] => (item=4)

PLAY RECAP ***************************************************************************************************************************************
server1              	: ok=9	changed=8	unreachable=0	failed=0	skipped=0	rescued=0	ignored=0   

این خروجی نشان می‌دهد که تنظیمات سرور شما به‌طور کامل انجام شده است! ممکن است خروجی شما دقیقاً مشابه نباشد، اما نکته مهم این است که هیچ‌گونه خطایی در روند اجرا نداشته باشید.

وقتی که پلی‌بوک به پایان رسید، وارد سروری که توسط Ansible provision شده است شوید تا بررسی کنید که آیا کانتینرها با موفقیت ایجاد شده‌اند یا خیر.

برای وارد شدن به سرور از طریق SSH از دستور زیر استفاده کنید:

ssh sammy@your_remote_server_ip

بعد از ورود به سرور ،می‌توانید وضعیت کانتینرهای داکر را با دستور زیر بررسی کنید:

sudo docker ps -a

خروجی نمونه:

CONTAINER ID    	IMAGE           	COMMAND         	CREATED         	STATUS          	PORTS           	NAMES
a3fe9bfb89cf    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker4
8799c16cde1e    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker3
ad0c2123b183    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker2
b9350916ffd8    	ubuntu          	"sleep 1d"      	5 minutes ago   	Created                             	docker1

خروجی بالا به این معناست که کانتینرهای تعریف شده در پلی‌بوک با موفقیت ایجاد شده‌اند. از آن‌جا که این آخرین تسک در پلی‌بوک بود، این موضوع همچنین تأیید می‌کند که پلی‌بوک به‌طور کامل روی این سرور اجرا شده است.

در آخر هم برای بررسی لاگ‌های یک کانتینر خاص، می‌توانید از دستور زیر استفاده کنید:

docker logs <container_name_or_id>

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

جمع‌بندی

تبریک می‌گوییم:) شما با موفقیت پلی‌بوک Ansible را اجرا کرده و سرورهای خود را به‌طور خودکار پیکربندی کردید. حالا با استفاده از این ابزار قدرتمند، می‌توانید زیرساخت‌های سرور خود را به‌راحتی مدیریت کنید و از مزایای آن بهره‌مند شوید. با استفاده از Ansible، نه تنها می‌توانید فرآیند نصب و پیکربندی سرورها را سرعت ببخشید، بلکه از استانداردسازی و یکپارچگی در پیکربندی‌های خود نیز اطمینان حاصل خواهید کرد. این خودکارسازی به شما کمک می‌کند تا مقیاس‌پذیری را به سادگی مدیریت کنید و تنظیمات جدید را به‌طور سریع و بدون خطا روی چندین سرور اعمال کنید. در نتیجه، با کاهش نیاز به دخالت دستی، خطاهای انسانی نیز به حداقل می‌رسد و سرورهای شما به‌طور مداوم و به‌روز باقی می‌مانند. Ansible با فراهم کردن Playbook‌های قابل تکرار، این امکان را برای شما فراهم می‌کند که زیرساخت‌های خود را به‌طور کارآمد و بدون نگرانی از پیکربندی‌های ناسازگار مدیریت کنید.

سوالات متداول

۱. Ansible چیست و چه کاربردی دارد؟

Ansible یک ابزار اتوماسیون زیرساخت است که به شما امکان می‌دهد پیکربندی سرورها، استقرار نرم‌افزارها و مدیریت وظایف را به‌صورت خودکار و کد‌محور انجام دهید.

۲. Playbook در Ansible چیست؟

Playbook فایلی با فرمت YAML است که مجموعه‌ای از دستورات و تنظیمات را برای انجام وظایف خودکارسازی در خود جای داده است. با استفاده از پلی‌بوک، می‌توانید مراحل نصب، پیکربندی و اجرای برنامه‌ها را مشخص کنید و این فرآیندها را به‌صورت استاندارد و تکرارپذیر انجام دهید.

۳. آیا Ansible فقط برای سرورهای لینوکسی قابل استفاده است؟

خیر، اگرچه Ansible بیشتر برای مدیریت سرورهای لینوکسی استفاده می‌شود، اما از طریق ماژول‌های مخصوص، می‌تواند سیستم‌های ویندوزی را نیز پیکربندی و مدیریت کند.

۴. چرا باید از Ansible برای نصب و مدیریت Docker استفاده کنم؟

با استفاده از Ansible می‌توانید Docker را روی چندین سرور به‌طور هم‌زمان و بدون نیاز به انجام تنظیمات دستی نصب کنید. این روش نه‌تنها سرعت و دقت را افزایش می‌دهد، بلکه احتمال خطای انسانی را نیز کاهش می‌دهد.

به اشتراک بگذارید