Son zamanlarda IAC adından oldukça söz ettirmeye başladı. Bununla birlikte hayatımıza bir çok opensource ürün de dahil oldu. Terraform’da bunlardan birisi. Uzun zamandır vakit ayırıp birşeyler yapmak istiyordum. Sonunda o vakti bulabildim J
Azure altyapısı üzerinde IAC süreçlerini tasarlarken genelde Azure Resource Manager(ARM) template’lerinden faydalanıyordum, hala da faydalanmaya devam ediyorum. Ancak terraform’u kullanmaya başladıktan sonra aslında bu süreçleri daha basit ve daha etkili şekilde yapabileceğimi farkettim.
Bu sebeple Terraform ile alakalı bir makale serisine başlamak istedim. Umarım faydalı bir makale olur.
Öncelikle şu soruyu sorarak makaleye başlayabiliriz. Terraform nedir?
Terraform altyapıları güvenli şekilde oluşturabilmemize, değişiklik yapabilmemize ve yaptığımız bu işlerde vesiyonlama yapabilmemize olanak sağlayan bir araçtır. Terraform’u kullanarak bir çok platform üzerinde yapılandırma ve konfigürasyon yapabilirsiniz.
Terraforum ile oluşturduğunuz gerek tek bir uygulamaya gerekse koca bir datacenter’a ait tüm yapılandırma ve konfigürasyon bilgisini kolaylıkla oluşturabilirsiniz.
Terraform kullanarak yapılan konfigürasyonları desired state olarak tanımlayıp değişiklik olduğunda hangi kaynakta ne değişikliği olduğunu belirleyip tekrardan desired state’e dönüş yapabilirsiniz.
Terraform’un kullanıldığı senaryoları incelemek için aşağıdaki linkten faydalanabilirsiniz.
https://www.terraform.io/intro/use-cases.html
Terraform dendiğinde akla gelen 4 adet önemli özellik vardır. Bunlar;
- IAC : Altyapı konfigürasyon syntax’ı ile tanımlanır. Böylece datacenter’ın tamamı terraform template’i olarak tanımlanıp versiyonlanabilir.
- Execution Plans: Terraform planlama aşamasına sahiptir. Apply komutu çalıştırılıp resource’lar deploy edilmeden önce execution plan görüntülenebilir. Böylece Terraform altyapıyı oluşturmadan önce eğer varsa sıkıntılı durumlar saptanmış olur.
- Resource Graph: Bu özellik sayesinde terraform deploy ettiği altyapıdaki resource’ların bir birleri ile olan bağlantılarını gösteren bir şema oluşturur. Böylece deployment sonrasında bu graph kullanılarak belli öngörüler edinilebilir.
- Change Automation: Minimum insan etkisi ile komplex konfigürasyonlar terraform kullanılarak kolaylıkla deploy edilebilir ve bu süreçler otomatize edilebilir. Böylelikle insan hatalarından kaynaklanan yanlış konfigürasyon riski de ortadan kaldırılmış olur.
Bu özet bilgilerin ardından adım adım terraform’u install edip basit anlamda konfigürasyon deploy etmeye başlayalım.
Terreform’u bir den çok platform üzerine indirip kullanabilirsiniz. Ben Windows ortamına indirip PowerShell ile kullanacağım. Zaten download etmek istediğinizde size bir çok seçenek sunacaktır. Download etmek için aşağıdaki linki kullanabilirsiniz.
https://www.terraform.io/downloads.html
Download işleminin ardından terrafom.exe’yi zipli dosyadan çıkardıktan sonra komut satırı ile exe’nin bulunduğu dizine gelip terraform’u kullanmaya başlayabilirsiniz. Yada dizine bağlı kalmak istemiyorsanız, terraform.exe’nin bulunduğu dizini ortam değişkenlerini eklediğiniz bölümde path olarak ekleyebilirsiniz.
Resim-1
Ardından PowerShell ile terraform.exe’yi kolaylıkla kullanabilirsiniz.
Ben Terraform’a ait konfigürasyon dosyalarını düzenlemek için VSCode kullanıyorum. Terraform’a ait eklentileri yüklediğimde kodu renklendirip otomatik olarak tamamlama özelliklerini de etkinleştirebiliyorum. Yine aynı şekilde aşağıdaki gibi terminal bölümünü kullanarak terraform komutlarını kolaylıkla çalıştırabiliyorum.
Resim-2
Şimdi basit olarak Terraform ile Azure üzerinde bir virtual network oluşturup şu ana kadar bahsettiklerimizi netleştirelim.
Öncelikle bu işlemleri yaparken oluşturacağımız dosyalardan ve kullanacağımız yapılardan biraz bahsetmek istiyorum. Terraform altyapıyı ilgilendiren konfigürasyonları bir text dosyasında saklar. Bu text dosyası .tf uzantılı olup Terraform Configurations olarak isimlendirilir.
Terraform configurations isimli dosya iki tipte olabilir. Bunlardan birisi demin bahsettiğim .tf uzantılı daha okunabilir Terraform formatıdır. Diğeri ise .tf.json uzantılı daha çok makinelerin anlayacağı ama yöneticilerin de belli durumlarda kullanabileceği JSON formatıdır.
Ben daha okunabilir olduğu için .tf uzantılı formatı tercih ediyorum.
Terraform konfigürasyonu deploy edilmek istendiğinde, tanımlanan tüm resource’lar alfabetik sıraya göre deploy edilirler. Resource’ların konfigürsyon dosyanındaki tanımlama sıraları önemli değildir.
Şimdi aşağıdaki gibi indirdiğim terraform.exe isimli aracı C:\TF dizinine kopyalayalım.
Resim-3
Azure üzerinde işlem yapacağım için bu dizin altında ayrı bir klasör oluşturup ilgili konfigürasyon dosyalarımı bu dizine kopyaladım.
Resim-4
Bu iki dosyadan .tf uzantılı olan konfigürasyon’u içeren terraform dosyası, diğer .tfvars uzantılı olan ise değişkenleri tuttuğum ayrı bir dosya. Eğer isterseniz değişkenleri konfigürasyon dosyası içerisinde de oluşturabilirsiniz.
Provider olarak Azure platformunu seçeceğim için Azure üzerinde service principal oluşturmak gerekir. Bu işlem Azure platformu ile bağlantı kurabilmek için gereklidir. Bunun dışında aşağıdaki yöntemlerden herhangi birisini de kullanabilirsiniz.
- Authenticating to Azure using the Azure CLI
- Authenticating to Azure using Managed Service Identity
- Authenticating to Azure using a Service Principal and a Client Certificate
- Authenticating to Azure using a Service Principal and a Client Secret
Aşağıdaki linki kullanarak ayrıntılı konfigürasyon bilgisini edinebilirsiniz.
https://www.terraform.io/docs/providers/azurerm/index.html
Ben yukarıdaki seçeneklerden 4.’sünü seçerek ilerleyeceğim. Bunun için az.cli kullanarak sp oluşturmak için aşağıdaki komutu çalıştırmak yeterli olacaktır.
Resim-5
Sonrasında aşağıdakine benze bir çıktıya sahip olacaksınız.
Resim-6
Bu çıktıda kullanacağımız bileşenler aşağıdaki gibidir.
appId : client_id olarak kullanılacak.
Password: client_secret olarak kullanılacak.
Tenant: tenant_id olarak kullanılacak.
Tabi birde işlemin yapılacağı Azure subscripion’ına ilişkin bilgiyi de az account list komutu ile öğrenmeniz gerekir.
Gerekli olan bilgiler öğrenildikten yada oluşturulduktan sonra değişken olarak .tfvars uzantılı dosyaya yazılması gerekir. (İsterseniz bu dosyayı kullanmadan direkt olarak konfigürasyon dosyası içerisine de bu bilgileri girebilirsiniz. Ama önerilen ayrı bir dosyada tutulmasıdır.)
Resim-7
Değişkenleri tutan dosyaya yazma işlemini tamamladıktan sonra asıl konfigürasyon dosyasına geçebiliriz. Konfigürasyon dosyası oldukça anlaşılır. (Belki bir sonraki makalede syntax’ı ele alabilirim. Ama şimdilik genel bir şekilde açıklamaya çalışacağım.)
İlk bölüm değişkenleri ifade eder. Bu bölüm .tfvars uzantılı dosyadaki bilgilerden beslenmektedir.
Provider bölümü kullanılacak provider ve bu provider’a ait connection bilgilerini içerir. Burada değişken kısmında tanımlanan bilgiler subscription_id,client_id,client_secret ve tenant_id olarak ilgili attribute’lara atanmıştır.
Resim-8
Yukarıdaki resimdeki resource bölümleri ise oluşturualacak resource’ları ifade eder. Bunlardan ilki resource group, diğer ise virtual network’tür. Yukarıdaki resimde dikkat ederseniz resource keyword’unun ardından resource tipi ve ismi yazılmıştır. Bu iki değer diğer resource’lara değişken olarak atanabileceği için yazılan isim değeri eşsiz olmalıdır. Şekilde resource group atandıktan sonra bu resource group vnet’in oluşturulması sırasında da kullanılması için ${azurerm_resource_group.test.name} şeklinde tanımlanmıştır. Bu tanımlamada noktaya kadar olan kısım type’ı, bir sonraki kısım atanan eşsiz ismi,son kısım ise resource’a ait attribute’u ifade eder.
Şekle bakıldığında özet olarak connection için kullanılacak değişkenler (burada resource’lar için yada daha farklı iştanımlar için de değişken oluşturabilirsiniz), kullanılacak platform bilgisini içeren provider bölümü ve oluşturulacak resource’lara ait tanımlar anlaşılır şekilde görünmektedir.
Şimdi terraform’u kullanarak bu resource’ları deploy edelim. Deploy öncesinde plan komutunu çalıştırarak yapacağımız deployment’a ait bilgi edinebiliriz. (Bu sayede deployment öncesinde hatalı bir durum varsa kolaylıkla saptanabilir.)
Bu amaçla aşağıdaki komutu çalıştıralım. Komutu çalıştırırken değişkenlerin bulunduğu .tfvars uzantılı dosyayı da aşağıdaki şekilde göstermek gerekir.
terraform.exe plan -var-file=’c:\tf\azure\tfvariables.tfvars’
Eğer aşağıdaki hatayı alırsanız, Azure’a ait güncel güncel provider.azurerm plugin’inin yüklenmesi gerekir.
Resim-9
Zaten çıktıda da söylendiği gibi terraform init komutunu kullanarak bu plugin’i kolaylıkla yükleyebiliriz. Bu amaçla aşağıdaki komutu çalıştıralım.
Resim-10
Bu komutun ardından tekrardan plan komutunu çalıştıralım. Komutun ardından çıktı aşağıdaki gibidir. Şekilde de görüldüğü gibi herhangi bir hata bulunmamaktadır. Oluşturulacak resource’lar ve attribute’ları açık şekilde listelenmektedir. Şekildeki yeşil artı işareti kaynakların hedefte bulunmadığı bu sebeple yeniden oluşturulacağı anlamına gelir.
Resim-11
Şimdi resource’ları Azure üzerine deploy etmek için apply komutunu kullanalım.
Resim-12
Komutun çıktısında iki adet resource’un başarılı şekilde eklendiği görülmektedir. Azure platformunu kontrol ettiğimizde de resource’ların başarılı şekilde oluştuğunu görebilirsiniz.
Burada yaptığımız deployment tamamen anlatılanı pekiştirmek için basit bir denemeydi. Daha karmaşık resource’ların nasıl deploy edileceği ve sonrasında devamlı olarak nasıl update edileceğine ilişkin makaleleri de sırasıyla yazacağım.
Görüşmek üzere.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar
https://www.terraform.io/docs/providers/azurerm/index.html
TAGs: Terraform, Terraform nedir, terraform nasıl kullanılır, Infrastructure as a code, IAC, Compliance management, Auto remediation, Deploy Azure Resource with terraform, Deploy configuration with terraform, configuration as a code, terraform overview, terraform basics, Azure with terraform, deploy resources to azure with terraform, terraform.exe