Berkshelf ile Paket Yönetimi #5

vagrant ile calismaya baslamak

Geldik Vagrant için paket yönetimi yapmaya. Paket denilince aklınıza ne geliyor? Konuşma paketi? Kurye paketi? Bomba paketi? Yok yok, korkmayın o tarz şeyler değil.

Paket, bir mimarinin çekirdek yazılımı üzerinde çalışacak ve uygulamaya ekstra özellikler katmak için kullanılan parçalar halindeki yazılımlardır. Sanırım bizim meslekteki paket tanımını, teorik olarak bu şekilde yapabiliriz. Mutlaka bir yerlerde, bir makale okurken görmüşsünüzdür. Bu paket yönetimi işine ecnebiler "Dependency Management" yani bağımlılık yönetimi diyorlar. Oradan kafanızda canlansın.

Berkshelf

Teorik tanımlardan kurtulup örnek üzerinden anlatırsak, çok daha iyi anlayacağımıza eminim. Bu paket yönetimi işlemlerini Node.JS için npm, PHP için Composer, Java için Maven, Ruby için Bundler hallediyor. Biz ise bu paket yönetim işlemini Chef Development Kit içerisinde entegre gelen Berkshelf yazılımı aracılığı ile yapacağız. Ancak siz Berkshelf'e muadil olan librarian-chef yazılımınıda kullanabilirsiniz. Biz bu yazı dizisinde Berkshelf üzerinden anlatım yapacağız. Çünkü Berkshelf ile kendi cookbooklarımızı da hazırlayabiliyoruz. Bu harika!

Berkshelf'in resmi web sitesi şurası.

Neden Paket Yönetimi?

Hadi diyelim programlama dillerindeki paket yönetimini anladık. E arkadaş bizim Vagrant ortamında bu iş ile ne alakamız var diye gayet mantıklı bir soru sorabilirsiniz. Hemen cevaplayalım. Biliyorsunuz Vagrant'ın geliştirilme sebebi, geliştirme ve yayın ortamını birbirine eşitlemek diye defalarca tekrarladık. Peki bu eşitlik nasıl sağlanacak? Bunu sağlamak için, öncelikli olarak kullanılacak yazılımların bir şekilde iki ortamada zahmetsiz şekilde kurulması gerekiyor. Biz, Vagrant üzerindeki işletim sistemi üzerine kurulacak olan yazılımları (paketleri,bağlımlıkları vb.) bir metin dosyasında satır satır belirtiyoruz ve bu yazılımlar paket yöneticimiz Berkshelf aracılığı ile bilgisayarımıza indiriliyor.Yayın ortamına geçme zamanı gelip bu paketleri yayın sunucusuna kurmak istediğimde bana lazım olan sadece o basit dosya. Basit ama etkili.

Eğer paket yönetimi sistemini kullanmıyor olsaydık, neyse hiç bahsetmeyelim bile. Unutulmaması gereken bir nokta, Berkshelf sadece paket indirme işlemini yapabilir. İndirilen paketlerin sanal sunucuya kurulması işlemi Chef'e ait.

Cookbook Tanımı

Yukarıda bahsettiğimiz paketlerin herbiri, Chef tarafında cookbook kelimesi ile ifade ediliyor. Berkshelf aracını kullanarak Cookbook yönetimini yapıyoruz ve bu yönetimi sağlamak için Berksfile isimli dosyaları kullanıyoruz.

Tüm Cookbooklar belli bir repoda barındırılıyor. Biz herhangi bir cookbook indirip, kullanmak istediğmizde şu adrese gideceğiz ve arama kutusunu kullanarak istediğimiz cookbook'a erişmeye çalışacağız. Burası bizim "Cookbook Süper Marketimiz". İhtiyacımız olan ne ise bu marketten alıp gidiyoruz. Hemde hiçbir ücret ödemeden! Kasiyer yok, çalışan yok! Eee özgür yazılımın etinden sütünden faydalanmak böyle birşey işte :)

Örnek olarak cookbook repomuzdan node.js için bir arama yapalım.

Cookbook araması

Yukarıda bulunan ekran görüntüsünden anlaşılacağı üzere yaptığımız "nodejs" anahtar kelimesi için 9 sonuç bulundu. Birden fazla sonuç gelmesi durumunda en fazla indirileni tercih edebilirsiniz. Bu cookbook an itibariyle tam tamına 23,323,066 kez indirilmiş. Siz bu yazıyı okurken muhtemelen bu sayı artmış olacaktır.

Arama yaparken dikkat edilmesi gereken nokta ise anahtar kelimeyi yazdığınız kısmın solunda bulunan seçim alanı. Bu seçim alanında Cookbooks seçeneği seçilmiş olmalıdır.

Arattığınız cookbook'un desteklediği işletim sistemlerini sol altta bulunan Supported Platforms kısmından görebilir ve mouse ile üzerine geldiğinizde ilgili işletim sisteminin hangi versiyonlarında desteklendiği bilgisine erişebilirsiniz.

Dilerseniz bu siteye üye olarak kullandığınız cookboklarda yapılan değişikleri "follow" butonu aracılığı ile takip edebilirsiniz.

Son olarak bu cookbookların bağımlılıkları olabiliyor. Örneğin "nodejs" cookbook'u çalışabilmek için farklı cookbooklara ihtiyaç duyabiliyor. Siz "nodejs" cookbook'unu indirdiğinizde bağımlılığı olan cookbooklarda otomatik olarak indiriliyor.

Aşağıdaki ekran görüntüsünden anlaşılacağı üzere "nodejs" cookbook'u 5 ayrı cookbook'a bağımlı.

bağımlılıklar

Bu görünüme herhangi bir cookbook'un detay sayfasına gidip "dependencies" sekmesinden erişebilirsiniz.

Chef Development Kit

Berkshelf'in ChefDK içerisine entegre geldiğini söylemiştik. Şimdi bu kurulumu yapmamız gerekiyor. Ekipman içeriğine, kurulum dosya ve talimatlarına şu adresten erişebilirsiniz. Gayet kolay bir kurulumu var.

Windows kullanan arkadaşların bu kurulumdan sonra bilgisayarı yeniden başlatması gerekiyor.

Git

İndireceğimiz cookbooklar bir git reposundan geleceği için, öncelikle sistemimizde git kurulu olması gerekmektedir. Aksi takdirde gerekli indirme işlemlerini gerçekleştiremeyiz. Git için kurulum talimatlarına şu adresten erişebilirsiniz.

İşe Başlayalım

Kullanıcı ev klasörüne gidelim ve "APP" ismine sahip bir klasör oluşturalım. Tüm işlemlerimiz bu klasör altında gerçekleşecek.

cd ~
mkdir APP

OluşturduğumuzAPP isimli klasöre gidelim ve içerisine Vagrantfile ve Berksfile isimli birer dosya oluşturalım.

Berksfile isimli dosyamızı metin editörümüz ile açalım ve içerisine aşağıdaki satırları ekleyelim.

source "https://supermarket.getchef.com"
cookbook 'apache2'
cookbook 'php'
cookbook 'nodejs'

Burada Berkshelf den bizim için apache2, php ve nodejs cookbooklarını ilk satırdaki adresteki web servis aracılığı indirmesini indirmesini istedik. Şuan sadece istedik, indir emrini vermedik. Hemen verelim! Komut satırından APP dizinine gelelim şu komutu çalıştıralım.

berks install

Komut çalıştırıldıktan sonra aşağıdakine benzer bir çıktı gelecektir.

Resolving cookbook dependencies...
Fetching cookbook index from https://supermarket.getchef.com...
Installing 7-zip (1.0.2)
Installing apache2 (3.1.0)
Installing apt (2.7.0)
Installing ark (0.9.0)
Installing build-essential (2.2.3)
Installing chef-sugar (3.1.0)
Installing chef_handler (1.1.9)
Installing homebrew (1.12.0)
Installing iis (4.1.1)
Installing mysql (6.0.22)
Installing nodejs (2.4.0)
Installing php (1.5.0)
Installing rbac (1.0.3)
Installing smf (2.2.7)
Installing windows (1.37.0)
Installing xml (1.2.13)
Installing yum (3.6.1)
Installing yum-epel (0.6.0)
Installing yum-mysql-community (0.1.17)

İşte! İstediğimiz cookbookları indirdik. Ama? Neden sadece bizim Berksfile içerisinde belirttiğimiz apache2, php ve nodejs kurulmadı? Yanıt çok basit. Yüklenen diğer cookbooklar bizim indirilmesini istediğimiz cookbookların bağımlılıkları da o yüzden.

Çok güzel! Peki bilgisayarımda hangi dizine indirildi bu cookbooklar? İşte burada!

cookbook directory

Eğer Home dizinine gittiğinizde .berkshelf klasörünü göremiyorsanız CTRL+H kombinasyonu ile gizli klasörleri gösterebilirsiniz.

Windows ortamında ise varsayılan olarak C:\Users\{USER}\.berkshelf\cookbooks yolunda bulunuyor.

Berksfile dosyamıza yeni bir satır ile birlikte yeni bir cookbook ekleyip yeniden berks install komutunu verdiğimizde eskiden indirmiş olduğumuz cookboklar indirilmeyecek, sadece sistemimizde bulunmayan cookbooklar için indirme işlemi gerçekleşecektir.

Vagrantfile dosyası üzerinde değişiklik yaparken Sublime Text editörünü kullanmanızı tavsiye ediyorum. Sublime Text üzerine CTRL+SHIFT+P kombinasyonu ile açılan yazı kutusuna "Ruby" yazarak, yazım reklendirmesi ataması yapabilirsiniz. Eğer Sublime kullanmayı tercih etmiyorsanız, Ruby dili için renklendirme yapabilen bir editör edinmeniz yeterlidir.

Vagrantfile

Berkshelf'in temel mantığını öğrendik. Gelin şimdi Vagrantfile dosyamızda uğraşalım ve Vagrant ile Berkshelf'i nasıl birlikte kullanacağımızı öğrenelim.

İçi boş olan Vagrantfile dosyamızı şu şekilde dolduralım.

Vagrant.configure(2) do |config|
  config.vm.box = 'hashicorp/precise32'
  config.vm.network :private_network, ip: "172.22.22.23"
  config.vm.provider :virtualbox do |vb|
      vb.gui = true
  end

  # Berkshelf
  config.berkshelf.enabled = true
  config.berkshelf.berksfile_path = "./Berksfile"
end

Şimdi bu içeriği satır satır açıklayalım.

Sunucumuza kurulacak olan temel kutunun Ubuntu işletim sistemine sahip hashicorp/precise32 olmasını söyledik.

config.vm.box = 'hashicorp/precise32'

Sunucumuzun hizmet vereceği yerel ip adresini belirttik.

config.vm.network :private_network, ip: "172.22.22.23"

Bu kısım uygulamamız ile çok fazla alakalı olmamakla birlikte vagrant up komutu verildiği anda VirtualBox arayüzünü açmayı sağlıyor. Birkaç faydası daha var ama şuan burada yazmayalım.

config.vm.provider :virtualbox do |vb|
	vb.gui = true
end

Son iki satırda berkshelf kullanılacağını onaylayıp, Berksfile dosyamızın nerede olduğunu vagrant'a söyledik.

config.vm.provider :virtualbox do |vb|
	config.berkshelf.enabled = true
	config.berkshelf.berksfile_path = "./Berksfile"
end

Buraya kadar herşey güzel. Hadi sunucumuzu ayağa kaldırmaya çalışalım! Vagrantfile oluşturduğumuz APP dizinine gelerek aşağıdaki komutu çalıştıralım.

vagrant up

O da ne?

There are errors in the configuration of this machine. Please fix
the following errors and try again:

Vagrant:
* Unknown configuration section 'berkshelf'.

Şeklinde bir hata aldık. Hatanın sebebi berkshelf yazılımını kurmamıza rağmen Berkshelf ile Vagrant'ın haberleşemeyişdi. Bu sorunu aşmak için bu iki arkadaşı haberleştirmemiz lazım.

Bunu yapabilmek için bir Vagrant plugini yüklememiz gerekiyor.

vagrant plugin install vagrant-berkshelf

Komut işlendikten sonra muhtemelen aşağıdaki gibi kurulumun başarılı olduğuna dair bir mesaj gelecektir.

Installing the 'vagrant-berkshelf' plugin. This can take a few minutes...
Installed the plugin 'vagrant-berkshelf (4.0.4)'!

Bu hatayı da çözdüğümüze göre komutumuzu tekrar çalıştırabiliriz.

vagrant up

Tüm bu işlemlerden sonra, yüksek ihtimalle hiçbir sorun yaşanmadan sunucunun ayağa kalkması gerekiyor.

Klasör Senkronizasyonu

Aslında bu tanımı burada yapmamam gerekiyordu. Ancak bundan sonraki başlıktaki işlemleri yapabilmemiz için senkronizasyon işlemini yapmış olmak Vagrant tarafından zorunlu tutuluyor. İlk kısımlarda bahsetmiştik ancak çok fazla teknik detay vermemiştik. Hatırlarsanız eğer, Dropbox örneğini vermiştik. İşte şimdi bu senkronizasyon hakkında daha detaylı bilgi edineceğiz.

Mantık çerçevesinde baktığımızda, eğer yerel bilgisayarmızdaki proje dizin ve dosyaları Vagrant aracılığı ile kurmuş olduğumuz sanal sunucumuza ulaşmazsa bu proje dosyalarını çalıştıramayız. Bir şekilde bu dosyaların anlık olarak sanal sunucumuza ulaşması gerekiyor. Bu işlem için Vagrantfile dosyamızda çok basit bir tanımlama yapacağız. Tek satırdan ibaret olan bu tanım şu şekilde.

config.vm.synced_folder "/home/{USER}/APP/public" , "/var/www/"

Bu satırı Vagrantfile dosyamıza ekleyeceğiz. Vagrantfile içerisinde berkshelf tanımını yaptığımız satırdan sonrasına bunu ekleyebilirsiniz. Vagrantfile dosyamızın son hali şöyle;

Vagrant.configure(2) do |config|
  config.vm.box = 'hashicorp/precise32'
  config.vm.network :private_network, ip: "172.22.22.23"

  config.vm.provider :virtualbox do |vb|
      vb.gui = true
  end

  # Berkshelf
  config.berkshelf.enabled = true
  config.berkshelf.berksfile_path = "./Berksfile"

  # Senkronizasyon
  config.vm.synced_folder "/home/{USER}/APP/public" , "/var/www/"
end

Tabi {USER} ifadesi ile belirtilen kısma bilgisayarınızdaki kendi kullanıcı adınızı yazacaksınız. Windows için ise c:/APP/public gibi bir ifade ile yolu belirtebilirsiniz.

Yapmış olduğumuz işlemin özeti şu; APP klasörü içerisindeki public klasörüne ne eklenirse, aynısını al sanal sucunudaki /var/www/ dizinine ekle. Vallahi billahi sadece bunu yaptık.

APP dizininde public adlı klasörümüz şuan yok.Unutmadan hemen oluşturalım.

NFS Kavramı

Senkronizasyon işleminde kullanabileceğimiz kullanışlı bir kavram. Teorik tanımını Wikipedi den aynen alıyorum.

Ağ Dosya Sistemi (İngilizce: Network File System, kısaca NFS), Sun Microsystems tarafından 1984 yılında geliştirilmiş, ağdaki bilgisayarların ortak bir dosya sistemine, yerel diskleri kadar kolay ulaşmasını sağlayan, RPC temelli dağıtık dosya sistemi yapısıdır.

Özetin özetini yapacak olursak, senkronizasyon işlemini NFS ile yaptığınız takdirde, klasörleriniz normal senkronizasyona göre daha hızlı eşitlenecek ve uzak dizin sanki kendi bilgisayarınızda bulunan bir disk gibi kullanılacak.

NFS denilen dosya sistemi genelde tek bir havuz diskteki veriyi kullanan ekibin, bu diskin dosya tipini NFS yaparak sanki o havuz disk oradaki verileri kullanan kullanıcının fiziksel diskiymiş gibi algılanıyor. Adamlar yapmış muhtar!

Vagrant geliştiricileride bu nimeti göz ardı etmeyip senkronizasyon işlemi için kullanılabilsin diye Vagrant için hizmet verebilir hale getirmişler.

NFS Kurulumu

Her zaman olduğu gibi, Linux çekirdekli işletim sistemleri için hiç sorun yok. Problemsiz olarak NFS kurulabiliyor.

Ubuntu için;

sudo apt-get install nfs-kernel-server

Ancak gel gelelim Windows her zamanki gıcıklığını yapıyor. Vagrant tarafından, Windows için NFS desteği verilmiyor. NFS zaten Windows üzerinde kullanılabilir bir dosya sistemi değil. Ancak şurada hazırlanmış bir çözüm var. Ben denedim, çalışıyor. Vagrant üzerine plugin şeklinde kurup, kullanabilirsiniz. Ancak Linux ortamında olduğu kadar performaslı olurmu, tartışılır.

Vagrantfile adlı dosyamızın bulunduğu APP adlı dizinde vagrant halt komutunu kullanarak sunucumuzu kapatalım. Hemen sonra vagrant up komutu ile tekrar başlatalım. Eğer NFS kurulum ve tanımlamanızda bir sorun yoksa vagrant up komutundan sonra komut satırında verilen loglar arasında şu kısım gözünüze çarpacaktır.

nfs

Yukarıda cookbook'ları bilgisayarımıza indirdik. İndirdik indirmesine de, indirdiğimiz bu cookbookları bir şekilde sanal sunucumuz içerisine otomatik olarak kurulmasını sağlamamız gerekiyor. Gel gelelim bu makaleyi burada noktalamamız gerekiyor. Türk dizileri gibi hep en heyecanlı yerde bölümü bitiriyorum ama idare edeceksiniz artık :)

Bir sonraki makalede kaldığımız yerden aynen devam!

Serinin Tüm Başlıkları