İçerik
Bu Vagrant tutorial’ında, geliştirme ortamınız için Virtual machines oluşturmak ve yönetmek amacıyla Vagrant’ı workstation’ınıza nasıl kuracağınızı öğreneceksiniz.
Vagrant Nedir?
Vagrant, Hashicorp ekibi tarafından oluşturulmuş bir open-source utility’dir.
Bu, Virtualbox, HyperV, VMware ve Docker gibi Virtual machine çözümlerinin üzerinde çalışan bir wrapper utility’dir. VM yönetiminde yer alan tüm kompleks aktiviteleri soyutlar ve çoğu görevi otomatikleştirebilir.
Vagrant Mimarisi
Vagrantfile
Vagrant kullanarak, mevcut VM images’dan kolayca sanal geliştirme ortamları oluşturabilir ve tüm VM configs’i Vagrantfile adlı bir configuration file’da tutabilirsiniz. Basitçe ifade etmek gerekirse, Vagrantfile’da bir VM’de ihtiyacınız olan her şeyi tanımlarsınız ve Vagrant, bunları VM’de konfigüre etme işini üstlenir.
İşte bir örnek 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
Eğer bir kişinin sisteminde Vagrant kuruluysa, onlara Vagrantfile’ı paylaşabilir ve yarattığınız benzer bir VM’i oluşturmalarını sağlayabilirsiniz.
Vagrant Boxes
Örnek Vagrantfile’da, “config.vm.box” adlı bir parametre görebilirsiniz.
Vagrant Box == Virtual Machine Image (VM’leri sıfırdan oluşturmak için virtual box ile kullandığınız ISO image’e benzer bir şey)
Vagrant box, önceden hazırlanmış bir Virtual machine image’dir (Ubuntu, Centos, vb.). Bu box formatı, Vagrant kullanan herkesle paylaşılabilir.
Vagrantcloud‘dan hazır bulunan community boxes’ı indirebilirsiniz.
Ayrıca, VM configuration sürecini otomatikleştirmek için Vagrantfile’a shell scripts, chef cookbooks, puppet modules veya Ansible playbooks ekleyebilirsiniz. Daha sonra tüm konfigürasyonları ile birlikte box’ı package edip diğer takım üyeleri ile paylaşabilirsiniz.
Vagrant Kullanım Alanları
- Development Environments: Bir takımda tüm geliştiriciler için aynı development environments’a sahip olmak istediğinizi varsayalım. Bu durumda, development environment dependencies (Software) ile VM’i provision etmek için gereken tüm configs ile ortak bir Vagrantfile oluşturabilirsiniz. Ve ardından bu Vagrantfile’ı tüm geliştiricilerle paylaşabilirsiniz. Bu şekilde, kullanılan yazılım veya configs’te herhangi bir değişiklik olmayacaktır. Bazı şirketler, organizasyondaki herkesin kullanabilmesi için farklı onaylı yazılımlar için Vagrant box’larını ortak bir konumda barındırır.
- Sandboxed Environments: Testing için sandboxed environment istiyorsanız, Vagrant kullanarak dakikalar içinde VM’leri kurup kaldırabilirsiniz.
Ön Gereksinimler
- Virtualbox yüklü olmalı. En son Virtualbox kurulumunu buradan indirebilirsiniz.
- Yazılımı workstation’ınıza yüklemek için root access’e sahip olmalısınız.
- Birkaç yazılım ve VM images’ı indirmek için internet erişimi açık olmalı.
- Workstation’ınızın 4 GB RAM’den fazla olması gerekir.
Vagrant Kurulumu
Adım 1: Bu adresten vagrant kurulum dosyasını indirin.
Adım 2: İşletim sisteminize göre indirdiğiniz dosyadan Vagrant’ı kurun. Vagrant executable otomatik olarak sistem path’inize eklenecek ve vagrant komutunu kullanmaya başlayabilirsiniz.
Adım 3: Vagrant kurulumunu doğrulamak için aşağıdaki vagrant komutunu çalıştırın ve versiyon bilgisi alıp almadığınızı kontrol edin:
vagrant --version
Vagrant ile Başlarken (Geliştirme Ortamları Oluşturma)
Bu bölümde, vagrant’ın nasıl çalıştığını ve geliştirme amaçlarınız için nasıl kullanabileceğinizi temel olarak anlamanızı sağlayacak dört süreci anlatacağım.
- Vagrant kullanarak Ubuntu tabanlı bir VM oluşturun. Buna apache-vm adını verelim.
- Yeni oluşturulan Vagrant VM’ine SSH ile bağlanın.
- VM’e bir Apache web server kurun.
- Web server sayfasına tarayıcı üzerinden erişin.
Kuruluma başlayalım.
Vagrant Kullanarak Bir Sanal Makine Oluşturma
Bu bölümde, vagrant kullanarak bir Virtual machine nasıl oluşturulur öğreneceksiniz.
Adım 1: Tüm vagrant ile ilgili dosyaları saklamak için bir klasör seçin ve bir VM project directory oluşturun.
mkdir apache-vm && cd apache-vm
Adım 2: Ubuntu Image ile bir Vagrantfile başlatın. Bu dosya, referansınız için gerekli tüm configs’leri içerecektir. Burada vagrant cloud’da mevcut olan genel Ubuntu image’ı kullanacağız.
Not: Vagrant’ta, prebaked Virtual Machine images kullanarak VM’ler oluştururuz. Bu images’ın tümü Vagrant cloud kataloğunda bulunabilir ve tamamen ücretsizdir.
Vagrantfile’ı başlatmak için aşağıdaki komutu çalıştırın:
vagrant init bento/ubuntu-22.04
Şu anda kontrol ederseniz, geçerli klasörünüzde bir Vagrantfile görürsünüz. Dosyayı açarsanız, çoğu satırın yorumlanmış olduğunu görürsünüz. Şimdilik bu konuda endişelenmeyelim. Ubuntu VM’i başlatalım.
Adım 3: Aşağıdaki komutu kullanarak Vagrant VM’i başlatın:
vagrant up
Not: Eğer bir virtual box yüklü değilse, “No usable default provider could be found for your system” hatası alırsınız.
Yukarıdaki komut, önce vagrant cloud’dan ubuntu/trusty64 VM image’ını indirecek ve ardından VM’i başlatacaktır. Ayrıca, bir SSH key pair üretecek ve bu süreçte VM’e public key ekleyecektir. Böylece makine ayağa kalktığında SSH ile bağlanabiliriz.
Adım 4: Aşağıdaki komutu kullanarak VM’in durumunu kontrol edebilirsiniz:
vagrant status
Çıktının şu şekilde olması gerekir: running (virtualbox)
Vagrant Virtual Machine’ine SSH ile Bağlanma
Vagrant machine’in SSH bilgilerini öğrenmek için aşağıdaki komutu çalıştırın:
vagrant ssh-config
Yukarıdaki komut, aşağıda gösterildiği gibi kullanıcı adı, key dosyası konumu gibi tüm SSH detaylarını gösterecektir.
$ 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
Şimdi Vagrant tarafından başlatılan VM’e nasıl SSH ile bağlanılacağını inceleyelim.
Komutları apache-vm klasöründen çalıştırdığınızdan emin olun.
Vagrant’a SSH ile bağlanmak için aşağıdaki komutu kullanabilirsiniz:
vagrant ssh
SSH komutunu çalıştırdığınızda, vagrant .vagrant
gizli klasöründen private key dosyasını çeker. Bu klasör, vagrant up
komutu tarafından oluşturulan SSH private key dosyasını içerir.
/apache-vm/.vagrant/machines/default/virtualbox/private_key
Aşağıdaki görsel, dizin yapısını göstermektedir.
Apache Web Server Kurulumu
Şimdi bir apache server kurup, web tarayıcımız üzerinden erişebileceğimize bir bakalım.
Adım 1: Aşağıdaki komutu kullanarak apache’yi kurun.
sudo apt-get install apache2 -y
Adım 2: Apache server’ı başlatın.
sudo service apache2 start
Adım 3: Server’ın durumunu kontrol edin. Çıktı olarak ‘running’ görmelisiniz.
sudo service apache2 status
Adım 4: curl
komutunu kullanarak web sayfasına erişip erişemediğimizi kontrol edelim. Apache 2 HTML welcome page’i çıktısı olarak görmelisiniz.
curl localhost
Adım 5: Aşağıdaki komutu kullanarak VM’in IP adresini öğrenelim.
ip route get 1.2.3.4 | awk '{print $7}'
Yukarıdaki komut IP adresini çıktılar.
Adım 6: IP adresi ile curl
komutunu deneyin. Adım 4 ile aynı çıktıyı görmelisiniz. Çıktıdaki IP adresini kullanın.
curl 10.0.2.15
Adım 7: Şimdi, sisteminizin web tarayıcısından IP adresine erişmeye çalışın. Erişemeyeceksiniz. Bunun nedeni, mevcut VM ağının şimdi özel bir ağ olmamasıdır. Yani, dış dünya ile VM arasında bir bağlantı var.
VM’e tarayıcınızdan erişebilmek için Vagrant dosyasında bazı değişiklikler yapalım.
Adım 8: Aşağıdaki komutu kullanarak VM’i yok edin.
vagrant destroy
Adım 9: Şimdi, Vagrantfile’ı açın ve aşağıdaki satırı uncomment edin.
config.vm.network "private_network", ip: "192.168.33.10"
Bu, özel ağı etkinleştirdiğimiz ve VM’in IP adresini 192.168.33.10 olarak ayarladığımız anlamına gelir.
Eğer VM’e wifi ağınızdaki başka bir bilgisayardan erişimi etkinleştirmek istiyorsanız, aşağıdaki seçeneği etkinleştirin.
config.vm.network "public_network"
VM’i başlattığınızda, aşağıdaki gibi bridge yapılacak arayüzü sormasını sağlayacaktır.
Port Yönlendirme ile Vagrant VM Konfigürasyonu
Host’tan Vagrant VM’e port forwarding de yapılandırabilirsiniz. Örneğin, eğer VM üzerinde 80 numaralı portta bir apache server çalıştırıyorsanız, host port 8080’i VM port 80’e istekleri yönlendirecek şekilde yapılandırabilirsiniz.
config.vm.network "forwarded_port", guest: 80, host: 8080
Bu şekilde, host web tarayıcınızdan http://localhost:8080 adresi üzerinden apache server’a erişebilirsiniz.
Adım 9: VM’i tekrar başlatın ve SSH ile bağlanın.
vagrant up
vagrant ssh
Adım 10: Şimdi, adım 1 ve 2’yi kullanarak apache server’ı kurun ve başlatın.
Adım 11: Şimdi 192.168.33.10 adresini kullanarak apache welcome page’e erişmeye çalışın. Erişebileceksiniz.
http://192.168.33.10
Vagrant Paylaşılan Klasör
Eğer host klasörünü Vagrant VM ile nasıl paylaşacağınızı merak ediyorsanız, burada /vagrant klasörü devreye giriyor.
Vagrant Varsayılan Paylaşılan Klasör
Her Vagrant VM’inin bir /vagrant klasörü olacaktır. Bu klasör, Vagrantfile’ın bulunduğu host klasörüne monte edilir. Yani, Vagrantfile’a sahip olmak için oluşturduğunuz project folder, VM içinde /vagrant konumuna monte edilir.
Bir vagrant VM’den /vagrant klasörüne erişirseniz, Vagrantfile’ı görebilirsiniz.
Paylaşılan Klasör Kullanım Alanı
Host machine’de kodunuzu çalıştırıyorsanız, vagrant project folder’ı kod için root folder olarak ayarlayabilirsiniz, böylece VM’deki web server kodunuzu erişip doğrudan test edebilir.
Vagrant Özel Paylaşılan Klasör Konumu
Özel bir host folder kullanmak istiyorsanız, config.vm.synced_folder parametresini ekleyerek bunu yapabilirsiniz.
Örneğin,
config.vm.synced_folder "/host/code/", "/vm/code"
Yukarıdaki config’de, /host/code/ host machine’de mevcut olan klasör ve /vm/code Vagrant VM içindeki konumdur.
Bu özellik, tüm kod ve configs’lerinizi host machine’de depolamak için ortak bir klasör kullanıyorsanız çok kullanışlıdır.
Özel CPU ve Bellek
Vagrant VM’iniz için özel CPU ve bellek tanımlayabilirsiniz.
Sisteminizdeki mevcut kaynaklara göre CPU ve bellek değerlerini ayarlayın.
İşte config syntax’ı:
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
vb.cpus = 1
end
Vagrant Provisioner
Vagrant’ın en güzel özelliklerinden biri, Vagrantfile’a provisioning scripts ekleyebilmenizdir.
Bir shell script’in provisioner olarak kullanıldığına dair bir örnek:
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y apache2
service apache2 start
SHELL
Provisioner olarak Ansible, Chef veya Puppet da kullanabilirsiniz.
Örnek Vagrantfile’lar
Tek bir Vagrantfile’dan tek veya çoklu VM’ler oluşturabilirsiniz. İşte tek ve çoklu VM configs örnekleri:
Tek VM Vagrantfile
Aşağıdaki Vagrantfile, yukarıda açıkladığım tüm kavramları içerir.
- ubuntu/trusty64 box ile VM oluşturur
- Private network, public network ve host port 8080 üzerinde port forwarding etkinleştirir
- Özel paylaşılan klasör
- Özel CPU ve bellek
- Apache2 kurulumunu gerçekleştiren shell provisioner
# -*- 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
Çoklu VM Vagrantfile
Aşağıdaki Vagrantfile, web ve db adlı iki VM oluşturmak için gerekli configs’e sahiptir.
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
VM’lere SSH ile bağlanmak için web ve db adlarını kullanmanız gerekir.
vagrant ssh web
vagrant ssh db
VM’leri isimleriyle ayrı ayrı yönetebilirsiniz.
Loop ile Çoklu VM Vagrantfile
Aynı türden 3 VM oluşturmak istediğinizi varsayalım.
Bu durumda, bir döngü kullanarak türetilmiş private IP’ler ile çoklu VM’ler oluşturabilirsiniz.
İşte bir örnek:
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 vs Docker
Vagrant, Virtualbox veya Docker gibi backend providers kullanarak VM veya containers provision yapabilen bir wrapper utility’dir. Buna karşılık, Docker kendi tooling setiyle containers yönetimini sağlayan hafif bir container çözümüdür.
Eğer Vagrant için provider olarak Virtualbox veya Vmware kullanırsanız, Vagrantfile’daki configs’e göre bir Virtual machine başlatabilir.
Eğer Vagrant için provider olarak Docker kullanırsanız, Vagrantfile’daki configs’e göre docker containers başlatabilir.
Sonuç
Bu Vagrant tutorial’ında, geliştirme ortamları için temel bir Vagrant Virtual machine kurmayı öğrendiniz.
Çalışma ortamlarınız için geliştirme ortamları kurmak için harika bir araçtır.
Bunları docker-compose gibi araçları kullanarak da başarabilirsiniz.
Eğer ilgilenirseniz Container İçerisindeki Güvenlik Açıklarını Trivy ile Taramak – 1 Yazıda Detaylı Rehber adlı konuma da göz gezdirebilirsiniz.