Takip et

Packer’ı Ubuntu 12.04 VPS Üzerine Kurulumu ve Kullanmaya Başlama Rehberi

Packer’ı Ubuntu 12.04 VPS Üzerine Kurulumu ve Kullanmaya Başlama Rehberi Giriş: Packer ve Neden Önemli? Günümüz modern altyapı yönetiminde

Packer’ı Ubuntu 12.04 VPS Üzerine Kurulumu ve Kullanmaya Başlama Rehberi

Giriş: Packer ve Neden Önemli?

Günümüz modern altyapı yönetiminde, sunucu imajlarının tutarlı, tekrarlanabilir ve otomatik bir şekilde oluşturulması kritik bir öneme sahiptir. İşte tam bu noktada HashiCorp tarafından geliştirilen açık kaynaklı bir araç olan Packer devreye girer. Packer, tek bir kaynak yapılandırma dosyası kullanarak çeşitli platformlar (AWS, Azure, Google Cloud, VMware, VirtualBox, Docker vb.) için aynı makine imajlarını (AMI’ler, ISO’lar, VMDK’lar, Docker imajları) oluşturmanıza olanak tanır. Bu, “değişmez altyapı” (immutable infrastructure) prensibini benimseyen organizasyonlar için vazgeçilmez bir araçtır.

Değişmez altyapı, bir sunucu dağıtıldıktan sonra asla değiştirilmemesi gerektiği fikrine dayanır. Eğer bir sunucuda bir değişiklik yapılması gerekiyorsa (örneğin, bir güvenlik yaması veya yeni bir yazılım kurulumu), mevcut sunucu güncellenmek yerine, yeni bir imajdan tamamen yeni bir sunucu dağıtılır ve eski sunucu sonlandırılır. Bu yaklaşım, yapılandırma kaymalarını (configuration drift) önler, dağıtımları daha güvenilir hale getirir ve felaket kurtarma senaryolarını basitleştirir. Packer, bu süreci otomatize ederek, her zaman aynı temelden başlayan, önceden yapılandırılmış ve test edilmiş imajlar oluşturmanıza yardımcı olur.

Bu makalede, o dönemde popüler bir VPS işletim sistemi olan Ubuntu 12.04 LTS (Precise Pangolin) üzerinde Packer’ı nasıl kuracağınızı ve temel düzeyde nasıl kullanmaya başlayacağınızı adım adım ele alacağız. Ubuntu 12.04, uzun süreli destek (LTS) sürümü olması ve birçok VPS sağlayıcısı tarafından yaygın olarak sunulması nedeniyle bu rehber için iyi bir başlangıç noktasıdır. Her ne kadar güncel bir işletim sistemi olmasa da, temel kurulum ve kullanım prensipleri modern Ubuntu sürümlerinde de benzer şekilde uygulanabilir. Amacımız, Packer’ın gücünü anlamanıza ve kendi altyapı otomasyon süreçlerinize entegre etmeye başlamanıza yardımcı olmaktır.

Ön Gereksinimler

Packer kurulumuna başlamadan önce aşağıdaki maddelerin hazır olduğundan emin olmalısınız:

* Ubuntu 12.04 VPS: Bu rehberde Ubuntu 12.04 kullanacağımız için, bu işletim sistemine sahip çalışan bir Sanal Özel Sunucuya (VPS) ihtiyacınız olacaktır. Sunucuya root erişimi veya sudo yetkisine sahip bir kullanıcı hesabınız olmalıdır.
* SSH Erişimi: VPS’inize SSH üzerinden bağlanabilmeniz gerekmektedir. Bunun için bir SSH istemcisi (Linux/macOS için terminal, Windows için PuTTY veya WSL) kullanabilirsiniz.
* Temel Linux Komut Bilgisi: apt-get, wget, unzip, mv gibi temel Linux komutlarına aşina olmanız gerekmektedir.
* İnternet Bağlantısı: Packer’ı indirmek ve gerekli bağımlılıkları kurmak için VPS’inizin internet bağlantısına sahip olması şarttır.
* Opsiyonel: Bir Bulut Sağlayıcı Hesabı: Packer ile bir bulut platformunda (AWS, DigitalOcean vb.) bir imaj oluşturmak istiyorsanız, ilgili bulut sağlayıcısında bir hesabınızın olması ve API anahtarlarınızın (credentials) hazır olması gerekecektir. Bu rehberde hem lokal VirtualBox örneği hem de AWS örneği sunulacaktır.

Adım 1: Sistemi Güncelleme

Herhangi bir yazılım kurulumuna başlamadan önce, sistem paket listelerini güncellemek ve mevcut paketleri en son sürümlerine yükseltmek iyi bir uygulamadır. Bu, potansiyel bağımlılık sorunlarını önlemeye yardımcı olur ve sisteminizin güvenliğini artırır.

VPS’inize SSH ile bağlandıktan sonra aşağıdaki komutları çalıştırın:

sudo apt-get update
sudo apt-get upgrade -y

* sudo apt-get update: Paket depolarındaki mevcut paket listelerini günceller.
* sudo apt-get upgrade -y: Sisteminizdeki tüm yüklü paketleri güncel sürümlerine yükseltir. -y bayrağı, tüm onay sorularına otomatik olarak “evet” yanıtı verir.

Bu işlem, internet bağlantınızın hızına ve güncellenecek paketlerin sayısına bağlı olarak birkaç dakika sürebilir.

Adım 2: Gerekli Bağımlılıkları Yükleme

Packer’ı indirmek ve kurmak için bazı temel araçlara ihtiyacımız olacak: wget (dosya indirmek için) ve unzip (indirilen arşivi açmak için). Bu araçlar genellikle Ubuntu sistemlerinde ön yüklü olarak gelir, ancak yine de mevcut olduklarından emin olmak ve eksikse kurmak faydalıdır.

sudo apt-get install -y wget unzip curl

* wget: Packer’ın sıkıştırılmış dosyasını HashiCorp web sitesinden indirmek için kullanılır.
* unzip: İndirilen ZIP arşivini açmak için gereklidir.
* curl: Bazen HTTP istekleri yapmak veya web içeriğini indirmek için kullanılabilir, genel bir bağımlılıktır.

Bu komut, belirtilen paketlerin kurulu olup olmadığını kontrol eder ve eksik olanları yükler.

Adım 3: Packer’ı İndirme

Packer’ı doğrudan HashiCorp’un resmi web sitesinden indireceğiz. Packer’ın Ubuntu 12.04 üzerinde sorunsuz çalışması için uyumlu bir sürüm seçmek önemlidir. Genellikle, en son kararlı sürüm sorunsuz çalışacaktır, ancak eski bir işletim sistemi kullandığımızı unutmamak gerekir.

Öncelikle, HashiCorp Packer indirme sayfasına (releases.hashicorp.com/packer/) giderek Linux 64-bit sürümü için en son stabil sürümün indirme bağlantısını bulmanız gerekmektedir. Bu rehber yazıldığı sırada varsayımsal olarak bir URL kullanacağız, ancak siz kendi zamanınızda güncel olanı kullanmalısınız.

Örnek bir indirme bağlantısı (bu bağlantı zamanla değişebilir, lütfen güncel olanı kontrol edin):

wget https://releases.hashicorp.com/packer/1.7.10/packer_1.7.10_linux_amd64.zip

Yukarıdaki komut, Packer’ın belirli bir sürümünü (bu örnekte 1.7.10) Linux AMD64 mimarisi için VPS’inize indirecektir. İndirme tamamlandıktan sonra, indirilen ZIP dosyasını açmanız gerekir:

unzip packer_1.7.10_linux_amd64.zip

Bu komut, packer adında çalıştırılabilir bir dosya oluşturacaktır.

Adım 4: Packer’ı PATH’e Taşıma ve Doğrulama

İndirdiğiniz ve açtığınız packer çalıştırılabilir dosyasını, sisteminizin PATH değişkeninde bulunan bir dizine taşımanız gerekir. Bu, packer komutunu herhangi bir dizinden doğrudan çalıştırabilmenizi sağlar. /usr/local/bin/ dizini, bu tür üçüncü taraf çalıştırılabilir dosyalar için yaygın olarak kullanılan bir yerdir.

sudo mv packer /usr/local/bin/

Şimdi, Packer’ın başarıyla kurulduğunu ve sistem PATH’inde erişilebilir olduğunu doğrulamak için packer version komutunu çalıştırabilirsiniz:

packer version

Eğer kurulum başarılı olduysa, terminalinizde yüklü Packer sürümünü görmelisiniz:

Packer v1.7.10

Bu çıktı, Packer’ın Ubuntu 12.04 VPS’inize başarıyla kurulduğunu gösterir. Artık Packer komutlarını kullanmaya hazırsınız.

Adım 5: Temel Packer Kavramları

Packer ile çalışmaya başlamadan önce, temel yapı taşlarını anlamak önemlidir. Packer, işini JSON veya HCL (HashiCorp Configuration Language) formatındaki şablon dosyaları aracılığıyla yapar. Bu şablonlar, makine imajının nasıl oluşturulacağını, hangi platformda oluşturulacağını ve içine nelerin kurulacağını tanımlar.

Bir Packer şablonu genellikle aşağıdaki ana bloklardan oluşur:

* Builders (Oluşturucular): Bu blok, makine imajının hangi platformda oluşturulacağını tanımlar. Her builder tipi, belirli bir platforma özgüdür ve o platformun API’si veya araçlarıyla etkileşime girer. Örnek builder’lar:
* amazon-ebs: AWS EC2 AMI’leri oluşturmak için.
* googlecompute: Google Cloud imajları oluşturmak için.
* azure-arm: Azure sanal makine imajları oluşturmak için.
* virtualbox-iso: VirtualBox VM’lerinden ISO tabanlı imajlar oluşturmak için.
* docker: Docker imajları oluşturmak için.
* Provisioners (Sağlayıcılar): Bir builder tarafından oluşturulan temel imajın içine yazılım kurmak, yapılandırma dosyalarını kopyalamak veya komut dosyalarını çalıştırmak için kullanılır. Provisioner’lar, imajın nihai durumunu tanımlar. Örnek provisioner’lar:
* shell: Kabuk komut dosyalarını çalıştırmak için.
* ansible: Ansible playbook’larını çalıştırmak için.
* chef: Chef tariflerini uygulamak için.
* file: Yerel dosyaları imajın içine kopyalamak için.
* Post-Processors (Son İşleyiciler): İmaj oluşturulduktan sonra ek işlemler yapmak için kullanılır. Örneğin, oluşturulan bir VMDK dosyasını sıkıştırmak, bir Vagrant kutusu oluşturmak veya oluşturulan imaj hakkında bir bildirim göndermek için kullanılabilir. Örnek post-processor’lar:
* manifest: Oluşturulan kaynakların bir JSON manifest dosyasını oluşturur.
* vagrant: Bir VirtualBox imajından Vagrant kutusu oluşturur.
* compress: İmaj dosyasını sıkıştırır.
* Variables (Değişkenler): Şablonunuzu daha esnek ve yeniden kullanılabilir hale getirmek için kullanılır. Örneğin, bölge adları, AMI ID’leri veya kullanıcı adları gibi değerleri değişken olarak tanımlayabilirsiniz.

Adım 6: İlk Packer Şablonunuzu Oluşturma

Şimdi, Packer’ın nasıl çalıştığını göstermek için iki farklı senaryo için şablonlar oluşturalım: biri lokal VirtualBox ortamında basit bir VM imajı, diğeri ise AWS EC2 üzerinde bir AMI.

Senaryo 1: Basit bir Shell Provisioner ile VirtualBox VM Oluşturma (Lokal Test İçin)

Bu senaryo, Packer’ı yerel makinenizde (veya bir VPS üzerinde VirtualBox kurulu ise) test etmek için idealdir. Bir VirtualBox sanal makinesi oluşturacak ve içine basit bir komut çalıştıracağız.

Not: Ubuntu 12.04 VPS’inizde VirtualBox kurulu olmayabilir. Bu örnek, genellikle yerel geliştirme ortamınızda veya VirtualBox kurulu bir sunucuda denenebilir. Ancak Packer’ın şablon yapısını anlamak için harika bir başlangıç noktasıdır.

Öncelikle ubuntu-vbox.json adında bir dosya oluşturalım:

{
  "variables": {
    "iso_url": "http://releases.ubuntu.com/16.04/ubuntu-16.04.7-server-amd64.iso",
    "iso_checksum": "sha256:d87870a256a735623f954005b76c8c9a3b5a1b3261763134304892c578051a37",
    "vm_name": "packer-ubuntu-vbox-test"
  },
  "builders": [
    {
      "type": "virtualbox-iso",
      "iso_url": "{{user iso_url}}",
      "iso_checksum": "{{user iso_checksum}}",
      "guest_os_type": "Ubuntu_64",
      "disk_size": "20480",
      "memory": 1024,
      "cpus": 1,
      "headless": true,
      "ssh_username": "packer",
      "ssh_password": "packer",
      "ssh_wait_timeout": "20m",
      "boot_command": [
        "",
        "",
        "/install/vmlinuz noapic preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg ",
        "debian-installer=en_US auto locale=en_US kbd-chooser/method=us ",
        "hostname={{user vm_name}} ",
        "fb=false debconf/frontend=noninteractive ",
        "keyboard-configuration/modelcode=pc105 keyboard-configuration/layout=us keyboard-configuration/variant=us console-setup/ask_detect=false ",
        "initrd=/install/initrd.gz -- "
      ],
      "http_directory": "http"
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "sudo apt-get update",
        "sudo apt-get install -y nginx",
        "echo 'Merhaba Packer! Bu bir VirtualBox VM.' | sudo tee /var/www/html/index.nginx-debian.html",
        "sudo systemctl enable nginx",
        "sudo systemctl start nginx"
      ]
    }
  ],
  "post-processors": [
    {
      "type": "manifest",
      "output": "manifest-vbox.json",
      "pretty": true
    }
  ]
}

Açıklamalar:

* variables: ISO URL’si, checksum ve VM adı gibi değerleri tanımlarız. Bu, şablonu daha esnek hale getirir.
* builders: virtualbox-iso tipinde bir builder kullanırız. Bu, bir ISO dosyasından yeni bir VirtualBox VM oluşturur.
* iso_url ve iso_checksum: Ubuntu 16.04 sunucu ISO’sunun indirme URL’si ve SHA256 kontrol toplamı. (Ubuntu 12.04 yerine 16.04 kullanıyorum çünkü 12.04’ün resmi ISO’su bulmak ve preseed ile otomatik kurulum yapmak daha zor olabilir, ancak prensip aynıdır.)
* guest_os_type: Sanal makinenin işletim sistemi tipi.
* disk_size, memory, cpus: Sanal makinenin donanım özellikleri.
* headless: VM’nin arka planda (GUI’siz) çalışmasını sağlar.
* ssh_username, ssh_password: Packer’ın SSH üzerinden VM’ye bağlanmak için kullanacağı kimlik bilgileri.
* boot_command: Otomatik kurulum için gerekli komutlar. Bu, Ubuntu’nun “preseed” özelliğini kullanarak kurulumu otomatikleştirir.
* http_directory: Preseed dosyasının bulunacağı dizin. Bu dizinde preseed.cfg adında bir dosya oluşturmanız gerekecektir.
* provisioners: shell tipinde bir provisioner kullanırız.
* inline: Doğrudan çalıştırılacak kabuk komutlarını içerir. Bu örnekte, apt-get update yapar, nginx web sunucusunu kurar ve varsayılan HTML sayfasını değiştiririz.
* post-processors: manifest post-processor’ı, oluşturulan imaj hakkında bilgileri içeren bir JSON dosyası oluşturur.

Bu şablonu çalıştırabilmek için, http adında bir dizin oluşturmanız ve içine basit bir preseed.cfg dosyası koymanız gerekir. Örnek bir preseed.cfg dosyası (detaylı bir preseed dosyası oldukça uzun olabilir, bu sadece minimal bir örnek):

# D-I config version 2.0
d-i debian-installer/locale string en_US
d-i keyboard-configuration/xkb-keymap select us
d-i netcfg/get_hostname string {{user vm_name}}
d-i netcfg/get_domain string unassigned-domain
d-i hw-detect/load_media boolean false
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Istanbul
d-i clock-setup/ntp boolean true
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string lvm
d-i partman-lvm/confirm boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/confirm_write_new_label boolean true
d-i partman/confirm boolean true
d-i passwd/user-fullname string Packer User
d-i passwd/username string packer
d-i passwd/user-password password packer
d-i passwd/user-password-again password packer
d-i user-setup/allow-password-weak boolean true
d-i user-setup/encrypt-home boolean false
d-i base-installer/install-recommends boolean false
d-i apt-setup/restricted boolean true
d-i apt-setup/universe boolean true
d-i apt-setup/backports boolean true
d-i apt-setup/services-select multiselect security, updates
d-i pkgsel/language-pack-patterns string
d-i pkgsel/install-pattern string openssh-server build-essential
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i finish-install/reboot_into_live boolean false
d-i cdrom-detect/eject boolean true

Şimdi şablonu çalıştıralım:

packer build ubuntu-vbox.json

Bu komut, VirtualBox’ı kullanarak bir VM oluşturacak, Ubuntu’yu otomatik olarak kuracak, Nginx’i yükleyecek ve sonunda bir .ova veya .vmdk dosyası olarak dışa aktaracaktır. Bu işlem oldukça uzun sürebilir.

Senaryo 2: Cloud Provider Üzerinde İlk AMI Oluşturma (Örnek: AWS EC2)

Bu senaryo, Packer’ın bir bulut ortamında nasıl kullanıldığını gösterir. AWS EC2 üzerinde bir Amazon Machine Image (AMI) oluşturacağız.

AWS ile çalışmak için, AWS kimlik bilgilerinizi (Access Key ID ve Secret Access Key) ayarlamanız gerekmektedir. Bunu ortam değişkenleri olarak veya ~/.aws/credentials dosyasına yazarak yapabilirsiniz.

export AWS_ACCESS_KEY_ID="YOUR_AWS_ACCESS_KEY_ID"
export AWS_SECRET_ACCESS_KEY="YOUR_AWS_SECRET_ACCESS_KEY"

Şimdi aws-ami.json adında bir dosya oluşturalım:

{
  "variables": {
    "aws_region": "eu-west-1",
    "source_ami": "ami-0abcdef1234567890", // Örnek AMI ID, lütfen kendi bölgenizdeki güncel bir Ubuntu 18.04 LTS AMI ID'si ile değiştirin
    "instance_type": "t2.micro",
    "ssh_username": "ubuntu",
    "ami_name_prefix": "packer-ubuntu-webserver",
    "tag_owner": "devops-team"
  },
  "builders": [
    {
      "type": "amazon-ebs",
      "region": "{{user aws_region}}",
      "source_ami": "{{user source_ami}}",
      "instance_type": "{{user instance_type}}",
      "ssh_username": "{{user ssh_username}}",
      "ami_name": "{{user ami_name_prefix}}-{{timestamp}}",
      "tags": {
        "Owner": "{{user tag_owner}}",
        "Purpose": "WebServer",
        "CreatedBy": "Packer"
      },
      "run_tags": {
        "Name": "{{user ami_name_prefix}}-build-instance"
      },
      "force_deregister": true,
      "force_delete_snapshots": true
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": [
        "echo 'Updating system...'",
        "sudo apt-get update -y",
        "sudo apt-get upgrade -y",
        "echo 'Installing Nginx...'",
        "sudo apt-get install -y nginx",
        "echo 'Setting up Nginx default page...'",
        "echo '' | sudo tee /var/www/html/index.nginx-debian.html",
        "echo 'Enabling Nginx service...'",
        "sudo systemctl enable nginx",
        "sudo systemctl start nginx",
        "echo 'Cleaning up apt cache...'",
        "sudo apt-get clean",
        "sudo rm -rf /var/lib/apt/lists/*"
      ]
    }
  ],
  "post-processors": [
    {
      "type": "manifest",
      "output": "manifest-aws.json",
      "pretty": true
    }
  ]
}

Açıklamalar:

* variables: AWS bölgesi, kaynak AMI ID’si, instance tipi, SSH kullanıcı adı ve AMI adı için ön ek gibi değerleri tanımlarız.
* ÖNEMLİ: source_ami değerini kendi AWS bölgenizdeki güncel bir Ubuntu AMI ID’si ile değiştirmelisiniz. Örneğin, eu-west-1 bölgesinde Ubuntu 18.04 LTS için ami-0abcdef1234567890 yerine ami-07d2f9d6c753b0e3e gibi bir değer kullanabilirsiniz. Güncel AMI ID’lerini AWS konsolundan veya AWS CLI ile bulabilirsiniz.
* builders: amazon-ebs tipinde bir builder kullanırız. Bu, bir EBS destekli AMI oluşturur.
* region: AMI’nin oluşturulacağı AWS bölgesi.
* source_ami: Packer’ın üzerine yazılım kurmak için kullanacağı temel AMI.
* instance_type: Packer’ın geçici olarak imajı oluşturmak için başlatacağı EC2 instance tipi.
* ssh_username: Packer’ın geçici instance’a SSH ile bağlanmak için kullanacağı kullanıcı adı (Ubuntu AMI’lerinde genellikle ubuntu‘dur).
* ami_name: Oluşturulacak AMI’nin adı. {{timestamp}} değişkeni, her çalıştırmada benzersiz bir ad oluşturmak için kullanılır.
* tags: Oluşturulan AMI’ye eklenecek AWS etiketleri.
* run_tags: Packer’ın geçici olarak başlattığı EC2 instance’ına eklenecek etiketler.
* force_deregister ve force_delete_snapshots: Eski AMI’leri ve anlık görüntüleri temizlemeyi sağlar.
* provisioners: shell tipinde bir provisioner kullanırız. AWS instance’ına bağlandıktan sonra çalıştırılacak komutları içerir. Bu örnekte, sistemi günceller, Nginx’i kurar, varsayılan web sayfasını değiştirir ve apt cache’ini temizleriz.
* post-processors: Yine manifest post-processor’ı, oluşturulan AMI hakkında bilgileri içeren bir JSON dosyası oluşturur.

Şimdi şablonu çalıştıralım:

packer build aws-ami.json

Bu komut, AWS’de geçici bir EC2 instance’ı başlatacak, provisioner komutlarını çalıştıracak, ardından bu instance’tan bir AMI oluşturacak ve son olarak geçici instance’ı sonlandıracaktır. İşlem tamamlandığında, AWS konsolunuzda yeni oluşturulan AMI’yi görebilirsiniz.

Packer Şablonlarının Detaylandırılması

Şimdiye kadar temel bir şablon oluşturduk. Packer’ın gücünü tam olarak kullanmak için şablonlarınızı daha da detaylandırabilirsiniz.

Değişken Kullanımı

Şablonlarınızdaki tekrar eden değerleri veya hassas bilgileri değişkenler aracılığıyla yönetmek, şablonlarınızı daha esnek, okunabilir ve güvenli hale getirir.

variables bloğunda tanımladığınız değişkenleri, şablon içinde {{user variable_name}} sözdizimi ile kullanırsınız. Değişkenlere değer atamanın birkaç yolu vardır:

1. Şablon içinde varsayılan değerler: variables bloğunda default anahtarı ile.
2. Komut satırından: packer build -var 'key=value' template.json
3. Değişken dosyalarından: packer build -var-file=vars.json template.json. vars.json dosyası { "key": "value" } formatında olmalıdır.
4. Ortam değişkenleri: PACKER_VAR_key=value packer build template.json

Örneğin, aws-ami.json dosyasındaki aws_region değişkenini komut satırından geçirmek isteyebilirsiniz:

packer build -var 'aws_region=us-east-1' aws-ami.json

Bu, şablonunuzu farklı AWS bölgelerinde yeniden kullanmanızı sağlar.

Birden Fazla Provisioner ve Harici Komut Dosyaları

Yukarıdaki örneklerde inline komutlar kullandık. Ancak daha karmaşık kurulumlar için komut dosyalarını harici dosyalarda tutmak ve script anahtarını kullanarak bunları çağırmak daha iyi bir yaklaşımdır.

Örneğin, Nginx kurulum komutlarını scripts/install_nginx.sh adında bir dosyaya taşıyalım:

scripts/install_nginx.sh:

#!/bin/bash
set -e # Herhangi bir komut başarısız olursa betiği durdur

echo "Updating system..."
sudo apt-get update -y
sudo apt-get upgrade -y

echo "Installing Nginx..."
sudo apt-get install -y nginx

echo "Setting up Nginx default page..."
echo '' | sudo tee /var/www/html/index.nginx-debian.html

echo "Enabling Nginx service..."
sudo systemctl enable nginx
sudo systemctl start nginx

echo "Cleaning up apt cache..."
sudo apt-get clean
sudo rm -rf /var/lib/apt/lists/*

Şimdi aws-ami.json dosyasındaki provisioner bloğunu güncelleyebiliriz:

"provisioners": [
    {
      "type": "shell",
      "script": "scripts/install_nginx.sh"
    }
  ],

Ayrıca, file provisioner’ı kullanarak yerel makinenizdeki dosyaları oluşturulan imajın içine kopyalayabilirsiniz. Örneğin, özel bir yapılandırma dosyasını kopyalamak için:

"provisioners": [
    {
      "type": "file",
      "source": "configs/nginx.conf",
      "destination": "/tmp/nginx.conf"
    },
    {
      "type": "shell",
      "inline": [
        "sudo mv /tmp/nginx.conf /etc/nginx/nginx.conf",
        "sudo systemctl restart nginx"
      ]
    }
  ],

Bu, şablonlarınızı daha modüler ve yönetilebilir hale getirir.

Post-Processors ile Ek İşlemler

manifest post-processor’ı, oluşturulan imaj hakkında meta verileri (ID, adı, bölge vb.) içeren bir JSON dosyası çıktısı verir. Bu, CI/CD pipeline’larında veya otomasyon betiklerinde oluşturulan imajın ID’sini programatik olarak almak için çok kullanışlıdır.

Diğer popüler post-processor’lar arasında vagrant (VirtualBox imajından Vagrant kutusu oluşturmak için) veya compress (VM imajlarını sıkıştırmak için) bulunur.

İleri Seviye Kullanım İpuçları ve En İyi Uygulamalar

Packer ile çalışırken verimliliği ve güvenilirliği artırmak için bazı en iyi uygulamaları takip etmek önemlidir:

* Versiyon Kontrolü: Tüm Packer şablonlarınızı (JSON/HCL dosyaları, provisioner betikleri, preseed dosyaları vb.) bir versiyon kontrol sisteminde (örneğin Git) saklayın. Bu, değişiklikleri takip etmenizi, geri almanızı ve işbirliği yapmanızı sağlar.
* Güvenlik: Hassas bilgileri (API anahtarları, parolalar) doğrudan şablon dosyalarına yazmaktan kaçının. Bunun yerine, ortam değişkenlerini, packer build komutunun -var veya -var-file seçeneklerini, ya da Vault gibi bir gizli yönetim çözümünü kullanın.
* İdempotent Provisioning: Provisioner betiklerinizin “idempotent” olduğundan emin olun. Yani, betiği birden fazla kez çalıştırdığınızda her zaman aynı sonucu vermeli ve mevcut kurulumu bozmamalıdır. Örneğin, apt-get install -y komutu zaten kurulu olan bir paketi tekrar kurmaya çalışmaz. Ansible veya Chef gibi yapılandırma yönetimi araçları bu konuda doğal olarak daha iyidir.
* Küçük ve Odaklı İmajlar: Oluşturduğunuz imajları olabildiğince küçük ve minimalist tutun. Yalnızca ihtiyacınız olan yazılımları ve hizmetleri kurun. Bu, dağıtım sürelerini kısaltır, güvenlik yüzeyini azaltır ve kaynak tüketimini düşürür.
* Test Etme: Oluşturduğunuz imajları dağıtmadan önce test edin. Serverspec veya InSpec gibi araçlar, imajın beklendiği gibi yapılandırıldığını doğrulamak için kullanılabilir. Packer, test aşamasını da otomatize etmek için çeşitli entegrasyonlar sunar.
* Sürekli Entegrasyon (CI): Packer’ı bir CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) pipeline’ına entegre edin. Her kod değişikliğinde yeni imajların otomatik olarak oluşturulmasını ve test edilmesini sağlayın. Bu, geliştirme döngüsünü hızlandırır ve hataları erken yakalamanıza yardımcı olur.
* Temizlik: Packer, geçici olarak başlattığı kaynakları (EC2 instance’ları, VirtualBox VM’leri) genellikle otomatik olarak temizler. Ancak bazen bir hata durumunda bu kaynaklar kalabilir. Packer’ın force_deregister ve force_delete_snapshots gibi seçeneklerini kullanarak temizliği otomatikleştirebilirsiniz. Ayrıca, düzenli olarak bulut sağlayıcınızın konsolunu kontrol ederek gereksiz kaynakların olmadığından emin olun.

Sorun Giderme

Packer ile çalışırken sorunlarla karşılaşabilirsiniz. İşte bazı yaygın sorunlar ve çözümleri:

* SSH Bağlantı Sorunları:
* Güvenlik Grupları/Firewall: Bulut sağlayıcınızda (AWS Security Groups, Azure Network Security Groups) SSH (port 22) trafiğine izin verdiğinizden emin olun.
* Kullanıcı Adı/Parola: ssh_username ve ssh_password (veya SSH anahtarı) bilgilerinin doğru olduğundan emin olun.
* ssh_wait_timeout: Packer’ın VM’nin başlatılmasını ve SSH’in erişilebilir olmasını beklemesi için yeterli süre tanıyın. Özellikle yavaş sistemlerde bu süreyi artırmak gerekebilir.
* Provisioner Hataları:
* Komut Hataları: Provisioner betiklerinizdeki veya inline komutlarınızdaki sözdizimi hatalarını veya eksik bağımlılıkları kontrol edin. set -e komutunu betiklerinizin başına eklemek, hatanın nerede meydana geldiğini anlamanıza yardımcı olabilir.
* sudo Kullanımı: Çoğu kurulum komutu sudo yetkisi gerektirir. Komutlarınızın sudo ile çalıştığından emin olun.
* Builder Hataları:
* Kaynak AMI/ISO Bulunamadı: source_ami veya iso_url değerlerinin doğru ve erişilebilir olduğundan emin olun.
* Kimlik Bilgileri: Bulut sağlayıcınız için API kimlik bilgilerinizin doğru ve yeterli yetkilere sahip olduğundan emin olun.
* Hata Ayıklama (Debugging):
* packer build -debug template.json: Bu komut, Packer’ın her adımı duraklatmasına ve manuel olarak devam etmenize olanak tanır. Bu, SSH bağlantılarını veya provisioner adımlarını manuel olarak kontrol etmek için çok faydalıdır.
* packer build -on-error=cleanup/abort/run-provisioner: Hata durumunda Packer’ın ne yapacağını belirler. cleanup varsayılandır, abort hatada durur ve kaynakları bırakır (sorunu incelemek için), run-provisioner hata olsa bile provisioner’ları çalıştırmaya devam eder.
* Packer’ın terminal çıktısını dikkatlice okuyun. Genellikle hatanın nedenini veya nerede meydana geldiğini gösteren ipuçları içerir.

Sonuç

Bu makalede, Packer’ı Ubuntu 12.04 VPS üzerine nasıl kuracağınızı ve temel düzeyde nasıl kullanmaya başlayacağınızı detaylı bir şekilde ele aldık. Packer’ın, değişmez altyapı prensiplerini benimseyerek sunucu imajı oluşturma süreçlerinizi otomatikleştirmedeki ve tutarlılığı sağlamadaki kritik rolünü vurguladık.

Kurulum adımlarından sonra, VirtualBox ve AWS EC2 üzerinde iki farklı senaryo için basit Packer şablonları oluşturduk. Bu şablonlar, builders, provisioners ve post-processors gibi temel Packer kavramlarını pratik örneklerle anlamanıza yardımcı oldu. Ayrıca, değişken kullanımı, harici komut dosyaları ve ileri seviye kullanım ipuçları ile şablonlarınızı nasıl daha güçlü ve yönetilebilir hale getirebileceğinizi gösterdik.

Packer, DevOps ve altyapı otomasyonu dünyasında paha biçilmez bir araçtır. Temel kurulum ve kullanım adımlarını öğrendikten sonra, Packer’ı kendi özel ihtiyaçlarınıza göre uyarlayabilir, daha karmaşık imajlar oluşturabilir ve farklı bulut sağlayıcıları veya sanallaştırma platformları ile entegre edebilirsiniz. Unutmayın, iyi bir altyapı otomasyonu, hızlı, güvenilir ve ölçeklenebilir sistemlerin temelini oluşturur. Packer ile bu temeli sağlam bir şekilde atabilirsiniz. Gelecekte, oluşturduğunuz bu temel imajları Terraform, Ansible veya diğer araçlarla birleştirerek uçtan uca altyapı dağıtım süreçlerinizi tamamen otomatikleştirebilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version