آنچه در این مقاله میخوانید
- پیشنیازها
- پلیبوک (Playbook) چیست؟
- نحوه انجام کار Playbook
- مرحله اول: آمادهسازی Playbook
- مرحله دوم: اضافه کردن تسک نصب پکیجها به Playbook
- مرحله سوم: اضافه کردن تسک نصب داکر به Playbook
- مرحله چهارم: افزودن ایمیج docker و تسک کانتینر به Playbook
- مرحله پنجم: بررسی پیکربندی Playbook
- مرحله ششم: اجرای Playbook
- جمعبندی
- سوالات متداول
راهاندازی 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 استفاده کنند تا هماهنگی و سازگاری لازم با دستورالعملهای این آموزش برقرار باشد.
به شدت توصیه میشود قبل از مطالعه این آموزش، مقالههای زیر را بخوانید:
- نحوه راهاندازی اولیه سرور مجازی با اوبونتو Ubuntu
- SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
پلیبوک (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 را روی چندین سرور بهطور همزمان و بدون نیاز به انجام تنظیمات دستی نصب کنید. این روش نهتنها سرعت و دقت را افزایش میدهد، بلکه احتمال خطای انسانی را نیز کاهش میدهد.