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

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.

  1. Vagrant kullanarak Ubuntu tabanlı bir VM oluşturun. Buna apache-vm adını verelim.
  2. Yeni oluşturulan Vagrant VM’ine SSH ile bağlanın.
  3. VM’e bir Apache web server kurun.
  4. 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.

image 5

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.

image 6

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.