Maestro: Mastering Ansible با Docker از Drudgery دستی تا Automation

این پست وبلاگ شما را از سختیهای پیکربندی دستی سرور دور میکند و با Ansible ✨ به قلمرو توانمندسازی خودکارسازی میرود. آیا تا به حال احساس کرده اید که یک سرآشپز راک استار هستید، مجبور شده اید همه سبزیجات را با دست خرد کنید، ادویه ها را به دقت اندازه بگیرید ⚖️، و برای هر غذا از ابتدا آتش بسازید؟ این دقیقا همان چیزی است که من هنگام پیکربندی دستی سرورها احساس کردم!
نترسید، دوستان علاقهمند به اتوماسیون! Ansible، یک ابزار مدیریت پیکربندی قدرتمند، دستور العمل عالی برای تسلط بر اتوماسیون را ارائه می دهد. این پست وبلاگ شما را با دانش راه اندازی یک محیط محلی Ansible با استفاده از Docker مجهز می کند و زمین بازی اتوماسیون شخصی خود را ایجاد می کند.
چرا Ansible را یاد بگیریم؟
دو دلیل اصلی به ماجراجویی یادگیری Ansible من دامن زد:
- اتوماسیون راه اندازی محلی: کاوش من در توزیعهای مختلف لینوکس برای راهاندازی ایدهآلام اغلب باعث میشود که در آرزوی راهی سریع برای بازگشت به پیکربندی آشنا باشم. Ansible مانند یک شوالیه در زره درخشان ️️ وارد شد و به من این امکان را داد که این فرآیند را خودکار کرده و محیط مورد نظر خود را در یک لحظه به دست بیاورم ⚡️.
- اتوماسیون سرور از راه دور: اخیراً این فرصت را داشتم که یک سرور و یک خط لوله CI/CD راه اندازی کنم. این شامل بسیاری از کارهای تکراری مانند نصب بسته های خاص سیستم عامل، پیکربندی پراکسی های معکوس، تولید کلیدهای SSH و راه اندازی مخازن محلی است. Ansible راهی برای خودکارسازی این وظایف پیش از پروژه ارائه کرد و فرآیند توسعه را ساده کرد. به یاد داشته باشید، با اتوماسیون، کارایی به همراه میآید، اما همیشه عاقلانه است که از «خارهای» بالقوه (خطاها یا رفتار غیرمنتظره) که ممکن است به وجود بیایند آگاه باشید.
چرا یک راهاندازی محلی را از طریق ابر انتخاب کنید؟ ☁️
در حالی که پلتفرم های ابری مانند AWS منابع و آموزش های آنلاین به راحتی در دسترس را ارائه می دهند، من یک راه اندازی محلی را انتخاب کردم. این تصمیم، اگرچه به تلاش بیشتری نیاز داشت، اما تجربه عملی ارزشمندی را به خصوص در مورد SSH ارائه کرد. این دانش بدون شک در دراز مدت مفید خواهد بود.
*پیش نیازها *
- داکر: https://www.docker.com/
-
ویرایشگر متن: در حالی که گزینه هایی مانند VS Code، Neovim و Zed گزینه های محبوبی هستند، حتی یک ویرایشگر متن ساده مانند Notepad نیز کار خواهد کرد. جادو در ترمینال اتفاق می افتد! 🪄
ساختار پوشه
Learn-Ansible/
│ ├── hosts
│ └── playbooks/
│ ├── ping.yml
│ ├── gather_facts.yml
│ ├── log_os.yml
│ ├── run_all.yml
│ ├── Dockerfile (Optional: Create a custom Ansible Docker image)
│ ├── docker-compose.yml (Optional: Manage all Docker services with a single command)
# and so on…
ابهام زدایی از ساختار پوشه: نقشه راه شما برای اتوماسیون Ansible
اکنون که از فتح اتوماسیون با Ansible و Docker خسته شده اید، بیایید ساختار پوشه ای را که نقشه راه شما به سوی موفقیت خواهد بود، بررسی کنیم. به آن به عنوان یک آشپزخانه خوب سازماندهی شده فکر کنید – همه چیز مکان مشخص خود را دارد، و پیدا کردن مواد لازم (کتاب های بازی) را که برای به دست آوردن جادوی اتوماسیون نیاز دارید آسان می کند ✨.
ریشه اتوماسیون: یادگیری-پاسخگو
این دایرکتوری اصلی است که همه چیزهای Ansible شما را در خود جای می دهد. آن را به عنوان انباری پر از پتانسیل خود برای خودکارسازی کارهای مختلف تصور کنید.
مواد ضروری: فایل میزبان
داخل Learn-Ansible
، شما را پیدا خواهید کرد hosts
فایل. اینجاست که سرورها یا سیستمهایی را که Ansible مدیریت میکند، مانند لوازم آشپزخانه مطمئن خود (لپتاپ، سرور و غیره) تعریف میکنید. هر سرور را می توان با نام میزبان یا آدرس IP خود فهرست کرد و به Ansible اجازه می دهد آنها را شناسایی و پیکربندی کند.
جعبه دستور غذا: فهرست راهنمای کتابهای بازی
این قلب آشپزخانه اتوماسیون شماست! در اینجا، کتابهای بازی Ansible – اساساً دستور العملهای خود – را ایجاد میکنید که وظایف خاصی را که میخواهید Ansible بر روی سرورهای مدیریت شده شما انجام دهد، مشخص میکند. هر کتاب پخش معمولاً یک فایل YAML است (دستورالعملهای دستور غذا را در نظر بگیرید!) که مراحل پیکربندی نرمافزار، مدیریت فایلها یا اجرای دستورات را شرح میدهد.
ما در بخش بعدی به ایجاد کتابهای بازی خواهیم پرداخت، اما در حال حاضر، درک کنید که جادو در اینجا اتفاق میافتد!
داستان سرایی بس است، بیایید اکنون وارد کد شویم!
اکنون که چرایی و چگونگی استفاده از Docker برای راهاندازی محلی Ansible را بررسی کردیم، بیایید به خود کد بپردازیم. ما سه بخش اصلی را پوشش خواهیم داد:
- راه اندازی محلی با Dockerfile و تولید تصویر داکر با استفاده از
docker build
- ایجاد یک ظرف با استفاده از تصویر تولید شده در مرحله قبل با استفاده از
docker-compose
- بازی با Ansible
راه اندازی محلی با Dockerfile
# Use the official image as a parent image
FROM ubuntu
# Update the system, install OpenSSH Server, and set up users
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y openssh-server && apt-get install sudo -y && apt-get install sshpass -y
# Create user and set password for user and root user
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1000 ubuntu && \
echo 'ubuntu:your_secret_password_here' | chpasswd && \
echo 'root:your_secret_password_here' | chpasswd
# Set up configuration for SSH
RUN mkdir /var/run/sshd && \
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd && \
echo "export VISIBLE=now" >> /etc/profile
# Expose the SSH port
EXPOSE 22
# Run SSH
CMD ["/usr/sbin/sshd", "-D"]
توضیحات کامل در مورد Dockerfile
ارائه شده است Dockerfile
یک تصویر Docker سفارشی را تعریف می کند که به طور خاص برای اجرای Ansible در یک کانتینر طراحی شده است. در اینجا یک تفکیک کد آمده است:
1. تصویر پایه:
Dockerfile
FROM ubuntu
این خط با استفاده از رسمی پایه و اساس تصویر ما را تنظیم می کند ubuntu
تصویر از داکر هاب این تصویر یک محیط لینوکس پایه با بسته های ضروری از پیش نصب شده ارائه می دهد.
2. به روز رسانی سیستم و نصب بسته:
RUN apt-get update && apt-get upgrade -y && \
apt-get install -y openssh-server sudo sshpass
این بلوک کد چندین عمل را انجام می دهد:
-
apt-get update
: لیست بسته های موجود را از مخازن به روز می کند. -
apt-get upgrade -y
: تمام بسته های نصب شده را به آخرین نسخه خود ارتقا می دهد (-y
پرچم از اعلان های تایید عبور می کند). -
apt-get install -y openssh-server sudo sshpass
: سه بسته مهم را نصب می کند: –openssh-server
: عملکرد سرور SSH را در ظرف فعال می کند و به شما امکان می دهد از راه دور متصل شوید. –sudo
: امتیازات بالایی را برای اجرای دستورات با حقوق اداری فراهم می کند. –sshpass
: ابزاری که به شما امکان می دهد رمز عبور SSH را در خط فرمان مشخص کنید و اتوماسیون را ساده می کند.
3. ایجاد کاربر و تنظیم رمز عبور:
RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1000 ubuntu && \
echo 'ubuntu:your_sudo_password_here' | chpasswd && \
echo 'root:your_sudo_password_here' | chpasswd
این بخش دو کاربر ایجاد می کند:
-
ubuntu
: این کاربر برای تعامل با کانتینر استفاده خواهد شد. –-rm
: کاربر را پس از پایان کانتینر حذف می کند. –-d /home/ubuntu
: فهرست اصلی را برای کاربر تنظیم می کند. –-s /bin/bash
: پوسته پیش فرض را برای کاربر تعریف می کند (bash). –-g root -G sudo
: کاربر را بهroot
وsudo
گروه ها، اعطای امتیازات اداری. –-u 1000
: شناسه کاربر (UID) را روی 1000 تنظیم می کند (که معمولاً برایubuntu
کاربر). -
root
: کاربر root نیز همان رمز عبور ایجاد و به آن اختصاص داده می شودubuntu
کاربر. توجه داشته باشید: به طور کلی توصیه نمی شود که به دلایل امنیتی به عنوان روت در کانتینرها اجرا شود.
4. پیکربندی SSH:
RUN mkdir /var/run/sshd && \
sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd && \
echo "export VISIBLE=now" >> /etc/profile
این دستورات سرور SSH را در ظرف پیکربندی می کند:
-
mkdir /var/run/sshd
: دایرکتوری مورد نیاز دیمون SSH را ایجاد می کند. -
sed
: ابزار خط فرمان برای دستکاری متن. در اینجا، دو فایل را اصلاح می کند: –/etc/ssh/sshd_config
: این فایل رفتار سرور SSH را کنترل می کند. اینsed
دستور جایگزین خط می شودPermitRootLogin prohibit-password
باPermitRootLogin yes
، اجازه ورود به ریشه از طریق SSH (احتیاط: با احتیاط استفاده کنید!). –/etc/pam.d/sshd
: این فایل فرآیند احراز هویت را برای SSH تعریف می کند. اینsed
دستور یک خط مربوط به را تغییر می دهدpam_loginuid.so
ماژول، به طور بالقوه ورود برای اسکریپت های اتوماسیون را ساده می کند (برای جزئیات به مستندات مراجعه کنید). -
echo "export VISIBLE=now" >> /etc/profile
: این خط یک متغیر محیطی را به نمایه کاربر اضافه می کند، که به طور بالقوه به برنامه های گرافیکی درون ظرف کمک می کند (برای موارد استفاده خاص به مستندات مراجعه کنید).
5. افشای پورت SSH:
EXPOSE 22
این خط پورت 22 (درگاه استاندارد SSH) کانتینر را نشان می دهد. این به شما امکان می دهد با استفاده از SSH از دستگاه محلی خود به ظرف متصل شوید.
6. اجرای SSH Daemon:
CMD ["/usr/sbin/sshd", "-D"]
این خط دستور پیش فرض را برای کانتینر تنظیم می کند. دیمون SSH را اجرا می کند (/usr/sbin/sshd
) با -D
flag، که حالت پسزمینه را فعال میکند و کانتینر را حتی پس از قطع اتصال از جلسه SSH در حال اجرا نگه میدارد.
چرا داکرفایل؟ چرا خود تصویر اوبونتو نیست؟
تصویر پایه اوبونتو ممکن است فاقد بستههای خاص مورد نیاز برای گردش کار Ansible شما باشد. Dockerfile ارائه شده با نصب ابزارهای ضروری این مشکل را برطرف می کند:
openssh-server
: عملکرد SSH را در ظرف برای مدیریت از راه دور فعال می کند.sudo
: برای کارهای اداری که اغلب مورد نیاز Ansible است امتیازات بالایی اعطا می کند.sshpass
: اتوماسیون را با تعیین رمز عبور SSH در خط فرمان ساده می کند.علاوه بر این، یک Dockerfile به شما امکان می دهد یک کاربر جدید به طور خاص برای آزمایش های خود ایجاد کنید (به عنوان مثال،
ubuntu
در این مورد). این کاربر اختصاصی به عنوان نقطه اصلی تعامل شما در ظرف برای اجرای کتابهای بازی Ansible و مدیریت پیکربندیها عمل میکند.در اصل، Dockerfile کنترل بیشتری را فراهم میکند، از وجود ابزارهای لازم اطمینان میدهد و محیطی تمیز برای تلاشهای اتوماسیون Ansible شما ایجاد میکند.
ایجاد یک کانتینر اوبونتو قابل دسترسی SSH با Docker Compose
این راهنما روند راه اندازی یک ظرف اوبونتو قابل دسترسی از طریق SSH با استفاده از Docker Compose را شرح می دهد.
پیش نیازها:
- Docker روی سیستم شما نصب و اجرا می شود.
مراحل:
1. پیکربندی Docker Compose را تعریف کنید:
یک فایل به نام ایجاد کنید docker-compose.yml
با محتوای زیر:
version: "3.8"
services:
ubuntu-ssh:
image: ubuntu-ssh
container_name: ansible-node
ports:
- "2222:22"
– این پیکربندی سرویسی به نام را تعریف می کند ubuntu-ssh
که از ubuntu-ssh
تصویر
– ظرف نامگذاری خواهد شد ansible-node
.
– پورت 2222 در ماشین میزبان به پورت 22 (درگاه SSH پیش فرض) در داخل کانتینر نگاشت شده است و امکان دسترسی از راه دور را فراهم می کند.
2. ظرف را راه اندازی کنید:
یک ترمینال را باز کنید و به دایرکتوری حاوی آن بروید docker-compose.yml
فایل. دستور زیر را اجرا کنید:
docker-compose up -d
– این دستور به Docker Compose دستور می دهد تا ظرف را در حالت جدا شده بسازد و راه اندازی کند (-d
).
3. به ظرف متصل شوید:
از دستور زیر برای ایجاد یک اتصال SSH به کانتینر استفاده کنید:
ssh -o PubkeyAuthentication=no ubuntu@localhost -p 2222
– توضیح:
–ssh
: اتصال SSH را راه اندازی می کند.
–-o PubkeyAuthentication=no
: احراز هویت کلید عمومی را غیرفعال می کند (روش های ایمن تر به طور پیش فرض تلاش شده است).
–ubuntu@localhost
: نام کاربری را مشخص می کند (ubuntu
) و نام میزبان (localhost
).
–-p 2222
: شماره پورت را مشخص می کند (2222
) برای اتصال.
کمربندت رو ببند, Ansible ماجراجو! آماده باشید تا ابرقدرت های اتوماسیون خود را در این زمینه آزاد کنید با شکوه زمین بازی Ansible! برای تسخیر کوه های وظایف و کشتی گرفتن سرورها روی زمین آماده شوید (البته با عشق) این بوت کمپ شخصی Ansible شما است، جایی که یادگیری در آن انجام می شود. حماسه و امکانات هستند
بی پایان
می خواهید anisble را نصب کنید؟
pip install ansible
اگرچه من یک راه بسیار ساده برای نصب ansible ارائه کرده ام، اما همیشه خوب است که راه های دیگری برای نصب ansible بدانید.
Demystifying Ansible: واژه نامه ای برای نینجاهای اتوماسیون
همانطور که ما قابلیتهای Ansible را بررسی کردهایم، ممکن است در ابتدا برای شیرجه رفتن به سمت اتوماسیون احساس خارش کنید. اما برای اطمینان از اینکه سفرهای اتوماسیون شما روان است، بیایید درک خود را از برخی از اصطلاحات کلیدی Ansible تقویت کنیم.
-
وظایف: آرسنال اتوماسیون شما
– وظایف را به عنوان اجزای سازنده اتوماسیون در نظر بگیرید. آنها اقدامات خاصی مانند نصب بسته های نرم افزاری، شبیه سازی مخازن Git، پیکربندی پوسته ها یا ایجاد کاربران sudo را نشان می دهند. - نمایشنامه ها: ارکستراسیون سمفونی اتوماسیون شما – نمایش ها روال های اتوماسیون فردی هستند که وظایف مرتبط را گروه بندی می کنند. آنها مجموعه خاصی از اقدامات را برای انجام بر روی سیستم های هدف شما تعریف می کنند.
- کتابهای راهنما: طرحی برای موفقیت در اتوماسیون – Playbookها قلب اتوماسیون Ansible هستند. این فایلهای YAML بهعنوان اسکریپت عمل میکنند، و بهدقت بازیها و وظایفی را که باید در یک توالی دقیق اجرا شوند، تنظیم میکنند.
-
فایل های موجودی: تعریف چشم انداز اتوماسیون شما – فایل موجودی، که اغلب به عنوان
hosts
فایل، نقشه شما به سرورهای هدف است. اطلاعات مربوط به ماشینهایی را که جادوی اتوماسیون شما در آنجا انجام میشود ذخیره میکند. این فایل را به عنوان لیست هدف خود برای ماموریت های اتوماسیون تصور کنید.فایل موجودی مثال: رمزگشایی کد در اینجا تجزیه و تحلیل یک نمونه استhosts
فایل، جزئیات یک سرور به نام را نشان می دهدnode1
:
# learn-ansible/hosts
node1 ansible_user=ubuntu ansible_host=localhost ansible_port=2222 ansible_password=your_secret_password_here ansible_ssh_common_args="-o PubkeyAuthentication=no" ansible_become_pass=your_secret_password_here
-
node1
: این یک نام مستعار، نامی دوستانه برای سرور شما در کتابهای بازی است. خواندن و نگهداری اسکریپت های اتوماسیون شما را آسان تر می کند. -
ansible_user=ubuntu
: این نام کاربری “ubuntu” را برای اتصالات SSH به سرور که با نام مستعار نشان داده شده است مشخص می کند.node1
. -
ansible_host=localhost
: این دستگاهی را که خود Ansible را اجرا می کند هدف قرار می دهد (اگر لوکال هاست نیست، نام میزبان سرور واقعی را جایگزین کنید). -
ansible_port=2222
:این به Ansible می گوید که به جای پورت پیش فرض 22 به پورت 2222 برای SSH متصل شود. -
ansible_password=your_secret_password_here
:این رمز عبور را برای احراز هویت به عنوان کاربر “ubuntu” در سرور فراهم می کند. -
ansible_ssh_common_args="-o PubkeyAuthentication=no"
:این امر احراز هویت کلید عمومی را غیرفعال می کند و احراز هویت مبتنی بر رمز عبور را برای این سرور خاص مجبور می کند. -
ansible_become_pass=your_secret_password_here
:این رمز عبور را برای افزایش امتیاز با استفاده از آن فراهم می کندsudo
دستورات روی سرور
مثال فایل Playbook: قرار دادن اتوماسیون در عمل
این راهنمای نمونه نحوه نصب نرم افزار خاص و پیکربندی پوسته پیش فرض را بر روی آن نشان می دهد node1
سرور.:
# learn-ansible/playbook/install_playbook.yml
---
- name: Play for installing curl, zsh, python and pip
hosts: node1
gather_facts: false
tasks:
- name: Install curl
ansible.builtin.apt:
name: curl
state: present
- name: Install zsh, python and pip
ansible.builtin.apt:
name:
- zsh
- python3
- python3-pip
state: present
- name: Play for choosing zsh as default shell
hosts: node1
gather_facts: false
tasks:
- name: Choose zsh as default shell
ansible.builtin.user:
name: ubuntu
shell: /bin/zsh
become: true
کتاب بازی (YAML: - -
)
یک کتاب بازی را به عنوان طرح اولیه معمار برای پروژه اتوماسیون خود تصور کنید. این یک فایل YAML است که با دقت تمام توالی اتوماسیون را مشخص می کند. این فایل به عنوان مرکز فرماندهی مرکزی عمل می کند و بازی ها، وظایف و سیستم های هدف درگیر در ماموریت اتوماسیون شما را دیکته می کند.
---
# This line signifies the start of the YAML document
پخش (YAML: بلوک تورفتگی)
یک نمایشنامه را به عنوان یک کنش فردی در نمایشنامه اتوماسیون خود در نظر بگیرید (درست مانند یک نمایش در یک تولید تئاتر). هر بازی وظایف مرتبطی را گروه بندی می کند که اهداف خاصی را هدف قرار می دهند. شما می توانید چندین نمایشنامه را در یک کتاب بازی واحد داشته باشید که به شما امکان می دهد اهداف مختلف اتوماسیون را به روشی ساختاریافته انجام دهید.
در اینجا یک نمونه بازی از کتاب بازی نمونه آورده شده است:
- name: Play for installing curl, zsh, python and pip # Play definition with a descriptive name
hosts: node1 # This targets the server aliased as 'node1' in your hosts file
gather_facts: false # Optional, skips information gathering
tasks: # This indented block contains all tasks for this play
# ... task definitions ... (explained later in Tasks section)
Tasks (YAML: Further Indented Block)
وظایف، بلوکهای اساسی اتوماسیون در یک نمایشنامه هستند. آنها اقدامات خاصی را برای اجرا در سیستم هدف نشان می دهند. یک نمایشنامه میتواند وظایف متعددی را با نظم خاصی در کنار هم داشته باشد تا به نتیجه دلخواه برسد. این کارها مانند دستورالعمل های فردی است که یک بازیگر روی صحنه اجرا می کند تا نمایشنامه را زنده کند.
در اینجا یک مثال تعریف کار در یک نمایشنامه آمده است:
tasks:
- name: Install curl # Task definition with a descriptive name
ansible.builtin.apt: # The module used for package management
name: curl # The specific package to install
state: present # Desired state (ensure curl is installed)
مدیریت کارآمد چندین سرور با گروههای موجودی Ansible
Ansible به شما این امکان را می دهد که وظایف را در چندین سرور به طور همزمان خودکار کنید. این راهنما نحوه دستیابی به این هدف را با استفاده از گروههای موجودی در پیکربندی Ansible نشان میدهد.
گروه بندی سرورها برای مدیریت ساده شده
1. فایل موجودی:
– فایل موجودی Ansible خود را ویرایش کنید (hosts
به صورت پیش فرض).
– گروه هایی را برای دسته بندی منطقی سرورهای خود تعریف کنید. به عنوان مثال، یک گروه به نام ایجاد کنید group1
سرورها را در بر بگیرد node1
و node2
.
[group1]
node1 ansible_user=ubuntu ansible_host=localhost ansible_port=2222 ansible_password=your_secret_password_here ansible_ssh_common_args="-o PubkeyAuthentication=no" ansible_become_pass=your_secret_password_here
node2 ansible_user=ubuntu ansible_host=localhost ansible_port=2223 ansible_password=your_secret_password_here ansible_ssh_common_args="-o PubkeyAuthentication=no" ansible_become_pass=your_secret_password_here
2. گروه های هدف کتاب راهنما:
– کتاب بازی Ansible خود را برای هدف قرار دادن گروه تازه ایجاد شده تغییر دهید.
---
- name: Install curl, zsh, Python, and pip
hosts: group1
gather_facts: false
tasks:
# ... your Ansible tasks here
– hosts: group1
خط مشخص می کند که این بازی باید بر روی تمام سرورهای داخل اجرا شود group1
گروه
مقیاس بندی با چند گروه
- گروه های اضافی را در فایل موجودی خود ایجاد کنید تا سرورهای بیشتری را سازماندهی کنید.
- کتاب های بازی خود را برای هدف قرار دادن چندین گروه با استفاده از دو نقطه به روز کنید (
:
) جدا کننده.
---
- name: Install software across all servers
hosts: group1:group2
gather_facts: false
tasks:
# ... your Ansible tasks here
– این دفترچه در همه سرورها در هر دو اجرا می شود group1
و group2
.
حالا مرحله آخر، کد را در ترمینال اجرا کنید
# pwd :- learn-ansible
ansible-playbook -i hosts playbooks/install_playbook.yml
وبلاگ بعدی به زودی در تست واحد ارائه می شود