Packer ile Yazılım Altyapısı Kurulumunu Otomatikleştirme

Bir ya da birden fazla sanal makine kurulumunu ve kofigürasyonunu otomatikleştirme.

İlkay Aktaş
Devops Türkiye☁️ 🐧 🐳 ☸️
8 min readMar 21, 2020

--

Credits

Yazılım mimarilerinin Monolit’ten Mikroservis’lere, sunucuların da birkaç bilgisayarlı konfigürasyonlardan dağıtık, multi-region bulut teknolojisine geçmesiyle birlikte infrastructure yönetim konusunun önemi daha da artmaya başladı. Bundan birkaç yıl önce, daha bulut konusunun tartışılmadığı yıllarda, yazılımınızı oluşturup deploy etmek birkaç adımdan oluşuyordu. Monolit bir yazılım oluştur, güçlü bir sunucu bilgisayarı kirala ya da satın al, yazılımını kurup dış dünyaya aç. Yapılan işi bu kadar basite indirgemek belki doğru değil fakat bugün uğraşmamız gereken problemlerle karşılaştırdığımızda o kadar da kompleks bir iş değilmiş gibi durmakta.

Bugünlerde bir yazılım geliştirip son kullanıcıya ulaştırmak ise çok daha karmaşık bir hal aldı. Hazırladığınız yazılım onbinler, yüzbinler seviyesinde kullanıcıya hitap edebilmelidir. Farklı kıtalardan kullanıcılarınız olabilmektedir. Ani kullanıcı artışı ile karşılaşma ihtimalimiz vardır. Bu ve buna benzer durumları düşündüğümüzde işimizin artık eskisi kadar kolay olmadığını görebiliyoruz. İşe öncelikle yazılımın çalışacağı makine/bulut/ platform seçerek başlıyoruz. Bunları özellikle peşpeşe yazdım ki yazılımımızın ortamının aniden değişiklik gösterebileceğini ifade etmek istedim. On-premise bir deployment ortamımız varken ani bir karar ile Amazon Web Service’lerine geçiş yapmamız gerekebilir. Ya da AWS için ödediğimiz ücret yüksek bulunup DigitalOcean ile yola devam etme kararı alınabilir. Böyle durumları göz önüne aldığımızda ne yapacağız? Bare-metal sunucularda yazılım altyapısı hazırlamak için yapılan işlerin tamamını AWS ya da DigitalOcean için bir kere daha mı yapacağız? Ya da sunuculardaki işletim sisteminin imajını alıp AWS’de çalıştırmayı mı deneyeceğiz? AWS EC2 makineler AMI formatında makineler ile çalıştığını farkettiğimizde ne yapacağız? Toz ve gaz bulutu olduğumuz dönemlere gidip her şeye baştan mı başlayacağız? İşte bu ve buna benzer infrastructure problemlerin çözümü için Infrastructure as Code kavramı ortaya çıkmıştır.

Yazılım geliştirme ve mimari konusunu bu yazının dışında tutarsak, Infrastructure as Code da çok kapsamlı bir konu olduğundan, bunun küçük bir bölümü olan makine imajı oluşturma işleminin otomatikleştirmesi bu yazının konusu olacaktır.

Ben bu yazıda, Packer aracı kullanarak yazılım altyapısını oluşturabileceğimiz bir ya da birden fazla sanal makine kurulumunu nasıl otomatikleştirebileceğimizi anlatacağım. Bu konuyu anlatırken bir senaryo üzerinden gitmek daha anlaşılır olacağından aşağıdaki gibi bir kullanım senaryosu düşündüm.

Kullanım Senaryosu

Yazılımımızı deploy/test edeceğimiz infrastructure için bir/birkaç sanal makine oluşturmamız gerektiğini düşünelim. On-premise, yani şirket içi bir çözüm olarak planladığımız alt yapıyı oluştururken VirtualBox imajı makineler oluşturulması beklenmektedir fakat ihtiyaca göre VMware imajları da kullanılabilsin. Müşteri gereksinimlerine göre Vagrant Box seçeneği de masada bulunsun. Cloud çözümümüz de var dememiz için AWS EC2 ya da DigitalOcean makinelerine de desteğimiz olmalı. İşletim sistemi Ubuntu ya da Redhat olabilir. İhtiyaç halinde farklı yeteneklere sahip birden fazla sanal makine de oluşturulmalı.

Çözüm: Packer.io

Bu gereksinimlerle yola çıktığımızda VirtualBox’ta bir makine oluşturup daha sonra Ubuntu iso’sunu boot edip işletim sistemi kurabiliriz. Sonrasında işletim sisteminde yapmak istediğimiz ayarları ssh ile bağlanıp terminal üzerinden yapabiliriz. Tabi bunu yaparken bilgisayarın başında dakikalarca oturup gerekli tüm kurulum girdilerini yapmamız gerekiyor. İlerleyen zamanda Redhat’e geçiş gerektiğinde benzer işleri tekrar yapmak gerekecektir.

Bu senaryoyu şu şekilde genişlettiğimizi düşünelim: Birbirine benzeyen ama aynısı olamayan onlarca imaj oluşturmamız gerekti. Ne yapmamız gerekecek bu durumda? Saatlerce bilgisayar başında oturup kurulum yapmak gibi bir çözüm mümkün görünmüyor. İşte burada imdadımıza Packer aracı yetişiyor.

Nedir Packer?

Packer, Infrastructure as Code kavramının bir parçası olarak kod -diğer bir deyişle json dosyası- ile bir makine imajı üretmeye yarayan açık kaynak kodlu bir araçtır. Makine imajından kasıt, istenilen ayarları yapılmış, istenilen yazılımların yüklendiği işletim sistemlerinin bulunduğu statik birimlerdir. Bu çıktılar kullanılarak çalışabilir makineler elde edilebilir. Packer bir çok hedef platform için imaj üretebilmektedir. Bunlara örnek; EC2 için AMI’ler, VMWare için VMDK/VMX, VirtualBox için OVF/OVA, Vagrant Box ve daha birçok çeşit formatta çıktı üretilebiliyor. Sadece template dokümanında değişiklik yaparak kurulumunu otomatikleştirdiğimiz makinenin istediğimiz özelliğini değiştirip, istediğimiz platform/cloud’a uygun çıktılar ürettirebiliriz. Hatta High Available Kubernetes Cluster bile oluşturabiliriz. Oluşturabiliriz fakat doğru yöntemin bu olmadığını baştan söylemek istiyorum. Bu iş için özelleşmiş Ansible, Chef, Puppet gibi konfigürasyon araçları mevcut. Ben sadece yetenek olarak Packer ile nelerin mümkün olduğunu anlatmak için böyle bir örnek verdim.

Oluşturduğum Packer template’leri ile işleme başlamadan önce bazı kavramlardan bahsetmekte fayda var.

Template

Bir ya da birden fazla build işleminin tanımlandığı json dosyasıdır. Packer bu dosyayı okur ve içerdiği bilgilere göre imaj oluşturur.

Artifacts

Packer template dosyasının build işleminin çıktısı. Tercih edilen çıktı formatına göre bir ya da birden fazla dosyadır. Her build işlemi tek bir artifact oluşturur. VirtualBox çıktısı ova/ovf gibi dosyalar içerirken EC2 build işlemi her bir region için AMI ID kümesi içerir.

Builders

Bir platform için makine imajı oluşturmaya yarayan Paker bileşenidir. Packer Template dosyasında yer alır. Bir makinenin nasıl oluşturulacağına dair komutları içerir. Builder içerisinde işletim sistemi boot_command’ları verilip manuel kurulum sırasında yapılan klavye girişleri de otomatikleştirilir (sağ/sol/yukarı/aşağı tuşları, enter, tab vs). Build tipine göre cloud ayarları da builder içine eklenir.

Communicator

Packer ile bir makine oluşturulurken o makinede yapılacak işlemler için, (dosya kopyalama, script çalıştırma) makine ile kendi bilgisayarımız arasında iletişim kurabilmesini sağlayan araçtır. Ssh ve winrm bunlardan ikisidir. Winrm, Windows bir makine kurarken kullanılacak iletişim protokolü iken ssh unix tabanlı işletim sistemler için bir iletişim protokolüdür. Bu yazı kapsamında yapılan işlemler için ssh protokolü kullanılmıştır.

Provisioners

İşletim sistemi kurarak makine kurulumu tamamlanmış olur ama bu bomboş bir imajdır aslında. Bu imaj içinde işletim sistemi seviyesinde yapılmak istenen bir çok şey olabilir. Gereksiz dosyaların silinerek işletim sistemi boyutunun küçültülmesi, çeşitli kullanıcılar oluşturması, network ayarlarının yapması, işletim sistemi repository’lerinin güncellenmesi gibi. Tüm bu işlemlerin yapılabileceği Packer bileşeni provisioners’dir. Kurulumu yapılmış, çalışmakta olan makine, statik imaja dönüştürülmeden önce provisioners’de tanımlı işler yapılır, scriptler çalıştırılır. Dokümantasyondan bakarsanız bir çok provisioner olduğunu görürsünüz. Shell scripting, Chef, Puppet, Ansible, PowerShell bunlardan bazılarıdır. Detaylı bilgi için şuraya bakabilirsiniz.

Post-Processors

Provisioners’larda tanımlanan işler tamamlandıktan sonra oluşturulan statik imaja yapılmak istenen son işlemlerin tanımlandığı Packer bileşenidir. Örnek olarak Vagrant Box üretme, çıkan imajı sıkıştırma, Docker repository’e gönderme, AWS’ye yükleme gibi.

Aşağıda içi boş bir Packer template dosyasını görebilirsiniz.

Boş Bir Packer Template Dosyası

Packer Build ve Sonrası

Aşağıda anlatacağım işlemlere başlamadan önce bilgisayarınızda VirtualBox ve Packer CLI yüklü olması gerekmektedir. Kurulum için resmi sitesi kullanılabilir. Terminalde packer version komutu çalıştırıldığında eğer packer versiyonu görüyorsak doğru yoldayız demektir. Kodların tamamını Github bağlantısında bulabilirsiniz.

Buna benzer bir terminal çıktısı görmelisiniz

Projeyi bilgisayarınızda açtığınız zaten üç adet template göreceksiniz.

  • ubuntu-18.04-multi-machine.json
  • ubuntu-18.04-single-machine-box.json
  • ubuntu-18.04-single-machine-ova.json

İsimlerinden de anlaşılacağı üzere çok makineli bir kurulum, çıktısı vagrant box ve ova olan tek makineli iki template dosyasıdır. Bu scriptleri çalıştırmadan önce PACKER_CACHE_DIR environment variable eklemenizi tavsiye ederim. Bu, template dosyasını build ederken kurulacak olan işletim sistemi iso’sunun indirileceği yerdir. Ben bunu önemsiyorum çünkü farklı build işlemleri sırasında bir iso’yu indirmeden önce bu dizinde var mı diye kontrol edecektir. Varsa bunu kullanacaktır. Böylece zamandan tasarruf sağlamış oluruz.

PACKER_CACHE_DIR=/any-directory/packer_cache

Aşağıdaki komut ile var olan template’i build edebiliriz. Build işlemi yaptıktan sonra açılan VirtualBox ekranında herhangi bir işlem yapmamalıyız, yoksa otomatikleştirdiğimiz kurulumu bozmuş oluruz. Oturup izleyeceğiz :)

Çok makineli bir kurulum yapmak isterseniz ubuntu-18.04-multi-machine.json dosyasını parametre olarak vermelisiniz.

Aşağıda vagrant box çıktısı üreten tek makine template dosyasını örnek olması için ekledim. Satır sayısına göre içeriğin ne anlama geldiğini açıklamaya çalıştım.

Template ve İçeriği

2. Builder’ler liste şeklinde eklenebilir.

4. Ubuntu işletim sistemi kurulurken girilmesi gereken boot command’lar. Burada işletim sistemi ekranı açılıp ok tuşları ile ilgili menülere otomatik ilerleyip işletim sisteminin dil, klavye layout, locale gibi ayarların verildiği yerdir. Bu komutlar Chef/Bento projesinden hazır alınmıştır. Tekerleği yeniden keşfetmeyin. Bu repository’de bir çok işletim sistemi için packer template’ler bulunur.

5–7. İşletim sistemi kurulum ekranı açılınca iki defa escape bir defa enter tuşuna basılacağını gösterir. İlk escape aşağıda görünen ilk ekranı, ikinci escape ikinci ekranı geçmek içindir. Enter tuşu ise üçüncü ekranda çıkan uyarıda OK tuşuna basmak için gereklidir. Başka hangi komutlar var diye merak ederseniz şu bağlantıya bakabilirsiniz.

25. Preseed dosyasının verildiği satırdır. Bu dosyada Ubuntu kurulumunu otomatikleştirmek için gerekli olan birçok ayar yer almaktadır. Detaylı bilgi şuradadır. İşletim sistemi kurulumlarının otomatikleştirilebilmesi için bu dosyalar çok önemlidir. Redhat/Centos tabanlı işletim sistemleri için kickstart, Debain/Ubuntu için preseed dosyasıdır.

35. headless = true demek kurulum yapılırken VirtualBox ekranının açılması anlamına gelir.

36. Packer, build işlemi sırasında HTTP sunucusu oluşturur ve bu dizindeki dosyaları rasgele bir porttan kurulum yapılan işletim sistemine verir. Preseed ve kickstart dosyaları bu dizine koyulmalıdır.

37. Kurulacak iso’nun checksum değeridir.

39. Kurulacak iso’nun web adresidir.

40. Üretilen dosyanın nereye kopyalanacağını ifade eder. Benim imajım nerede derseniz işte bu dizinde.

42. Connector olarak ssh seçtik ve makineye ssh bağlantısı için gerekli bilgileri devamındaki satırlarda verdik.

46. Builder tipinin virtualbox-iso olacağını belirttik.

50. VirtualBox imaj ismi.

53. Provisioners listemiz.

55. execute_command’da çalıştırılacak komuta, burada tanımladığımız key=value ikilileri parametre olarak verilir.

61. Çalıştırılacak tüm scriptler sudo ile çalıştırılır. echo ile şifre pipe edilir.

64. ssh ayarları yapılır.

65. İşletim sistemi kullanıcısını sudoers’a ekler.

68. İşletim sistemi keyboard layout Türkçe’ye çevrilir.

70. Provisioner tipi script

73. Post-processors listesi

75. Vagrant Bot’ın kopyalanacağı dizin.

76. Tip olarak vagrant seçildi. VirtualBox imajından Vagrant Box oluşturulacağı anlamına gelir.

79. Template içinde kullanılacak çeşitli variable’lar yer alır. Kullanılacağı yerde {{var-name}} şeklinde yazılmalıdır.

Sonuç

Packer, makine imajı oluşturma işlemini otomatikleştiren açık kaynak kodlu bir araçtır. Yukarıda bahsettiğim konular hakkında daha detaylı bilgileri resmi web sayfasında bulabilirsiniz. Packer’ın yeteneklerini tam olarak öğrenmek için mutlaka dokümantasyonunu okumanız gerekecektir. Yeteneklerini öğrendikçe yapabilecekleriniz konusunda ufkunuz genişleyecektir. Tüm bunlara ek olarak Infrastructure as Code disiplinine yardımcı olması için HashiCorp Inc.’in web sayfasındaki araçlara göz atmanızı tavsiye ederim. Özellikle Terraform ve Vagrant‘ı okumalısınız’.

Referanslar

--

--

İlkay Aktaş
Devops Türkiye☁️ 🐧 🐳 ☸️

I am a software engineer who have several years experiences on Java, C++, Android & iOS Development.