اگر مدیریت سرورهای VPS یا زیرساخت ابری شما هنوز با دستورهای تکراری، اسکریپتهای پراکنده و خطاهای انسانی همراه است، وقت آن رسیده که نگاه عمیقتری به اتوماسیون بیندازید. برای دریافت یک آموزش جامع اتوماسیون سرور با Ansible و Terraform، همراه ما باشید. این راهنما به شما نشان میدهد که چطور میتوانید زیرساخت خود را به شکل کد مدیریت کنید، استقرار را تکرارپذیر کنید و زمان نگهداری را به شدت کاهش دهید.
چرا اتوماسیون سرور ضروری است؟
در دنیای میزبانی وب و زیرساخت مدرن, پیکربندی دستی سرورها دیگر پاسخگوی نیازهای مقیاسپذیر نیست. هر بار که یک سرور جدید راهاندازی میکنید, احتمال ناهماهنگی بین محیطهای توسعه, تست و تولید وجود دارد. یک بهروزرسانی امنیتی روی یک سرور میتواند باعث شود که سرور دیگر دقیقاً همانند همتای خود رفتار نکند. اتوماسیون این مشکلات را ریشهای حل میکند:
- کاهش خطاهای انسانی با اجرای دقیق یکسان روی همه سرورها
- صرفهجویی در زمان با انجام همزمان چندین عملیات روی دهها سرور
- افزایش امنیت با استانداردسازی پیکربندی و مدیریت متمرکز دسترسیها
- مستندسازی ضمنی زیرساخت از طریق فایلهای کد و نسخهبرداری با Git
- بازیابی سریع در فاجعه با بازپرویژن کردن کل زیرساخت در چند دقیقه
دو ابزار اصلی که در این حوزه استاندارد صنعت محسوب میشوند, Ansible و Terraform هستند. این دو اگرچه گاهی به اشتباه جایگزین یکدیگر در نظر گرفته میشوند, اما در واقع مکمل هم هستند و هر کدام لایه متفاوتی از اتوماسیون را پوشش میدهند.
آشنایی با Ansible و Terraform
برای درک بهتر, باید بدانیم که هر کدام از این ابزارها برای کدام مسئله طراحی شدهاند. Ansible یک ابزار مدیریت پیکربندی است و Terraform یک ابزار زیرساختبهعنوانکد (IaC) برای پروویژنکردن منابع زیرساختی. به زبان ساده: Terraform سرورها و شبکه را میسازد و Ansible آنها را پیکربندی میکند.
Ansible چیست؟
Ansible توسط Red Hat توسعه داده شده و یک موتور اتوماسیون بدون عامل (Agentless) است. یعنی برای مدیریت سرورهای مقصد, نیازی به نصب هیچ نرمافزاری روی آنها ندارید. Ansible از طریق SSH به سرورها متصل میشود و وظایف خود را با زبان ساده YAML انجام میدهد. این ویژگی بهویژه برای سرورهای VPS که دسترسی ریشه دارند, بسیار کارآمد است. شما با نوشتن Playbook میتوانید بستهها را نصب کنید, سرویسها را راهاندازی کنید, فایلهای پیکربندی را مدیریت کنید و حتی کاربران سیستم را بسازید.
Terraform چیست؟
Terraform محصول Hashicorp بوده و برای ایجاد, تغییر و حذف منابع زیرساختی در سرویسهای ابری مانند AWS, DigitalOcean, Hetzner و Vultr استفاده میشود. با زبان اعلامی HCL (HashiCorp Configuration Language) وضعیت مطلوب زیرساخت را اعلام میکنید و Terraform وظیفه دارد آن وضعیت را در دنیای واقعی پیاده کند. از مدیریت Droplet و فایروال گرفته تا ایجاد DNS میتوانید به Terraform بسپارید.
تفاوتهای کلیدی Ansible و Terraform
برای انتخاب درست بین این دو, باید تفاوتهای بنیادین مدل کاری آنها را بشناسید. جدول زیر مهمترین تفاوتها را از نگاه یک مدیر زیرساخت نشان میدهد:
| ویژگی | Ansible | Terraform |
|---|---|---|
| تمرکز اصلی | مدیریت پیکربندی و استقرار نرمافزار روی سرورهای موجود | ایجاد و چرخه حیات زیرساخت ابری (پروویژن) |
| مدل کاری | دستوری (Push) و اجرای مستقیم روی سرور از طریق SSH | اعلامی (Declarative) و مقایسه وضعیت مطلوب با وضعیت فعلی |
| زبان | YAML برای Playbook و Jinja2 برای قالبهای پیکربندی | HCL برای فایلهای .tf |
| اتصال به سرور | بدون عامل, فقط نیاز به SSH و Python در سمت مقصد | ارتباط با API سرویسدهنده ابری; بدون اتصال مستقیم به سرور |
| مدیریت وضعیت | State بر روی خود سرورها و هر بار اجرای کامل وظایف (Idempotent) | State فایل محلی یا ریموت در بکاند; فقط تغییر منابع لازم |
| مناسب برای | نصب نرمافزار, کانفیگ سرویسها, اعمال بهروزرسانیها | استقرار سرور, مدیریت شبکه, مدیریت DNS و مقیاسپذیری زیرساخت |
پاسخ روشن است: Terraform زیرساخت را میسازد و Ansible آن را غنی و پیکربندی میکند. در یک پروژه واقعی, معمولاً ابتدا Terraform سرورها را ایجاد میکند و سپس Ansible روی آنها مستقر میشود.
راهاندازی Ansible برای مدیریت سرورهای VPS
فرض کنید چند سرور VPS با IP متفاوت دارید و میخواهید همه را با یک دستور بهروزرسانی کنید. برای شروع, یک ماشین کنترل (Control Node) انتخاب کنید. این ماشین میتواند یک سرور کوچک یا حتی کامپیوتر شخصی شما باشد. تنها پیشنیاز, نصب Python و ابزار pip است. برای نصب Ansible از مخازن سیستم عامل استفاده کنید:
1 | sudo apt update && sudo apt install -y ansible |
سپس فایل اینونتوری بسازید. فرض کنید دو سرور در گروه webservers دارید:
1 2 3 | [webservers] vps1.example.com ansible_host=192.168.1.10 ansible_user=root vps2.example.com ansible_host=192.168.1.11 ansible_user=root |
حالا میتوانید اتصال را با این دستور تست کنید:
1 | ansible -i hosts -m ping all |
اگر خروجی سبز با pong مشاهده کردید, یعنی اتصال برقرار است و Ansible میتواند با کلید SSH روی سرورها اجرا شود.
نوشتن اولین Playbook
Playbook قلب اتوماسیون Ansible است. در این مثال, یک پلیبوک ساده مینویسیم که کش APT را بهروزرسانی میکند و وبسرور Nginx را نصب میکند:
1 2 3 4 5 6 7 8 9 10 11 12 13 | --- - hosts: webservers become: yes tasks: - name: Update apt cache apt: update_cache: yes cache_valid_time: 3600 - name: Install Nginx apt: name: nginx state: present |
برای اجرای پلیبوک از دستور زیر استفاده میکنیم:
1 | ansible-playbook -i hosts nginx.yml |
این پلیبوک روی همه سرورهای گروه webservers اجرا خواهد شد. به خاطر خاصیت Idempotent بودن Ansible, اگر دوباره همین دستور را اجرا کنید, هیچ تغییر اضافهای رخ نمیدهد و وضعیت سرور بدون تغییر میماند.
زیرساخت بهعنوان کد با Terraform
حالا نوبت لایه پروویژن است. با Terraform میتوانید سرورهای VPS را مستقیماً از سرویسدهنده ابری بسازید و مدیریت کنید. پس از نصب Terraform روی سیستم خود, ابتدا Provider مربوط به سرویسدهنده را تعریف میکنید. برای مثال با DigitalOcean:
1 2 3 | provider "digitalocean" { token = var.do_token } |
سپس منبع Droplet را تعریف میکنید:
1 2 3 4 5 6 7 | resource "digitalocean_droplet" "web" { name = "web-1" region = "fra1" size = "s-2vcpu-2gb" image = "ubuntu-22-04-x64" ssh_keys = [data.digitalocean_ssh_key.admin.id] } |
برای اجرای ابتدا باید Terraform را مقداردهی کنید:
1 | terraform init |
سپس با terraform plan میتوانید تغییرات پیشنهادی را ببینید و با terraform apply آن را اعمال کنید. اگر بعداً تعداد سرورها را از ۱ به ۳ تغییر دهید, Terraform به طور هوشمندانه تنها دو سرور جدید میسازد و سرور اول را لمس نمیکند.
ترکیب Ansible و Terraform در یک گردش کار یکپارچه
قدرت اصلی این دو ابزار وقتی آشکار میشود که آنها را ترکیب کنید. استراتژی رایج: Terraform زیرساخت را ساخته و خروجی IP سرور را در اختیار Ansible قرار میدهد. سپس Ansible پیکربندی نرمافزار را روی سرور اعمال میکند. سادهترین راه این است که در Terraform از provisioner از نوع local-exec استفاده کنید:
1 2 3 4 5 6 | resource "digitalocean_droplet" "web" { # ... provisioner "local-exec" { command = "ansible-playbook -i '${self.ipv4_address},' -u root playbook.yml" } } |
با این روش, هر بار که Terraform یک سرور جدید ایجاد کند, بلافاصله Ansible را روی آن اجرا میکند و سرور را به وضعیت مطلوب میرساند. در پروژههای بزرگتر, بهتر است از یک لوله (Pipeline) مثل GitLab CI یا GitHub Actions استفاده کنید که ابتدا terraform apply و سپس ansible-playbook را به ترتیب اجرا کند و خروجیها را در آرتیفکتها ذخیره کند.
بهترین روشها و نکات امنیتی
در یک زیرساخت واقعی, اتوماسیون بدون رعایت امنیت میتواند فاجعه بیافریند. نکات زیر را همیشه در نظر داشته باشید:
- هرگز توکنهای API و کلیدهای خصوصی را در فایلهای کد قرار ندهید; از متغیرهای محیطی یا Vault استفاده کنید.
- برای محافظت از اطلاعات حساس در Ansible از ansible-vault استفاده کنید.
- از SSH key برای اتصال استفاده کنید و احراز هویت با رمز عبور را غیرفعال کنید.
- دسترسیها را با اصل کمترین مجوز (Least Privilege) پیکربندی کنید.
- فایل State در Terraform را حتماً در یک بکاند ریموت مثل S3 با قفلگذاری نگهداری کنید.
- همه پلیبوکها و فایلهای Terraform را در Git نگه دارید و تغییرات را با Pull Request اعمال کنید.
اگر از سرویسهای میزبانی وب استفاده میکنید, مطمئن شوید که سرویسدهنده شما API قدرتمندی دارد. VPSهای مبتنی بر KVM با پشتیبانی از اسنپشات و شبکه خصوصی, انتخاب بهتری برای اتوماسیون با Terraform و Ansible هستند. همچنین اگر قصد دارید لایه DNS و SSL را هم اتوماسیون کنید, Terraform میتواند بهصورت بومی با DNSهای محبوب مثل Cloudflare کار کند.
نتیجهگیری
در این آموزش جامع اتوماسیون سرور با Ansible و Terraform, دیدیم که چطور این دو ابزار مکمل میتوانند زیرساخت شما را به کد تبدیل کنند. Ansible برای پیکربندی سرورها و Terraform برای ساخت و مدیریت منابع ابری استفاده میشود. با ترکیب آنها, میتوانید سرورهای VPS خود را در چند دقیقه و با کمترین دخالت دستی مستقر کنید. کلید موفقیت در این مسیر, شروع کوچک است: یک سرور را خودکار کنید, آن را در Git ذخیره کنید و سپس به تدریج دامنه اتوماسیون را گسترش دهید. این کار نهتنها ریسک خطا را کاهش میدهد, بلکه به شما امکان میدهد زیرساختی مقاوم, مقیاسپذیر و امن داشته باشید.
سوالات متداول
آیا Ansible جایگزین Terraform است؟
خیر. Ansible برای مدیریت پیکربندی است و Terraform برای ساخت زیرساخت. آنها مکمل هستند: Terraform سرور ایجاد میکند و Ansible آن را پیکربندی میکند. در بسیاری از پروژهها از هر دو به صورت همزمان استفاده میشود.
آیا استفاده از Ansible برای یک سرور واحد منطقی است؟
بله. حتی برای یک سرور هم Ansible مفید است, چون پیکربندی را به صورت کد در میآورد و میتوانید بهراحتی آن را در سرور دیگر بازتولید کنید. این کار باعث میشود که محیطهای تست و تولید همگام باشند.
Terraform برای کدام سرویسهای ابری مناسب است؟
Terraform تقریباً با تمام سرویسهای ابری محبوب سازگار است, از جمله AWS, Microsoft Azure, Google Cloud, DigitalOcean, Hetzner, Vultr و Linode. حتی برای زیرساختهای داخلی با OpenStack هم میتوان از آن استفاده کرد.
چگونه از اطلاعات حساس در Playbook محافظت کنیم؟
در Ansible از ansible-vault استفاده کنید تا فایلهای حساس رمزنگاری شوند. در Terraform نیز از توکنهای API در متغیرهای محیطی استفاده کنید و هیچوقت آنها را در فایلهای tf commit نکنید. برای مدیریت متمرکز اسرار میتوانید از HashiCorp Vault استفاده کنید.
آیا به مهارت برنامهنویسی نیاز دارم؟
برای استفاده از Ansible و Terraform نیازی به یک زبان برنامهنویسی کامل نیست, اما آشنایی با اصول خط فرمان لینوکس, YAML و مفاهیم API به شما کمک میکند. یادگیری این ابزارها بهمرور و با انجام پروژههای واقعی آسانتر میشود.