اگر به دنبال آموزش کامل نصب داکر با انسیبل هستید، این مقاله را تا انتها مطالعه کنید! در حال حاضر، به دلیل ماهیت یکبار مصرف محیطهای کاربردی مدرن، خودکارسازی سرور نقش مهمی در مدیریت سیستم ایفا میکند. ابزارهایی مانند Ansible معمولا برای مدیریت پیکربندی و سادهسازی فرایند نصب خودکار سرور و کاهش خطاهای انسانی مرتبط با تنظیمات دستی، استفاده میشوند.
Ansible دارای یک معماری ساده است و برای استفاده از آن، نیازی به نرمافزار خاص برای نصب گرهها ندارید. همچنین، این ابزار، مجموعهای قوی از ویژگیها و ماژولهای داخلی را فراهم میکند و با استفاده از آن میتوانید کار نوشتن اسکریپتهای اتوماسیون را به راحتی انجام دهید.
در راهنمای نصب داکر با انسیبل، نحوهی استفاده از Ansible و همچنین نحوهی نصب و استفاده از Docker در Ubuntu 22.04 را شرح میدهیم. Docker برنامهای است که کار سادهسازی مدیریت کانتینرها را یا به عبارتی دیگر، فرایندهای جداشده از منابع را که به روشی مشابه ماشینهای مجازی رفتار میکنند، انجام میدهد. این ابزار، قابل حمل بوده و به سیستم عامل میزبان وابسته است.
پیش نیازهای نصب داکر با انسیبل
در زمان نصب داکر با انسیبل، برای اجرای تنظیمات خودکار روی پلی بوک انسیبل (Ansible playbook)، به موارد زیر نیاز دارید:
- یک گره کنترلی Ansible: یک ماشین Ubuntu 22.04 با Ansible نصب و پیکربندی میشود تا با استفاده از کلیدهای SSH به هاست Ansible خود متصل شود. شما باید مطمئن شوید که گره کنترل، دارای یک کاربر معمولی با مجوزهای sudo و فایروال فعال است.
- یک یا چند هاست Ansible: باید یک یا چند سرور Ubuntu 22.04 ریموت را برای خودکارسازی تنظیمات اولیهی سرور در اوبونتو 22.04 تنظیم کنید.
نکته: قبل از ادامه، باید مطمئن شوید که گره کنترلی Ansible قادر به اتصال و اجرای دستورات روی میزبان یا میزبانهای Ansible شماست.
Ansible playbook چه کاری را انجام میدهد؟
Ansible playbook جایگزینی برای اجرای دستی روش نصب و استفاده از داکر روی Ubuntu 22.04 است. شما میتوانید پلی بوک خود را یک بار تنظیم کرده و بعد از آن برای هر نصب، از آن استفاده کنید. با اجرای این پلی بوک، اقدامات زیر بر روی هاست Ansible شما انجام میشود:
- نصب aptitude که توسط Ansible به عنوان جایگزینی برای مدیر پکیج apt ترجیح داده میشود.
- نصب پکیجهای سیستمی موردنیاز.
- نصب کلید Docker GPG APT.
- اضافه کردن مخزن رسمی Docker به منابع apt.
- نصب Docker.
- نصب ماژول Python Docker از طریق pip.
- Pull کردن پیشفرض مشخص شده توسط default_container_image از طریق Docker Hub.
- ایجاد تعداد کانتینرهای تعریف شده توسط متغیر container_count که هر کدام با استفاده از ایمیج تعریف شده توسط default_container_image و دستور تعریف شده در default_container_command در هر کانتینر جدید اجرا میشوند.
پس از اتمام اجرای playbook، تعدادی کانتینر بر اساس گزینههایی که در متغیرهای پیکربندی خود تعریف کردهاید، ایجاد میشوند.
برای شروع، وارد یک کاربر دارای دسترسی sudo در سرور گره کنترل Ansible خود شوید.
نصب داکر با انسیبل
مرحله 1 – آماده کردن Playbook
فایل playbook.yml جایی است که تمام وظایف یا taskهای شما در آن تعریف میشود. یک task، کوچکترین واحد عملی است که میتوانید با استفاده از Ansible playbook آن را خودکار کنید. در ابتدا، باید فایل playbook را با استفاده از ویرایشگر متن دلخواهتان، ایجاد کنید:
$ nano playbook.yml
با اجرای دستور بالا، یک فایل YAML خالی باز میشود. قبل از اضافه کردن taskها به playbook خود، باید موارد زیر را اضافه کنید:
---
- hosts: all
become: true
vars:
container_count: 4
default_container_name: docker
default_container_image: ubuntu
default_container_command: sleep 1
تقریبا هر playbook که با آن سروکار داریم، با اعلانهایی مشابه این شروع میشود. میزبان یا hosts اعلام میکند که گره کنترل Ansible کدام سرورها را با این playbook هدف قرار میدهد. Become مشخص میکند که آیا همهی دستورات با امتیازات ریشهی افزایش یافته انجام میشوند یا خیر.
Vars به شما امکان میدهد تا دادهها را در متغیرها ذخیره کنید. اگر تصمیم به تغییر این موارد در آینده دارید، کافی است این خطوط را در فایلتان ویرایش کنید. در این قسمت، توضیح مختصری در مورد هر متغیر میدهیم:
- container_count: تعداد کانتینرهایی که باید مشخص شوند را نشان میدهد.
- default_container_name: نام کانتینرهای پیشفرض را نشان میدهد.
- default_container_image: ایمیج پیشفرض Docker را برای استفاده در زمان ایجاد کانتینرها، مشخص میکند.
- default_container_command: دستور پیشفرض برای اجرا در کانتینرهای جدید را نشان میدهد.
نکته: اگر میخواهید فایل playbook را در وضعیت نهاییاش ببینید. به مرحلهی 5 بروید. فایلهای YAML با ساختار تورفتگی خاصشان مشخص شدهاند؛ بنابراین، میتوانید پس از افزودن تمام taskها، playbook خود را دوباره بررسی کنید.
مرحلهی 2 – اضافه کردن Taskهای نصب پکیج Playbook
به طور پیشفرض، Taskها توسط Ansible به صورت همزمان و به ترتیب از بالا به پایین در Playbook شما اجرا میشوند. این بدان معناست که ترتیب Taskها مهم است و شما خیالتان از بابت اجرای یک Task قبل از شروع کار بعدی، راحت خواهد بود.
همهی Taskها در این playbook میتوانند به تنهایی اجرا شده و در سایر playbookهای شما، مجددا استفاده شوند.
یکی از اولین taskها یعنی نصب aptitude، ابزاری است که از آن برای ارتباط با مدیر پکیج سرور مجازی لینوکس و نصب پکیجهای سیستم موردنیاز استفاده میشود و شما باید آن را اضافه کنید. Ansible از نصب این پکیجها بر روی سرور شما مطمئن میشود:
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
در اینجا، شما از ماژول داخلی apt Ansible برای هدایت Ansible برای نصب پکیجهایتان استفاده میکنید. ماژولها در Ansible به عنوان میانبرهایی برای اجرای عملیاتی عمل میکنند و در غیر اینصورت، باید آنها را به عنوان دستورات bash خام اجرا کنید. در صورتی که aptitude در دسترس نباشد، Ansible به apt برای نصب پکیجها برمیگردد، اما به طور کلی، aptitude را ترجیح میدهد.
در زمان نصب داکر با انسیبل شما میتوانید پکیجهای موردنظرتان را اضافه یا حذف کنید. با این کار، مطمئن میشوید که نه تنها همهی پکیجها موجود هستند، بلکه در آخرین نسخهی خود نیز وجود دارند و پس از فراخوانی بروزرسانی با apt، به آنها دسترسی دارید.
مرحلهی 3 – افزودن Taskهای نصب Docker به Playbook
به مرحله سوم نصب داکر با انسیبل رسیدیم!
Task شما در زمان نصب داکر، آخرین نسخهی Docker را از مخزن رسمی نصب میکند. کلید Docker GPG برای تایید دانلود اضافه شده است و مخزن رسمی به عنوان منبع پکیج اضافه میشود و در نهایت، Docker نصب میشود. علاوه براین، با اجرای دستور زیر، ماژول Docker برای پایتون نیز نصب میشود:
- 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
مشاهده میکنید که ماژولهای Ansible داخلی apt_key و apt_repository در ابتدا به آدرسهای اینترنتی اشاره کرده و سپس یک task احتمال وجود آنها (present) را برعهده میگیرد. با این دستور، امکان نصب آخرین نسخهی Docker به همراه استفاده از pip برای نصب ماژول برای پایتون را فراهم میکند.
مرحلهی 4 – افزودن Docker Image و Container Tasks به Playbook
ایجاد کانتینرهای Docker شما از این مرحله با pull کردن ایمیج Docker موردنظر شروع میشود. به طور پیشفرض، این ایمیجها از 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 }}
در کد بالا، از docker_image برای pull کردن ایمیج داکری که میخواهید به عنوان پایهی کانتینر استفاده کنید، استفاده میشود. docker_container نیز به شما اجازه میدهد تا مشخصات کانتینرهایی که ایجاد میکنید را به همراه دستوری که میخواهید آنها را ارسال کنید، مشخص کنید.
دستور with_sequence یک روش Ansible برای ایجاد یک حلقه است و با آن، کانتینرهای شما با توجه به تعداد تعیینشده در حلقه، ایجاد میشوند. این حلقه، یک حلقهی شمارش اولیه است و متغیر item عددی که تکرار حلقه را مشخص میکند را نشان میدهد. این شماره در اینجا، برای نامگذاری کانتینرهای شما استفاده میشود.
مرحلهی 5 – Playbook خود را مرور کنید.
در این مرحله، 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 }}
شما میتوانید playbook را مطابق به نیازهای فردیتان تغییر دهید. به عنوان مثال، میتوانید از ماژول docker_image برای push کردن ایمیج به Docker Hub و یا از ماژول docker_container برای راه اندازی شبکههای کانتینری استفاده کنید.
زمانی که پس از بررسی، playbook را مطابق با سلیقهی خود یافتید، میتوانید از ویرایشگر متن خارج شده و نتایج را ذخیره کنید.
توجه: در بسیاری از موارد، خطاهایی که دریافت میکنید به خاطر رعایتنکردن تورفتگیها در کدنویسی است. YAML پیشنهاد میکند که برای ایجاد تورفتگی از دو فاصله استفاده کنید.
مرحلهی 6 – راهاندازی Playbook
حال به مرحلهای رسیدیم که میتوانید Playbook خود را در یک یا چند سرور اجرا کنید. اکثر Playbookها به طور پیشفرض، طوری پیکربندی شدهاند که در هر سروری اجرا میشوند. با این حال، در اینجا باید سرور خود را مشخص کنید.
برای اجرای Playbook در فقط server1 که به صورت Sammy متصل میشود، دستور زیر را اجرا کنید:
$ ansible-playbook playbook.yml -l server1 -u sammy
پرچم -l سرور شما و پرچم -u کاربری که در سرور ریموت وارد میشود را مشخص میکنند. خروجی دستور بالا، چیزی شبیه به دستور زیر است:
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
خروجی بالا، نشان میدهد که راهاندازی سرور کامل شده است. البته، خروجی شما نباید عینا شبیه به خروجی بالا باشد. با این حال، مهم است که هیچ خطایی دریافت نکنید.
پس از تمامشدن اجرای playbook، میتوانید از طریق SSH وارد سرور ارائهشده توسط Ansible شده و بررسی کنید که آیا کانتینرها با موفقیت ایجاد شدهاند یا خیر.
برای ورود به سرور ریموت، دستور زیر را اجرا کنید:
$ ssh sammy@your_remote_server_ip
و کانتینر Docker را با دستور زیر بر روی سرور ریموت، لیست کنید:
$ sudo docker ps -a
پس از اجرای دستور بالا، باید یک خروجی شبیه به خروجی زیر را ببینید:
Output
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
خروجی بالا، نشان میدهد که کانتینرهای تعریف شده در playbook با موفقیت ایجاد شدهاند. از آنجایی که این آخرین کار در playbook بود، خروجی بالا تایید میکند که playbook به صورت کامل بر روی این سرور، اجرا شده است.
سخن پایانی
در این راهنما، به طور مفصل دربارهی نصب داکر با انسیبل و راه اندازی آن صحبت کردیم. با تنظیم خودکار زیرساختها، نه تنها در زمان صرفه جویی خواهید کرد، بلکه مطمئن میشوید که سرورهایتان از یک پیکربندی استاندارد پیروی کرده و مطابق با نیازهای شما سفارشی میشوند. باتوجه به ماهیت توزیع شدهی برنامههای کاربردی مدرن و نیاز به سازگاری بین محیطهای مرحلهبندی شدهی مختلف، اتوماسیون به یکی از اجزای اصلی در فرایندهای توسعهی تیمهای مختلف، تبدیل شده است.