محمدامین احمدی
محمدامین احمدی
خواندن ۶ دقیقه·۲ ماه پیش

وگرنت | Vagrant برام vm بساز

HashiCorp Vagrant
HashiCorp Vagrant

وگرنت چیه و چرا؟

وگرنت چیزی نیست که تو استفاده روزمره بین دولوپرا یا توی پست های لینکدین درباره ش صحبت بشه پس اگه دارین این پست رو میخونین احتمالن بدونین برای چی استفاده میشه. اگرم نمیدونید که بریم سراغ تعریفی که سایتشون از خودشون داره. میگه ما یه ابزار کامند لاینی هستیم برای مدیریت ماشین های مجازی.

سوالی که پیش میاد اینه که خوب vmware و virtualbox و ... ابزارهای دیگه برای مجازی سازی هستن چرا باید به خودمون زحمت بدیم و پای یه چیز دیگه رو بکشیم وسط؟

باید خدمتتون عرض کنم چیزی که من تا به اینجا بهش پی بردم اینه که میتونیم با استفاده از یه دونه Vagrantfile که توش مشخصات ماشینمون رو مشخص کردیم vm بسازیم. ولی این سودیش کجاس؟

به نظر من سودش اینجاست که ما میتونیم مشخصات vm رو توی فایل بنویسیم و اگه تغییراتی هم در طول زمان روش انجام میدیم مثلن با git ثبت کنیم و هر موقع لازممون شد فایل رو برداریم و دوباره ازش استفاده کنیم. مخصوصن برای من که هر چند وقت یه بار یه vm لازمم تا یه سری چیزا رو تست کنم.

همچنین به قول خارجیها under the hood می‌تونیم از providerهای مختلف برای مجازی سازی استفاده کنیم که من از virtualbox استفاده میکنم. فقط نکته ای که هست اون باکسی که استفاده میکنم برای پروایدرهای مختلف فرق میکنه.

وگرنت رو چجوری راه بنداریم؟

به قول خارجیا let's get our hands dirty و بریم تو کار ببنیم vagrant چجوری راه میفته.

بعد از اینکه وگرنت رو نصب کردید این کامند زیری رو بزنید.

vagrant init

این کامند اتومات میاد یه دونه Vagrantfile براتون میسازه که اکثر چیزایی که توش هست کامنت شده. اگه یه نگاه اجمالی که بهش بندازید متوجه میشید که این فایل با یه زبون برنامه نویسی نوشته شده اگه نفهمیدی چیه طوری نیست چون با Ruby نوشته شده. اما خیلی نگران نباشید که باید برید یه زبان جدید یاد بگیرید اکثر کاری که میخوایم انجام بدیم اینه که چندتا متغیر رو مقدار بدیم.

اگه کامنتارو بیخیال بشیم چیزی که واقعن توی فایل وجود داره اینه:

Vagrant.configure(&quot2&quot) do |config| config.vm.box = &quotbase&quot end

برای اینکه ماشین با این کانفیگی که مشخص کردیم راه بیفته دستور زیر رو میزنیم.

vagrant up

الان ماشین اومد بالا ولی برای اینکه بتونیم ازش استفاده کنیم باید بهش ssh بزنیم که با دستور زیر وارد ماشین میشیم.

vagrant ssh

باکس | Box چیه؟

چیزی که تو تکه کد بالا مهمه اینه که config.vm.box چیه؟

وگرنت داره از یه مفهومی استفاده میکنه به نام box که تقریبن یه چیزی شبیه cd ویندوز خودمونه یا اگه یه خورده حرفه ای تر هستید مثه iso سیستم عامل یا اگه دیگه خیلی کارتون درسته مثه image داکر میمونه. مثلن اگه میخوایم یه vm داشته باشیم که داره از ubuntu استفاده میکنه میتونیم کانفیگمون رو اینجوری بنویسیم

‍‍‍‍‍Vagrant.configure(&quot2&quot) do |config| config.vm.box = &quotbento/ubuntu-22.04&quot end

و یا اینکه وقتی داریم از کامند init استفاده میکنیم میتونیم اسم box رو هم بهش بگیم.

vagrant init &quotbento/ubuntu-22.04&quot

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

vagrant box list

و اگه بخوایم یه باکسی رو دستی اضافه کنیم از دستور پایین استفاده می‌کنیم.

vagrant box add &quotbox_name&quot


چندماشینی | Multi-Machine

بعضی وقتا لازممون میشه چندتا ماشین رو همراه بیاریم بالا. وگرنت برای این هم فکری کرده و توی داکش هم چندتا از usecase هاشو مثال زده. مثلن

  • وقتی که توپولوژی چند سروری داریم یا سرور وب و دیتابیسمون از هم جداست.
  • اگه بخوایم سیستم های توزیع شده رو شیبه سازی کنیم. (احتمالن منظورش اینه کوبری چیزی بخواین بیارین بالا)

یکی دو مورد دیگه هم گفته که به درد من نمیخوره.

خوب برای این کار اول نمونه کدشو رو ببینیم بعدش راجع بهش توضیح میدم.

Vagrant.configure(&quot2&quot) do |config| config.vm.provision &quotshell&quot, inline: &quotecho Hello&quot config.vm.define &quotweb&quot do |web| web.vm.box = &quotapache&quot end config.vm.define &quotdb&quot do |db| db.vm.box = &quotmysql&quot end end

خوب این قطعه کدی که بالا گذاشتم همون usecaseی هست که سرور وب و دیتابیس جدا داشتیم. به قول داک وگرنت اومدیم یه کانفیگ دیگه داخل فایل کانفیگ نوشتیم. یعنی اومدیم مثه برنامه نویسی دو تا scope جدید ساختیم. مثلن اینجا اگه نوشتیم web مثه همون config خط اول عمل میکنه.

وقتی که چندتا ماشین همراه هم ران میکنیم بعضی دستورا یه خورده عوض میشن مثلن به جای

vagrant ssh

باید اسم ماشینی که میخوایم بهش وصل شیم رو هم بنویسیم که مثلن اینجا برا وب میشه

vagrant ssh web

وقتی که vagrant up میزنیم همه ماشین ها باهم بالا میان که میتونیم ماشین هارو به صورت تکی هم بالا بیاریم. مثلن بزنیم

vagrant up web

یا اینکه میتونیم autostart ماشینایی که دلمون میخواد رو غیرفعال کنیم.

config.vm.define &quotweb&quot config.vm.define &quotdb&quot config.vm.define &quotdb_follower&quot, autostart: false

و اما حرکت دیگه ای که میشه زد اینه که یه تعداد ماشین مثه هم رو با حلقه ایجاد کرد.

(1..3).each do |i| config.vm.define &quotnode-#{i}&quot do |node| node.vm.provision &quotshell&quot, inline: &quotecho hello from node #{i}&quot end end

شبکه

حالا که با قضیه چندماشینی آشنا شدیم میمونه اینکه این ماشین ها چجوری باهم در ارتباط باشن و چجوری با سیستم خودمون یا به عبارتی با host خودمون در ارتباط باشن. ارتباط بین ماشینها سه روش داره.

  • اولیش Port Forwarding
  • دومیش Private Network
  • و سومیش هم Public Network

روش Port Forwarding

ساده ترین روش اینه یک یا چند پورت از ماشینی که vagrant برامون ساخته رو forward کنیم روی host. توی کد زیر هم مشخصه پورت سیستم خودمون میشه host و پورت vm میشه guest. یه گزینه دیگه هم هست که میشه فعالش کرد به نام auto_correct که اگه مثلن پورتی که روی host مشخص کردیم مشغول بود یه پورت دیگه رو اختصاص میده بهش.

Vagrant.configure(&quot2&quot) do |config| config.vm.network &quotforwarded_port&quot, guest: 80, host: 8080 auto_correct: true end

استفاده از Private Network

اگه تنظیمات شبکه vm رو بذاریم روی حالت private آیپی که ماشین میگیره میشه از رنج IPهای private. در این مورد دو حالت پیش میاد یکی اینکه مثه کد پایین DHCP رو فعال کنیم که ماشین اتومات IP بگیره.

Vagrant.configure(&quot2&quot) do |config| config.vm.network &quotprivate_network&quot, type: &quotdhcp&quot end

یا اینکه بهش IP Static بدیم.

Vagrant.configure(&quot2&quot) do |config| config.vm.network &quotprivate_network&quot, ip: &quot192.168.50.4&quot end

استفاده از Public Network

همون قضایای private رو توی قسمت public داریم که به صورت زیر هست.

Vagrant.configure(&quot2&quot) do |config| config.vm.network &quotpublic_network&quot end

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

Vagrant.configure(&quot2&quot) do |config| config.vm.network &quotpublic_network&quot, ip: &quot192.168.50.4&quot end

قابلیت Synced Folder

همون طور که از اسمش معلومه با استفاده از این قابلیت می‌تونیم یه دایرکتوری رو بین host و vm به اشتراک بگذاریم. آدرس اولی رو که میدیم مربوط به host میشه و نسبت به دایرکتوری پروژه حساب میشه و آدرس دومی باید absolute path باشه.

Vagrant.configure(&quot2&quot) do |config| # other config here config.vm.synced_folder &quotsrc/&quot, &quot/srv/website&quot end



در پایان هم چندتا دستور دیگه هست که دونستنشون خالی از لطف نیست.

vagrant destroy // حذف ماشین vagrant global-status // وضعیت همه ماشین های ایجاد شده توسط وگرنت vagrant status // وضعیت ماشین های داخل یه پروژه vagrant ssh-config // نمایش کانفیگ اتصال به ماشین vagrant halt // غیرفعال کردن ماشین


آدرس ریپوی گیتهابم رو هم میذارم که سه نمونه vagrantfile مختلف توش هست.

https://github.com/mmdaminah/vagrant

منابع:

https://developer.hashicorp.com/vagrant

https://github.com/AhmadRafiee/DevOps_Certification/tree/main/vagrant



برنامه نویسیdevopsvmcloud
اینجا سعی میکنم چیزایی که جدید یاد میگیرم رو با شما به اشتراک بگذارم :)
شاید از این پست‌ها خوشتان بیاید