امروز میخواهیم به این موضوع بپردازیم که Vagrant چیست وچطور میتوان آن را در ورکاستیشن (workstation) راهاندازی کرد تا ماشینهای مجازی را برای محیط توسعه، ایجاد و مدیریت کرد.
با کمک این ابزار، هر زمانی که بخواهید با ابزارهای مرتبط با DevOps کار کنید، تنظیم محیط برایتان بسیار راحتتر میشود. در این آموزش، اول از همه با یکدیگر میخوانیم که Vagrant چیست و سپس به بررسی معماری، موارد استفاده، نحوهی نصب و سایر موضوعات مربوط به آن میپردازیم.
Vagrant چیست؟
Vagrantfile چیست؟
در این قسمت، یک نمونه از Vagrantfile را مشاهده میکنید:
# -*- mode: ruby -*- # vi: set ft=ruby: Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty64" config.vm.network "private_network", ip: "192.168.33.10" config.vm.provider "virtualbox" do |vb| vb.memory = "1024" end end
اما فایدهی نصب Vagrant چیست؟ با نصب Vagrant بر روی سیستم، میتوانید Vagrantfile خود را با سایر کاربرانی که Vagrant را بر روی سیستمشان نصب کردهاند به اشتراک گذاشته و دیگران میتوانند ماشین مجازیشان را شبیه به چیزی که شما ایجاد کردهاید، بسازند. همین روال کار برای Docker نیز انجام میشود.
باکسهای ویگرنت (Vagrant Boxes)
منظور از باکس ویگرنت یا vagran box چیست و چه استفادهای دارد؟ در یک فایل Vagrantfile که به طور پیشفرض ایجاد میشود، پارامتری به نام “config.vm.box” به چشم میخورد. باکس ویگرنت همان ایمیج ماشین مجازی است که شبیه به ایمیج ISO است که با باکسهای مجازی برای ساخت ماشین مجازی استفاده میشود. این باکس، یک ایمیج ماشین مجازی ازپیش ساختهشده است که میتوان آن را با هر کسی که از Vagrant استفاده میکند، به اشتراک گذاشت. شما میتوانید باکسهای Vagrant که افراد دیگر به اشتراک گذاشتهاند را از وبسایت Vagrantcloud دانلود کرده و آنها را استفاده کنید.
همچنین، میتوانید shell script را اضافه کنید یا با اضافهکردن chef cookbookها، puppet moduleها یا Ansible playbook به Vagrantfile، فرایند پیکربندی ماشین مجازی را خودکارسازی کنید.
موارد استفاده از Vagrant چیست؟
در این قسمت، مهمترین موارد استفاده از Vagrant در دنیای واقعی را بررسی میکنیم.
- محیطهای توسعه: فرض کنید که میخواهید یک محیط توسعه یکسان را برای همهی توسعهدهندگان یک تیم داشتهباشید. برای این کار، میتوانید یک Vagrantfile ایجاد کرده و تمام تنظیمات موردنیاز برای فراهمکردن ماشین مجازی را با وابستگیهای محیط توسعه ایجاد کرده و آن را با توسعهدهندگان نرمافزار دیگر به اشتراک بگذارید. بدینصورت، هیچ تغییری در نرمافزار اصلی یا تنظیمات مورداستفاده، ایجاد نمیشود. برخی از شرکتها، با ایجاد و به اشتراک گذاشتن باکسهای Vagrant در یک مکان مشترک، میزبانی نرمافزارهای مختلف سازمان را برعهده میگیرند تا همهی افراد سازمان بتوانند از آن استفاده کنند.
- محیطهای Sandboxed: در محیط Sandboxed، میتوانید از ویگرنت برای گردش و حذف ماشینهای مجازی در عرض چند دقیقه استفاده کنید.
پیش نیازهای Vagrant چیست؟
شاید برایتان سؤال پیش آمدهباشد که پیشنیازهای Vagrant چیست و برای نصب آن، به چه منابعی نیاز داریم؟
- اول از همه، باید یک باکس مجازی داشتهباشید. آخرین تنظیمات Virtualbox را از اینجا دانلود کنید.
- برای نصب نرمافزار ویگرنت بر روی workstation یا سرور مجازی خود باید دسترسی روت داشتهباشید.
- برای دانلود نرمافزارهای مختلف و ایمیج ماشین مجازی، باید به اینترنت دسترسی داشتهباشید.
- Workstation شما باید بیش از 4 گیگابایت رم داشتهباشد.
نصب ویگرنت
- نرمافزار ویگرنت را از این آدرس (+) دانلود کنید.
- ویگرنت را از فایل دانلود شده خارجکرده و نسخهی متناسب با سیستمعاملتان را نصب کنید. در هنگام نصب، فایل اجرایی به صورت خودکار به مسیر سیستم شما اضافه میشود و میتوانید از دستور vagrant استفاده کنید.
- برای تأیید نصب ویگرنت، دستور زیر را در خط فرمان اجرا کنید تا ببینید که آیا نسخهی خروجی آن را نشان میدهد یا خیر:
vagrant --version
شروع کار با Vagrant
در این بخش، میخواهیم مجازیسازی با Vagrant و ایجاد محیطهای توسعه با Vagrant را در 4 مرحلهی کلی توضیح دهیم. در پایان این بخش، یک درک اساسی از نحوهی عملکرد ویگرنت و طرز استفاده از آن برای محیطهای توسعه خواهیدداشت.
- ساخت یک ماشین مجازی مبتنی بر اوبونتو با استفاده از ویگرنت. در این آموزش، ما اسم این ماشین مجازی را apache-vm میگذاریم.
- اضافهکردن SSH به ماشین مجازی ایجادشده.
- نصب یک وبسرور آپاچی بر روی ماشین مجازی.
- دسترسی به صفحهی وبسرور از طریق مرورگر.
در ادامه بیشتر با این مراحل آشنا میشویم.
ایجاد ماشین مجازی با استفاده از ویگرنت
در این قسمت، نحوهی مجازیسازی با Vagrant را با یکدیگر یاد میگیریم.
مرحلهی 1: برای نگهداری همهی فایلهای مرتبط با Vagrant یک پوشه ایجاد کرده تا یک دایرکتوری برای پروژهی ماشین مجازیتان بسازید. این کار را میتوانید با دستور زیر انجام دهید:
mkdir apache-vm && cd apache-vm
مرحلهی 2: یک Vagrantfile را با کمک ایمیج اوبونتو راهاندازی کنید. این فایل، تمام تنظیمات موردنیاز شما را دربردارد. در این آموزش، ما از ایمیج عمومی اوبونتو که در محیط ابری Vagrant موجود است، استفاده کردهایم.
در ادامه، دستور زیر را برای مقداردهی اولیهی Vagrantfile اجرا کنید:
vagrant init bento/ubuntu-22.04
حال، باید بررسی کنید که Vagrantfile در پوشهای که ایجاد کردهاید، موجود باشد. اگر فایل را باز کنید، میبینید که بیشتر خطوط به صورت کامنت هستند.
مرحلهی 3: ماشین مجازی ویگرنت را بااستفاده از دستور زیر راه اندازی کنید:
vagrant up
با اجرای دستور بالا، ابتدا ایمیج ماشین مجازی ubuntu/trusty64 از محیط ابری ویگرنت نصب میشود و سپس ماشین مجازی راه اندازی میشود. همچنین، یک جفت کلید ssh ایجاد میشود و کلید عمومی نیز در طول این فرایند ایجاد میشود. شما میتوانید پس از راه اندازی دستگاه، SSH را وارد کنید.
مرحلهی 4: با اجرای دستور زیر، وضعیت ماشین مجازی نمایش داده میشود:
vagrant status
اگر نصب را به درستی انجام داده باشید، خروجی باید به صورت “running (virtualbox)” باشد.
اضافه کردن SSH به ماشین مجازی
براش مشاهدهی جزئیات SSH ماشین مجازی، دستور زیر را اجرا کنید:
vagrant ssh-config
دستور بالا، تمام جزئیاتی نظیر نام کاربری، محل فایل کلید و غیره را مانند نمونهی زیر نشان میدهد:
$ vagrant ssh-config Host lab HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /Users/bibinwilson/Documents/GitHub/vagrant/ubuntu- 20/lab/.vagrant/machines/lab/virtualbox/private_key IdentitiesOnly yes LogLevel FATA
حال میخواهیم به سراغ واردکردن SSH به ماشین مجازی که توسط ویگرنت راهاندازی شدهاست برویم. قبل از هر چیزی، باید مطمئن شوید که دستورات را از پوشهی apache-vm اجرا میکنید. برای اینکار، باید با استفاده از دستور زیر، وارد Vagrant شوید:
vagrant ssh
زمانی که دستور SSH را اجرا کنید، ویگرنت، کلید خصوصی را از پوشهی مخفی با فرمت .vagrant که توسط دستور vagrant up ایجاد شده، واکشی میکند. این پوشه حاوی کلید خصوصی SSH است.
/apache-vm/.vagrant/machines/default/virtualbox/private_key
تصویر بعدی، ساختار درختی این پوشه را نشان میدهد:
نصب وب سرور آپاچی
حال به سراغ نصب وب سرور آپاچی و نحوهی دسترسی به آن از طریق مرورگر وب میرویم.
مرحلهی 1: وب سرور apache را با اجرای دستور زیر، نصب کنید:
sudo apt-get install apache2 -y
مرحلهی 2: سرور آپاچی را با دستور زیر راه اندازی کنید:
sudo service apache2 start
مرحلهی 3: در این مرحله، باید وضعیت سرور را بررسی کنید. با اجرای دستور زیر، وضعیت سرور نمایش داده میشود:
sudo service apache2 status
مرحلهی 4: با استفاده از دستور curl میتوانیم ببینیم که آیا میتوانیم به وب دسترسی داشته باشیم یا خیر. با اجرای دستور زیر، باید صفحهی HTML خوش آمدگویی آپاچی 2 را ببینید:
curl localhost
مرحلهی 5: با استفاده از دستور زیر، آدرس IP مجازی برایتان نمایش داده میشود:
ip route get 1.2.3.4 | awk '{print $7}'
مرحلهی 6: حال curl را با آدرس IP امتحان میکنیم. خروجیای که مشاهده میکنید باید خروجی مرحله 4 باشد. در اینجا، آدرس IP را با آدرسی که در خروجی دستور بالا دارید، جایگزین کنید:
curl 10.0.2.15
مرحلهی 7: حال باید سعی کنید از مرورگر وب سیستم به آدرس IP دسترسی پیدا کنید. در حالت عادی، قادر به دریافت این دسترسی نیستید؛ زیرا حالا شبکهی فعلی ماشین مجازی، یک شبکهی خصوصی نیست. این به این معنی است که راهی از دنیای بیرون به ماشین مجازی وجود ندارد.
برای دسترسی به ماشین مجازی از طریق مرورگر، باید در فایل Vagrant یک سری تغییرات ایجاد کنیم. این کار را در مراحل بعدی انجام میدهیم.
مرحلهی 8: با اجرای دستور زیر، ماشین مجازی را نابود کنید:
vagrant destroy
مرحلهی 9: حال فایل Vagrantfile را باز کرده و خط زیر را از حالت کامنت خارج کنید (یعنی از حالت کامنت خارج کرده و به حالت دستور اجرایی درآورید:
config.vm.network "private_network", ip: "192.168.33.10"
این یعنی شبکهی خصوصی را فعال میکنیم و آدرس IP ماشین مجازی را بر روی آدرس موردنظرمان که در اینجا 192.168.33.10 میگذاریم.
اگر میخواهید از رایانهی دیگری دسترسی به ماشین مجازی را از طریق شبکهی وایفای فعال کنید، خط زیر را هم از حالت کامنت خارج کنید:
config.vm.network "public_network"
پس از مجازیسازی با Vagrant وقتی ماشین مجازی را بالا میآورید، درخواستی مانند زیر برایتان ظاهر میشود:
همچنین، میتوانید ارسال پورت از هاست به ماشین مجازی ویگرنت را پیکربندی کنید. به عنوان مثال، در صورتی که یک سرور آپاچی را روی پورت 80 روی ماشین مجازی اجرا کنید، میتوانید با دستور زیر، پورت هاست 8080 را برای ارسال درخواست به پورت 80 ماشین مجازی، پیکربندی کنید:
config.vm.network "forwarded_port", guest: 80, host: 8080
از این طریق، میتوانید از مرورگر وب هاست خود در آدرس http: //localhost: 8080 به سرور آپاچی دسترسی داشته باشید.
مرحلهی 10: با اجرای دستور زیر، ماشین مجازی را دوباره اجرا کرده و SSH را وارد کنید:
vagrant up vagrant ssh
مرحلهی 11: حال سرور آپاچی را نصب کرده و با استفاده از مراحل 1 و 2، کار با آن را شروع کنید.
مرحلهی 12: حال با استفاده از آدرس 192.168.33.10 به صفحهی خوشامدگویی آپاچی دسترسی دارید:
http: //192.168.33.10
پوشهی اشتراکی Vagrant چیست؟
برای به اشتراک گذاشتن پوشهی هاست با ماشین مجازی، میتوانیم از مسیر /vagrant استفاده کنیم…
پوشهی اشتراکی پیشفرض Vagrant
هر ماشین مجازی ویگرنت یک پوشه با مسیر /vagrant دارد. این پوشه، در پوشهی میزبانی که Vagrantfile در آن قرار دارد، نصب میشود. این به این معنی است که پوشهی پروژهای که برای ساخت Vagrantfile درست میکنید، در داخل ماشین مجازی و در محل /vagrant نصب میشود.
در نتیجه، اگر از یک ماشین مجازی vagrant به پوشهی /vagrant دسترسی داشتهباشید، میتوانید Vagrantfile را ببینید. حال چرا این پوشه برای ما مهم است؟
در صورتی که بر روی یک کد روی ماشین میزبان کار میکنید، میتوانید پوشهی پروژهی vagrant را به عنوان پوشهی اصلی کد تنظیم کرده تا وبسرور در حال اجرا در ماشین مجازی بتواند به کد شما دسترسی داشتهباشد و مستقیماً آن را آزمایش کند.
محل پوشهی اشتراکی سفارشی Vagrant
config.vm.synced_folder "/host/code/", "/vm/code"
در پیکربندی بالا، مسیر /host/code/ به پوشهی موجود در ماشین میزبان و مسیر /vm/code به محل داخل ماشین مجازی اشاره دارد. در صورتی که از یک پوشهی مشترک برای ذخیرهسازی کدها و تنظیماتتان در دستگاه میزبان استفاده میکنید، این ویژگی میتواند برایتان مفید باشد.
CPU و حافظهی سفارشی
شما میتوانید برای ماشین مجازی vagrant خود، یک CPU و حافظهی سفارشی تعریف کنید. برای این کار، مقدار CPU و حافظه را بر اساس منابع موجود در سیستمتان تنظیم کنید. دستورات زیر، نحوهی انجام این پیکربندی را نشان میدهد:
config.vm.provider "virtualbox" do |vb| vb.memory = 2048 vb.cpus = 1 end
ابزار پیکربندی خودکار Vagrant چیست؟
یکی از ویژگیهای خوب Vagrant این است که میتوانید ابزار پیکربندی خودکار را به Vagrantfile اضافه کنید. ابزار پیکربندی خودکار به اسکریتی گفته میشود که میتوان آن را در تهیه، در یک دستگاه دانلود کرد و یا آن را دانلود و اجرا کرد. در اینجا، یک مثال از داشتن یک shell script به عنوان یک اسکریپت ابزار پیکربندی خودکار را میبینیم:
config.vm.provision "shell", inline: <<-SHELL apt-get update apt-get install -y apache2 service apache2 start SHELL
همچنین میتوانید از Ansible، Chef یا puppet به عنوان تدارکات استفاده کنید.
نمونههایی از Vagrantfileها
شما میتوانید از یک Vagrantfile، یک یا چند ماشین مجازی ایجاد کنید. در این قسمت، میخواهیم چند نمونه از پیکربندیهای یک و چندماشینه (مجازی) را با یکدیگر ببینیم.
Vagrantfile تک ماشینه
دستورات پیکربندی Vagrantfile زیر، مربوط به همان چیزی است که در بالا توضیح دادیم. این دستورات:
- با استفاده از باکس ubuntu/trusty64 ماشین مجازی را ایجاد میکند.
- private network، public network و ارسال پورت بر روی پورت میزبان 8080 را فعال میکند.
- پوشهی مشترک سفارشی.
- CPU و حافظهی سفارشی.
- پیش نیازهای Shell برای نصب apache2.
# -*- mode: ruby -*- # vi: set ft=ruby: Vagrant.configure("2") do |config| config.vm.box = "bento/ubuntu-22.04" config.vm.network "private_network", ip: "192.168.33.10" config.vm.network "public_network" config.vm.network "forwarded_port", guest: 80, host: 8080 config.vm.synced_folder "code/", "/app/code" config.vm.provider "virtualbox" do |vb| vb.memory = 2048 vb.cpus = 1 end config.vm.provision "shell", inline: <<-SHELL apt-get update apt-get install -y apache2 service apache2 start SHELL end
Vagrantfile چندماشینه
پیکربندی Vagrantfile زیر، دارای تنظیماتی برای ایجاد دو ماشین مجازی به نامهای web و db است که هر کدام، تنظیمات خاص خودشان را دارند:
Vagrant.configure("2") do |config| config.vm.provision "shell", inline: "echo Hello" config.vm.define "web" do |web| web.vm.box = "bento/ubuntu-22.04" web.vm.network "private_network", ip: "192.168.33.20" web.vm.synced_folder "code/", "/app/code" web.vm.provider "virtualbox" do |vb| vb.memory = 1048 vb.cpus = 1 end end config.vm.define "db" do |db| db.vm.box = "ubuntu/trusty64" db.vm.network "private_network", ip: "192.168.33.30" db.vm.synced_folder "data/", "/db/data" db.vm.provider "virtualbox" do |vb| vb.memory = 2048 vb.cpus = 1 end end end
برای واردکردن SSH به ماشینهای مجازی، به نامهای web و db نیاز دارید:
vagrant ssh web vagrant ssh db
البته، میتوانید به صورت جداگانه ماشینهای مجازی را با فراخوانی نامشان مدیریت کنید.
Vagrantfile چندماشینه با حلقه (Loop)
فرض کنید میخواهید 3 ماشین مجازی یکسان درست کنید. در این حالت، میتوانید از یک حلقه برای ایجاد ماشین مجازی با IPهای خصوصی مشتقشده، استفاده کنید. دستورات زیر، نمونهای از ایجاد 3 ماشین مجازی با استفاده از حلقه را نشان میدهند:
Vagrant.configure("2") do |config| (2..4).each do |i| config.vm.define "vm-#{i}" do |web| web.vm.box = "bento/ubuntu-22.04" web.vm.network "private_network", ip: "192.168.33.#{i}", auto_config: false web.vm.provision "shell", inline: "echo hello #{i}" web.vm.synced_folder "code/", "/app/code" end end end
تفاوت بین داکر و vagrant چیست؟
در این آموزش، به طور مفصل توضیح دادیم که Vagrant چیست و چه کاربردهایی دارد. اکنون قصد داریم این ابزار را با داکر مقایسه کنیم.
ویگرنت فقط یک ابزار Wrapper است که قابلیت تهیهی ماشینهای مجازی یا کانتینرها با استفاده از ارائه دهندگانی مانند Docker یا Virtualbox را دارد. در مقابل، Docker یک راه حل سبک و ساده برای مدیریت کانتینترها است.
در صورتی که از Virtualbox یا Vmware به عنوان ارائهدهنده ویگرنت استفاده میکنید، میتوانید یک ماشین مجازی را طبق تنظیمات موجود در Vagrantfile راه اندازی کنید.
اگر از Docker به عنوان ارائه دهندهی Vagrant استفاده میکنید، میتوانید کانتینرهای Docker را طبق تنظیمات موجود در Vagrantfile به صورت خودکار راه اندازی کنید.
سخن پایانی
در این آموزش، به بررسی این که vagrant چیست و نقش آن در تیمهای توسعه پرداختیم و یاد گرفتیم چگونه یک ماشین مجازی Vagrant اولیه را برای محیط های توسعه، راه اندازی کنیم. Vagrant یک ابزار فوقالعاده برای workstations شما محسوب میشود.