تغییرات اخیر

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

نحوه نصب و پیکربندی چند سرور اوبونتو با Ansible


۱۹ بهمن ۱۴۰۴

خلاصه کنید:

openaigeminiperplexity

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

انسیبل نیازی به هیچ‌گونه کامپوننت اضافی روی سرورهایی که می‌خواهید انسیبل روی آن‌ها اجرا شود، ندارد. این سرورها به عنوان هاست‌های انسیبل شناخته می‌شوند و فقط کافی‌ست، پایتون و OpenSSH روی آن‌ها نصب باشد.( به‌طور پیش‌فرض همه این‌ها روی اوبونتو و تمام توزیع‌های لینوکس نصب هستند). سرور کنترلی انسیبل (Ansible control node) مسئول اجرای دستورات و خودکارسازی فرایندها می‌باشد، این سرور کنترلی هر نوع سیستم‌عاملی مشابه لینوکس باشد را اجرا می‌کند یا حتی ویندوز، به شرطی که Windows Subsystem for Linux (WSL) را روی آن نصب کرده باشید.

نحوه نصب و پیکربندی اولیه چند سرور اوبونتو با Ansible

در این آموزش، از انسیبل برای خودکارسازی راه‌اندازی اولیه چندین سرور مجازی اوبونتو استفاده خواهیم کرد؛ لیستی از کارهایی که قرار است در این مقاله انجام دهیم:

  • به‌روزرسانی پکیج‌های نصب‌شده
  • اضافه کردن یک کاربر غیر روت با دسترسی‌های مدیریتی
  • فعال‌سازی دسترسی SSH برای کاربر غیر root
  • فعال‌سازی فایروال
  • تغییر پورت دسترسی SSH
  • غیرفعال کردن ورود از راه دور برای حساب root
  • حذف وابستگی‌های پکیجی که دیگر لازم نیستند

پیش‌نیازها

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

  • نصب Ansible روی یک سرور مجازی اوبونتو.
  • نصب Git در سرور مجازی. نحوه نصب Git در سرور مجازی اوبونتو را در این مقاله بخوانید.
  • اگر قصد دارید از راه دور به سرور مجازی وصل شوید، مقاله SSH چیست؟ + نحوه استفاده از SSH برای اتصال به سرور مجازی (VPS)
    را مطالعه کنید.
  • نصب دو یا چند سرور مجازی اوبونتو به همراه آدرس IP عمومی (IPv4). طوری که باید مطمئن باشید از نود کنترل انسیبل به این سرورها دسترسی SSH دارید.

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

  • مرحله اول: ویرایش تنظیمات SSH در نود کنترل Ansible
  • مرحله دوم: پیکربندی فایل Hosts در انسیبل
  • مرحله سوم: دانلود ریپازیتوری تنظیمات اولیه اوبونتو برای Ansible
  • مرحله چهارم: تنظیم متغیرهای انسیبل مطابق با نیاز سرورها
  • مرحله پنجم: افزایش امنیت سرورها با ساخت فایل رمزنگاری‌شده در انسیبل والت
  • مرحله ششم: اجرای خودکار تنظیمات اولیه سرور با پلی‌بوک Ansible
  • جمع‌بندی
  • سوالات متداول

مرحله اول: ویرایش تنظیمات SSH در نود کنترل Ansible

در این مرحله، باید یک تغییر کوچک در فایل تنظیمات SSH روی نود کنترل انجام دهید. بعد از این تغییر دیگر لازم نیست هر بار کلید SSH سرورهای ریموت را به‌صورت دستی تائید کنید؛ این‌کار به‌طور خودکار انجام می‌شود.

برای این‌کار نیز می‌توانید از ماژول known_hosts انسیبل برای تائید خودکار کلید SSH استفاده کنید. اما وقتی که با چندین سرور کار می‌کنید، بهترین روش، تغییر فایل تنظیمات SSH می‌باشد.

برای این‌کار، ترمینال را روی نود کنترل باز کنید و با nano یا ویرایشگر دلخواه‌تان، فایل تنظیمات SSH را باز کنید:

sudo nano /etc/ssh/ssh_config

کارهای زیر را انجام دهید:

  • خطی که شامل دستور StrictHostKeyChecking را پیدا کنید.
  • این خط را از حالت کامنت خارج کنید.
  • مقدار دستور را به شکل زیر تغییر دهید:
...
   StrictHostKeyChecking accept-new
...

فایل را ذخیره کرده و ببندید. دقت کنید، چون فقط فایل پیکربندی SSH را تغییر دادید، نیازی به راه‌ندازی مجدد سرویس SSH نیست.

توجه: اگر نمی‌خواهید مقدار StrictHostKeyChecking را از حالت ask به accept-new به صورت دائمی تغییر دهید، می‌توانید بعد از اجرای پلی‌بوک، آن را به حالت پیش‌فرض برگردانید. تغییر مقدار به این معناست که سیستم شما کلیدهای SSH سرورها را به صورت خودکار قبول خواهد کرد، اما اگر کلیدها در اتصال‌های بعدی تغییر کنند، ارتباط از همان سرورها رد می‌شود. این ویژگی باعث می‌شود که تغییر به accept-new خطر امنیتی کمتری نسبت به تغییر مقدار به no داشته باشد.

پس ار آن‌که دستور SSH را به‌روزرسانی کردید، باید پیکربندی Ansible را شروع کنید.

برای آشنایی کامل با نحوه راه‌اندازی Docker Compose از طریق Ansible در اوبونتو، مقاله زیر را از دست ندهید.
راه‌اندازی Docker Compose از طریق Ansible

مرحله دوم: پیکربندی فایل Hosts در انسیبل

فایل hosts انسیبل، اطلاعات مربوط به میزبان‌هایی که قرار است از طریق انسیبل با آن‌ها ارتباط برقرار کنید را نگهداری می‌کند. این اطلاعات شامل نام گروه‌ها، دامنه‌ها و آدرس‌های IP می‌باشد. به‌طور پیش‌فرض این فایل در دایرکتوری /etc/ansible قرار دارد.

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

بنابراین، فایل hosts را با ویرایشگر nano باز کنید:

sudo nano /etc/ansible/hosts

بعد از کامنت‌های معرفی در فایل، خطوط زیر را به آن اضافه کنید:

...

host1 ansible_host=host1-public-ip-address
host2 ansible_host=host2-public-ip-address
host3 ansible_host=host3-public-ip-address

[initial]
host1
host2
host3

[ongoing]
host1
host2
host3

پس از اعمال تغییرات، فایل را ذخیره کرده و ببندید.

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


برای آشنایی کامل با انسیبل و ویژگی‌های آن، مقاله زیر را مطالعه کنید.
Ansible چیست؟

مرحله سوم: دانلود ریپازیتوری تنظیمات اولیه اوبونتو برای Ansible

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

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

initial.yml، ongoing.yml و vars/default.yml

  • فایل initial.yml پلی‌بوک اصلی است که شامل دستورات و تسک‌هایی می‌شود که برای تنظیمات اولیه سرور روی میزبا‌ن‌ها اجرا می‌کنید.
  • فایل ongoing.yml برای نگهداری و مدیریت سرورها بعد از تکمیل تنظیمات اولیه استفاده می‌شود.
  • فایل vars/default.yml هم متغیرهایی را شامل می‌شود که در هر دو پلی‌بوک در مراحل مختلف فراخوانی می‌شوند.

برای دانلود این ریپازیتوری، دستور زیر را وارد کنید:

git clone https://github.com/do-community/ansible-ubuntu.git

یا اگر کلید SSH خودتان را به حساب GitHub اضافه کرده باشید، می‌توانید ریپازیتوری را با این دستور دانلود کنید:

git@github.com:do-community/ansible-ubuntu.git

در حال حاضر، یک فولدر با نام ansible-ubuntuدر دایرکتوری فعلی شما ساخته شده است، که با دستور زیر وارد آن می‌شوید:

cd ansible-ubuntu

از اینجا به بعد، دایرکتوری فعلی شما همین فولدر ansible-ubuntu خواهد بود و بقیه مراحل آموزش را در این مسیر انجام می‌دهیم.

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

مرحله چهارم: تنظیم متغیرهای انسیبل مطابق با نیاز سرورها

بعضی اطلاعات هستند که پلی بوک برای خودکارسازی به آن‌ها نیاز دارد و ممکن است گاهی بخواهید آن‌ها را تغییر دهید. حال به‌جای اینکه این اطلاعات را مستقیما وسط کدهای پلی‌ بوک بنویسیم، همه آن‌ها را در یک فایل جداگانه به نام vars/default.yml قرار دادیم. اگر نیاز داشتید، متغیری را عوض کنید، فقط کافی‌ست این فایل را ویرایش کنید.

برای این‌کار، دستور زیر را وارد کنید:

nano vars/default.yml

محتوای این فایل شامل خطوط زیر است:

create_user: sammy

ssh_port: 5995

copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"

در این فایل، مقدار متغیر create_user باید نام کاربری باشد که قرار است روی هر سرور ساخته شود. در این آموزش نام کاربری sammy در نظر گرفته شده، اما شما هر نام دیگری می‌توانید انتخاب کنید.

متغیر ssh_port هم پورتی را مشخص می‌کند که بعد از راه‌اندازی، قرار است از طریق آن به سرورهای خود متصل شوید.

به طور پیش‌فرض SSH، روی پورت 22 کار می‌کند، اما درصورتی که این پورت را عوض کنید، از حملات خودکار زیادی که روی سرورهایتان دارید، جلوگیری می‌شود. تغییر پورت اجباری نیست اما امنیت سرورها را بالا می‌برد.

بهتر است پورتی را انتخاب کنید که بین 1024 تا 65535 باشد و با سرویس‌های دیگری روی سرورهایتان تداخل نداشته باشد. در این مثال از لیارا، پورت 5995 را انتخاب کرده‌ایم.

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

در خط سوم کد بالا، متغیر copy_local_key به فایل کلید عمومی SSH نود کنترل شما اشاره دارد. اگر نام این فایل id_rsa.pub است، نیازی به تغییر چیزی در این خط ندارید. در غیر این صورت، باید نام فایل را طوری تغییر دهید که با فایل کلید عمومی SSH نود کنترل شما همخوانی داشته باشد. این فایل را می‌توانید در دایرکتوری ~/.ssh نود کنترل پیدا کنید.

زمانی که تغییرات لازم را انجام دادید، فایل را ذخیره کرده و ببندید.

حالا که مقادیر متغیرها را در فایل vars/default.yml تنظیم کردید، Ansible می‌تواند به‌راحتی این متغیرها را فراخوانی کند. در مرحله بعدی، می‌خواهیم با استفاده از Ansible Vault یک پسورد ایمن برای کاربری که قرار است روی هر میزبان ایجاد شود، بسازیم.

برای آشنایی کامل با کوبرنتیز (Kubernetes) و چگونگی کارکرد آن، مقاله زیر را از دست ندهید.
کوبرنتیز (Kubernetes) چیست؟

مرحله پنجم: افزایش امنیت سرورها با ساخت فایل رمزنگاری‌شده در Ansible Vault

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

بنابراین، یک فایل ایجاد کنید و با استفاده از Ansible Vault آن را رمزگذاری کنید.

این فایل شامل متغیرهایی می‌شود که برای تنظیم پسورد کاربر sudo در هر سرور استفاده خواهد شد.

در این مرحله نیز، همچنان در دایرکتوری ansible-ubuntu باشید و از دستور زیر برای ایجاد و باز کردن یک فایل vault استفاده کنید:

ansible-vault create secret

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

بعد از وارد کردن و تائید پسورد، فایل مخفی در ویرایشگر متنی که به متغیر EDITOR سیستم شما متصل است، باز می‌شود.

خطوط زیر را به فایل اضافه کنید و مقادیر type_a_strong_password_here و type_a_salt_here را با مقادیر دلخواه خودتان جایگزین کنید.

password: type_a_strong_password_here
password_salt: type_a_salt_here

مقدار متغیر password، پسورد واقعی کاربری است که می‌خواهد روی هر سیستم میزبان به عنوان کاربر sudo ایجاد شود. متغیر password_salt هم از یک salt برای تولید هش پسورد استفاده می‌کند. Salt یک مقدار تصادفی و بلند است که برای تولید هش پسورد استفاده می‌شود.

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

پس از ویرایش فایل، آن‌را ذخیره کرده و ببندید.

در آخر شما یک فایل پسورد رمزنگاری‌شده ایجاد کردید که شامل متغیرهایی هست که برای ساخت پسورد کاربر sudo در میزبان‌ها استفاده می‌شوند.

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

مرحله ششم: اجرای خودکار تنظیمات اولیه سرور با پلی‌بوک Ansible

در اینجا، می‌خواهیم با کمک Ansible، راه‌اندازی اولیه سرورهایی که در فایل hosts تعریف کردیم را به صورت خودکار انجام دهیم.

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

پلی‌بوک‌های Ansible از یک یا چند Play ساخته شدند و هر Play نیز شامل چند Taskمختلف است. پلی‌بوکی که قرار است روی سرورهایتان اجرا کنید، دو Play دارد که در مجموع ۱۴ تسک داخل آن تعریف شده است.

قبل از اینکه پلی‌بوک را اجرا کنیم، باید تسک‌هایی که در مراحل آماده‌سازی سرور انجام می‌شود را بررسی کنیم. برای شروع، فایل را با nano یا هر ویرایشگری که راحت هستید، باز کنید:

nano initial.yml

پس از باز کردن فایل، پلی بوک‌های زیر را مشاهده می‌کنید:

پلی ۱ (play):

وقتی فایل initial.yml را باز می‌کنید، اول از همه چند دستور پیکربندی مهم می‌بینید که نحوه اجرای Play را مشخص می‌کنند:

- name: Initial server setup tasks
  hosts: initial
  remote_user: root
  vars_files:
    - vars/default.yml
    - secret
...

name:
یک توضیح کوتاه و واضح است، درباره کاری که این Play انجام می‌دهد. وقتی پلی‌بوک اجرا شود، همین توضیح را در ترمینال می‌بینید و دقیق متوجه می‌شوید چه عملیاتی در حال انجام است.

hosts:
مشخص می‌کند این Play می‌خواهد روی کدام سرورها اجرا شود. اینجا گروه سرورهایی که در فایل /etc/ansible/hosts مرحله دوم ساختید، به عنوان هدف این Play تعیین شده‌اند.

remote_user:
با این کلیدواژه به کنترلر Ansible می‌گویید که برای لاگین به سرورها از چه کاربری استفاده کند. در این سناریو، کاربر root انتخاب شده است، چون نیاز داریم تسک‌ها بدون محدودیت اجرا شوند.

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

با تنظیمات بالا، کنترلر انسیبل سعی می‌کند با کاربر root و از طریق پورت 22به سرورها SSH بزند.

اگر موفق شود به سروری وصل شود، وضعیت ok را در خروجی می‌بینید. در غیر این صورت پیام unreachabl اگر موفق شود به سروری وصل شود، وضعیت ok را در خروجی می‌بینید. در غیر این صورت پیام unreachabl را دریافت می‌کنید.

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

در عمل، این کار، همان لاگین دستی با دستور ssh root@IP-Address را به صورت خودکار انجام می‌دهد و در زمانتان صرفه‌جویی می‌شود.

هر تسک، درست مانند خود Play، با یک name شروع می‌شود، که خلاصه و واضح توضیح می‌دهد، قرار است چه کاری انجام شود.

در ادامه، لیست تسک‌ها را مشاهده می‌کنید:

به‌روزرسانی کش پکیج‌ها

در اولین تسک این پلی بوک، دیتابیس پکیج‌های سرور را آپدیت می‌کنیم:

...
- name: update cache
  ansible.builtin.apt:
    update_cache: yes
...

به‌روزرسانی همه پکیج‌های نصب‌شده

در تسک دوم، به‌سراغ آپدیت کردن پکیج‌های نصب شده روی سرور می‌رویم:

...
- name: Update all installed packages
  ansible.builtin.apt:
    name: "*"
    state: latest
...

اطمینان از اجرای سرویس NTP

این تسک وظیفه دارد، مطمئن شود سرویس Network Time Protocol یا همان NTP روی سرور فعال است یا خیر.

...
- name: Make sure NTP service is running
  ansible.builtin.systemd:
    state: started
    name: systemd-timesyncd
...

اطمینان از وجود گروه sudo

تسک چهارم پلی بوک بررسی می‌کند که روی سرور یک گروه به نامsudo وجود داشته باشد. به این علت که گروه sudo مهم است، زیرا کاربرانی که عضو این گروه باشند، می‌توانند با دسترسی root دستورات را اجرا کنند.

...
- name: Make sure we have a 'sudo' group
  ansible.builtin.group:
    name: sudo
    state: present
...

ایجاد یک کاربر با دسترسی sudo

این تسک پلی بوک یک کاربر غیر روت (non-root) روی سرور می‌سازد که دسترسی sudo داشته باشد.

...
- name: Create a user with sudo privileges
  ansible.builtin.user:
    name: "{{ create_user }}"
    state: present
    groups: sudo
    append: true
    create_home: true
    shell: /bin/bash
    password: "{{ password | password_hash('sha512', password_salt) }}"
    update_password: on_create
...

تنظیم کلید مجاز برای کاربر ریموت

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

...
- name: Set authorized key for remote user
  ansible.posix.authorized_key:
    user: "{{ create_user }}"
    state: present
    key: "{{ copy_local_key }}"
...

غیرفعال کردن ورود ریموت برای کاربر root

در این تسک، دسترسی ریموت کاربر root به سرور غیرفعال می‌شود.

...
- name: Disable remote login for root
  ansible.builtin.lineinfile:
    path: /etc/ssh/sshd_config
    state: present
    regexp: '^PermitRootLogin yes'
    line: 'PermitRootLogin no'
...

تغییر پورت SSH

در تسک هشتم، پورت پیش‌فرض SSH، که معمولا 22 است به یک عدد دیگر تغییر می‌کند.

...
- name: Change the SSH port
  ansible.builtin.lineinfile:
    path: /etc/ssh/sshd_config
    state: present
    regexp: '^#Port 22'
    line: 'Port "{{ ssh_port }}"'
...

اجازه دادن به اتصالات SSH

با اجرای این تسک، ترافیک مربوط به SSH در فایروال باز می‌شود.

...
- name: UFW - Allow SSH connections
  community.general.ufw:
    rule: allow
    port: "{{ ssh_port }}"
...

محافظت در برابر تلاش‌های brute-force برای SSH

در تسک دهم پلی بوک، از سرور در برابر حملات Brute-Force روی SSH محافظت می‌شود.

...
- name: Brute-force attempt protection for SSH
  community.general.ufw:
    rule: limit
    port: "{{ ssh_port }}"
    proto: tcp
...

مسدود کردن ترافیک ورودی دیگر و فعال‌سازی UFW

این تسک، فایروال سرور را فعال می‌کند.

...
- name: UFW - Deny other incoming traffic and enable UFW
  community.general.ufw:
    state: enabled
    policy: deny
    direction: incoming
...

حذف وابستگی‌های غیر ضروری

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

...
- name: Remove dependencies that are no longer required
  ansible.builtin.apt:
    autoremove: yes
...

راه‌اندازی مجدد دیمون SSH

و در نهایت این تسک پلی بوک، سرویس SSH را ری‌استارت می‌کند.

...
- name: Restart the SSH daemon
  ansible.builtin.systemd:
    state: restarted
    name: ssh
نحوه بکاپ گیری کامل از PostgreSQL در اوبونتو 24.04 را در مقاله زیر بخوانید.
نحوه بکاپ گیری از PostgreSQL

پلی ۲ (play): راه‌اندازی مجدد سرورها پس از انجام تنظیمات اولیه

پلی ۲ زمانی شروع می‌شود که آخرین تسک در پلی ۱ را با موفقیت تکمیل کرده شده باشد. این پلی شامل دستور پیکربندی است:

...
- name: Rebooting hosts after initial setup
  hosts: initial
  port: "{{ ssh_port }}"
  remote_user: "{{ create_user }}"
  become: true
  vars_files:
    - vars/default.yml
    - ~/secret
  vars:
    ansible_become_pass: "{{ password }}"
...

name: عنوان پلی که نشان می‌دهد این بخش مربوط به راه‌اندازی مجدد سرورها است.

hosts: میزبان‌های هدف که در فایل inventory مشخص شده‌اند (در اینجا گروه “initial”).

port: پورت SSH برای اتصال به سرورها (مقدار آن از متغیر ssh_port گرفته می‌شود).

remote_user: نام کاربری برای اتصال به سرور (در اینجا از متغیر create_user استفاده شده).

become: این گزینه تعیین می‌کند که عملیات با دسترسی‌های بالاتر (sudo) انجام شود.

vars_files: فایل‌هایی که متغیرهای مورد نیاز پلی را در خود دارند (در اینجا vars/default.yml و ~/secret).

vars: متغیرهایی که به‌طور مستقیم در این پلی تنظیم شده‌اند (در اینجا ansible_become_pass که پسورد sudo را از متغیر password می‌گیرد).

پس از دستورات پیکربندی فوق، تنها تسکی که در این play اجرا خواهد شد، تسک زیر است:

‌راه‌اندازی مجدد تمامی hostها

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

...
- name: Reboot all hosts
  ansible.builtin.reboot:

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

فایل کامل پلی بوک به شکل زیر خواهد بود:

- name: Initial server setup tasks
  hosts: initial
  remote_user: root
  vars_files:
    - vars/default.yml
    - secret

  tasks:
    - name: update cache
      ansible.builtin.apt:
        update_cache: yes

    - name: Update all installed packages
      ansible.builtin.apt:
        name: "*"
        state: latest

    - name: Make sure NTP service is running
      ansible.builtin.systemd:
        state: started
        name: systemd-timesyncd

    - name: Make sure we have a 'sudo' group
      ansible.builtin.group:
        name: sudo
        state: present

    - name: Create a user with sudo privileges
      ansible.builtin.user:
        name: "{{ create_user }}"
        state: present
        groups: sudo
        append: true
        create_home: true
        shell: /bin/bash
        password: "{{ password | password_hash('sha512', password_salt) }}"
        update_password: on_create

    - name: Set authorized key for remote user
      ansible.builtin.authorized_key:
        user: "{{ create_user }}"
        state: present
        key: "{{ copy_local_key }}"

    - name: Disable remote login for root
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^PermitRootLogin yes'
        line: 'PermitRootLogin no'

    - name: Change the SSH port
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        state: present
        regexp: '^#Port 22'
        line: 'Port "{{ ssh_port }}"'

    - name: UFW - Allow SSH connections
      community.general.ufw:
        rule: allow
        port: "{{ ssh_port }}"

    - name: Brute-force attempt protection for SSH
      community.general.ufw:
        rule: limit
        port: "{{ ssh_port }}"
        proto: tcp

    - name: UFW - Deny other incoming traffic and enable UFW
      community.general.ufw:
        state: enabled
        policy: deny
        direction: incoming

    - name: Remove dependencies that are no longer required
      ansible.builtin.apt:
        autoremove: yes

    - name: Restart the SSH daemon
      ansible.builtin.systemd:
        state: restarted
        name: ssh

- name: Rebooting hosts after initial setup
  hosts: initial
  port: "{{ ssh_port }}"
  remote_user: "{{ create_user }}"
  become: true
  vars_files:
    - vars/default.yml
    - secret
  vars:
    ansible_become_pass: "{{ password }}"

  tasks:
    - name: Reboot all hosts
      ansible.builtin.reboot:

پس از بررسی فایل، آن را ذخیره کرده و ببندید.

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

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

ansible-playbook --syntax-check --ask-vault-pass initial.yml

بعد از وارد کردن رمز عبور Vault که در مرحله ۵ ایجاد کرده‌اید، اگر هیچ‌گونه خطایی در سینتکس YAML وجود نداشته باشد، خروجی به این صورت خواهد بود:

playbook: initial.yml

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

ansible-playbook --ask-vault-pass initial.yml

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

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

PLAY RECAP *****************************************************************************************************
host1   : ok=16   changed=11    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host2   : ok=16   changed=11    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
host3   : ok=16   changed=11    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

برای اینکه مطمئن شوید، همه موارد طبق انتظار پیش رفته یا نه، باید وارد یکی از سرورها شوید و تنظیمات را بررسی کنید:

ssh {{ create_user }}@host-ip-address -p {{ ssh_port }}

می‌توانید با استفاده از دستور SSH وارد سرور شده و مطمئن شوید که همه تغییرات مثل کاربر جدید با دسترسی sudo و تغییرات پورت SSH به درستی اعمال شده‌اند.

با ثبت‌نام در لیارا، ۱۰۰ هزار تومان اعتبار هدیه بگیرید و از سرور مجازی رایگان با کیفیت بالا و امکانات عالی استفاده کنید!
پشتیبانی ۲۴ ساعته برای کاربران سرور مجازی رایگان!
خرید سرور مجازی رایگان

جمع‌بندی

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

در پایان مقاله، برای بهبود مدیریت سرور مجازی خود، پیشنهاد می‌کنیم ویدیوی آشنایی با سرور مجازی ابری لیارا را در آپارات مشاهده کنید. در این ویدیو، به طور کامل با ویژگی‌ها و امکانات سرورهای ابری لیارا آشنا خواهید شد و می‌توانید گام‌های مؤثری برای مدیریت بهتر سرور خود بردارید.

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

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

 پلی ‎بوک‌ها همان فایل‌های YAML ساده‌ای هستند که شامل زبان سریال‌سازی داده‌های قابل‎ خواندن برای انسان بوده و کار متخصصان را راحت‌تر می‌کنند.

آیا استفاده از انسیبل رایگان است؟

بله، Ansible یک ابزار متن‌باز است و به صورت رایگان در دسترس است.

آیا انسیبل قابلیت گسترش دارد؟

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

 آیا انسیبل نیاز به نصب Agent دارد؟

خیر، انسیبل از معماری Agentless استفاده می‌کند، به این معنا که نیازی به نصب Agent بر روی ماشین‌های مقصد ندارد.

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