وگرنت چیزی نیست که تو استفاده روزمره بین دولوپرا یا توی پست های لینکدین درباره ش صحبت بشه پس اگه دارین این پست رو میخونین احتمالن بدونین برای چی استفاده میشه. اگرم نمیدونید که بریم سراغ تعریفی که سایتشون از خودشون داره. میگه ما یه ابزار کامند لاینی هستیم برای مدیریت ماشین های مجازی.
سوالی که پیش میاد اینه که خوب 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("2") do |config| config.vm.box = "base" end
برای اینکه ماشین با این کانفیگی که مشخص کردیم راه بیفته دستور زیر رو میزنیم.
vagrant up
الان ماشین اومد بالا ولی برای اینکه بتونیم ازش استفاده کنیم باید بهش ssh بزنیم که با دستور زیر وارد ماشین میشیم.
vagrant ssh
چیزی که تو تکه کد بالا مهمه اینه که config.vm.box چیه؟
وگرنت داره از یه مفهومی استفاده میکنه به نام box که تقریبن یه چیزی شبیه cd ویندوز خودمونه یا اگه یه خورده حرفه ای تر هستید مثه iso سیستم عامل یا اگه دیگه خیلی کارتون درسته مثه image داکر میمونه. مثلن اگه میخوایم یه vm داشته باشیم که داره از ubuntu استفاده میکنه میتونیم کانفیگمون رو اینجوری بنویسیم
Vagrant.configure("2") do |config| config.vm.box = "bento/ubuntu-22.04" end
و یا اینکه وقتی داریم از کامند init استفاده میکنیم میتونیم اسم box رو هم بهش بگیم.
vagrant init "bento/ubuntu-22.04"
اگه بخوایم لیست boxهای موجود روی سیستم رو ببنیم از دستور پایین استفاده میکنیم.
vagrant box list
و اگه بخوایم یه باکسی رو دستی اضافه کنیم از دستور پایین استفاده میکنیم.
vagrant box add "box_name"
بعضی وقتا لازممون میشه چندتا ماشین رو همراه بیاریم بالا. وگرنت برای این هم فکری کرده و توی داکش هم چندتا از usecase هاشو مثال زده. مثلن
یکی دو مورد دیگه هم گفته که به درد من نمیخوره.
خوب برای این کار اول نمونه کدشو رو ببینیم بعدش راجع بهش توضیح میدم.
Vagrant.configure("2") do |config| config.vm.provision "shell", inline: "echo Hello" config.vm.define "web" do |web| web.vm.box = "apache" end config.vm.define "db" do |db| db.vm.box = "mysql" end end
خوب این قطعه کدی که بالا گذاشتم همون usecaseی هست که سرور وب و دیتابیس جدا داشتیم. به قول داک وگرنت اومدیم یه کانفیگ دیگه داخل فایل کانفیگ نوشتیم. یعنی اومدیم مثه برنامه نویسی دو تا scope جدید ساختیم. مثلن اینجا اگه نوشتیم web مثه همون config خط اول عمل میکنه.
وقتی که چندتا ماشین همراه هم ران میکنیم بعضی دستورا یه خورده عوض میشن مثلن به جای
vagrant ssh
باید اسم ماشینی که میخوایم بهش وصل شیم رو هم بنویسیم که مثلن اینجا برا وب میشه
vagrant ssh web
وقتی که vagrant up میزنیم همه ماشین ها باهم بالا میان که میتونیم ماشین هارو به صورت تکی هم بالا بیاریم. مثلن بزنیم
vagrant up web
یا اینکه میتونیم autostart ماشینایی که دلمون میخواد رو غیرفعال کنیم.
config.vm.define "web" config.vm.define "db" config.vm.define "db_follower", autostart: false
و اما حرکت دیگه ای که میشه زد اینه که یه تعداد ماشین مثه هم رو با حلقه ایجاد کرد.
(1..3).each do |i| config.vm.define "node-#{i}" do |node| node.vm.provision "shell", inline: "echo hello from node #{i}" end end
حالا که با قضیه چندماشینی آشنا شدیم میمونه اینکه این ماشین ها چجوری باهم در ارتباط باشن و چجوری با سیستم خودمون یا به عبارتی با host خودمون در ارتباط باشن. ارتباط بین ماشینها سه روش داره.
ساده ترین روش اینه یک یا چند پورت از ماشینی که vagrant برامون ساخته رو forward کنیم روی host. توی کد زیر هم مشخصه پورت سیستم خودمون میشه host و پورت vm میشه guest. یه گزینه دیگه هم هست که میشه فعالش کرد به نام auto_correct که اگه مثلن پورتی که روی host مشخص کردیم مشغول بود یه پورت دیگه رو اختصاص میده بهش.
Vagrant.configure("2") do |config| config.vm.network "forwarded_port", guest: 80, host: 8080 auto_correct: true end
اگه تنظیمات شبکه vm رو بذاریم روی حالت private آیپی که ماشین میگیره میشه از رنج IPهای private. در این مورد دو حالت پیش میاد یکی اینکه مثه کد پایین DHCP رو فعال کنیم که ماشین اتومات IP بگیره.
Vagrant.configure("2") do |config| config.vm.network "private_network", type: "dhcp" end
یا اینکه بهش IP Static بدیم.
Vagrant.configure("2") do |config| config.vm.network "private_network", ip: "192.168.50.4" end
همون قضایای private رو توی قسمت public داریم که به صورت زیر هست.
Vagrant.configure("2") do |config| config.vm.network "public_network" end
با این لینک شما میتوانید پیشنویس خود را حتی قبل از انتشار با دوستانتان به اشتراک بگذارید و نظر آنها را در مورد آن بدانید.
Vagrant.configure("2") do |config| config.vm.network "public_network", ip: "192.168.50.4" end
همون طور که از اسمش معلومه با استفاده از این قابلیت میتونیم یه دایرکتوری رو بین host و vm به اشتراک بگذاریم. آدرس اولی رو که میدیم مربوط به host میشه و نسبت به دایرکتوری پروژه حساب میشه و آدرس دومی باید absolute path باشه.
Vagrant.configure("2") do |config| # other config here config.vm.synced_folder "src/", "/srv/website" 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