Berkshelf ile Paket Yönetimi #5
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 Cookbook
lar 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.
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ı.
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!
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.
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!