İçeriğe geç

Chef Infra ile Sunucu Yapılandırma Otomasyonu Kurulumu

6 dk okuma

Yüzlerce sunucuyu elle yapılandırmak zamanla sürdürülemez hale gelir. Chef Infra bu sorunu istenen durum bildirimi üzerinden çözer: bir node nasıl görünmeliyse tarif edilir, Chef Infra Client her çalıştığında mevcut durumu bu tarifle karşılaştırır ve farkı kapatır. Bu yüzden ikinci, üçüncü, onuncu çalıştırma zarar vermez. İdempotentlik modelin merkezindedir.

Kabuk betikleriyle bunu yakalamak zor

Bir bash betiği iki kez çalıştığında ya patlar ya da hiçbir şey yapmaz; ikisinin arasını garanti etmek betiğin içinde elle kontrol etmek demektir. Chef tarafında bu kontrolü kaynak modeli üstlenir. package kaynağı paket kurulu mu diye bakar, kuruluysa dokunmaz. service kaynağı servisin durumunu sorgular, istenen duruma eşitse hiçbir aksiyon almaz.

Altyapı kod olarak ele alınır, her değişiklik sürüm kontrolünden geçer, sunucudaki sapma tekrar tekrar geri sarılır.

Üç parça: Workstation, Server, Client

Kuruluma geçmeden rolleri ayırmak gerekir, çünkü hepsi ayrı makinelere kurulur.

  • Chef Workstation: cookbook yazdığınız, knife komutlarını çalıştırdığınız geliştirme ortamı. Bilgisayarınıza ya da bir yönetim sunucusuna kurulur.
  • Chef Infra Server: cookbookları, node objelerini, rolleri ve environmentleri saklayan merkezi depo. Arkasında PostgreSQL kullanır, API HTTPS üzerinden çalışır. State tutar.
  • Chef Infra Client: yönetilen her sunucuda çalışan ajan. Serverdan kendi run-listini çeker, yakınsar. Servis olarak çalıştığında varsayılan 1800 saniyelik aralıkla tetiklenir.

Küçük ortamlarda server olmadan da ilerlenebilir; buna aşağıda döneceğim.

Workstation kurulumu

Resmî kurulum betiği dağıtımı tanır ve paketi kurar. Uzun süre bu betik omnitruck.chef.io adresinden dağıtıldı; güncel dokümanlar indirme adresini chefdownload-community.chef.io olarak güncelledi, eski adreslerdeki örnekleri görmek normaldir:

curl -L https://chefdownload-community.chef.io/install.sh | sudo bash -s -- -P chef-workstation
chef --version

Kurulumdan sonra chef ve knife komutları kullanılabilir olur. İlk adım olarak bir depo iskeleti üretmek yerindedir:

chef generate repo chef-repo

Server tarafı

Chef Infra Server kendi paketiyle kurulur, dağıtıma uygun paketi indirip kurun, ardından yapılandırmayı uygulayın. Paket adı dağıtımlarda chef-server-core olarak geçer. Kurulumdan sonra tek komut her şeyi ayağa kaldırır:

sudo chef-server-ctl reconfigure

Ardından bir yönetici kullanıcı ve bir organizasyon açılır. RSA anahtarları dosyalara yazılır, bu dosyaları kaybetmemek gerekir.

sudo chef-server-ctl user-create admin Ad Soyad admin@ornek.com GucluBirSifre -f admin.pem
sudo chef-server-ctl org-create rootops "RootOPS Org" --association_user admin -f rootops-validator.pem

knife ile el sıkışma

Workstation makinada chef-repo/.chef/config.rb dosyası knife tarafını tanımlar:

current_dir = File.dirname(__FILE__)
node_name "admin"
client_key "#{current_dir}/admin.pem"
chef_server_url "https://chef-server.example.com/organizations/rootops"
cookbook_path ["#{current_dir}/../cookbooks"]

Sertifika henüz güvenilir değilse önce çekip doğrulayın:

knife ssl fetch
knife ssl check
knife client list

İlk cookbook

chef generate cookbook nginx_kurulum

Oluşan dizin içinde recipes/default.rb dosyasına istenen durumu yazarsınız. Basit bir nginx tarifi şöyle görünür:

package "nginx" do
  action :install
end

service "nginx" do
  action [:enable, :start]
end

template "/etc/nginx/nginx.conf" do
  source "nginx.conf.erb"
  notifies :restart, "service[nginx]"
end

template kaynağı ERB şablonunu dosyaya döker, değişiklik olursa notifies ile servisi yeniden başlatır. Paket kuruluysa, servis çalışıyorsa, dosya aynıysa client hiçbir şey yapmaz. Cookbook hazır olunca servera gönderilir:

knife cookbook upload nginx_kurulum

Node tarafına geçiş: bootstrap

Yeni bir sunucuyu sisteme katmak knife bootstrap ile olur. Komut, hedef makineye Chef Infra Client kurar, kimlik bilgilerini doğrular ve node kaydını servera yazar:

knife bootstrap sunucu1.example.com --node-name web01 --connection-user root --sudo --run-list "recipe[nginx_kurulum]"

Dikkat: eski sürümlerde kullanıcı parametresi --ssh-user olarak geçer, yeni sürümlerde --connection-user biçimine evrilmiştir. Kullandığınız Workstation sürümünün bayrak isimlerini sürüm notlarından teyit edin.

Run-list sonradan da değiştirilebilir:

knife node run_list add web01 "recipe[nginx_kurulum]"
knife node show web01

Yakınsama nasıl işler

Client her çalıştığında önce Ohai devreye girer, işletim sistemi, bellek, ağ arayüzleri, hostname gibi otomatik attributeleri toplar. Sonra run-list taranır, kaynaklar derlenir ve iki aşamalı model çalışır: önce tüm kaynaklar toplanır, sonra sırayla yakınsanır. Bu yüzden tarif içinde sonraki satırın etkisine dayanamazsınız; bildirime dayalı davranış bundan gelir.

Attributeler katmanlıdır; tarifteki default seviyesi en altta, Ohai tarafından toplanan automatic seviyesi en üstundedir ve Ohai verisi ezilemez.

Server olmadan denemek

chef-client --local-mode -o "recipe[nginx_kurulum]"

Local mode bellekte çalışan küçük bir server (chef-zero) başlatır, cookbookları oradan okur. Eski chef-solo bu rolü oynardı, yerini local mode aldı. Tek makinede tarif denemek için yeterli.

Mutfağın test tarafı

Workstation ile birlikte Test Kitchen gelir. .kitchen.yml dosyasında sanal makine veya konteyner profili tanımlanır, sonra döngü hep aynıdır:

kitchen converge
kitchen verify
kitchen test

verify aşaması InSpec kontrolleriyle sistemin gerçekten istenen durumda olup olmadığını sınar. Paket kuruldu mu, servis dinliyor mu gibi soruları yanıt verir.

Sürüm kaymasına dikkat

Chef ekosistemi hızlı evrilir; bootstrap bayrakları değişti, solo emekliye ayrıldı, indirme adresleri taşındı, roller yerine Policyfile yaklaşımı gündeme geldi. Hazır cookbook için genel depo Chef Supermarket üzerinde durur, güncel komut sözdizimi için docs.chef.io esas kaynaktır. Kurulum adımlarını sürüm notlarıyla birlikte okuyup uygulamak, iki saatlik aramayı önler.

Bir kere kurgulandığında geri kalanı tarif yazmakla geçer. Sunucu sayısı arttıkça elle bakım maliyeti sabit kalır, yeni makine kurmak bootstrap komutuna döner. Alışkanlık kazandıktan sonra sunucuya elle giriş yapmak garip hissettirmeye başlar, bu iyi bir işarettir.