AZURE ÜZERİNDE TERRAFORM İLE ALT YAPI GELİŞTİRME – BÖLÜM 6 : DEĞİŞKENLER
Azure üzerinde Terraform ile Altyapı Geliştirme makale serisine hoş geldiniz. Yazı dizisinin altıncı bölümünde, Terraform kodunda değişkenlerin kullanımına bakacağız. Değişkenler, Terraform geliştirmenin kritik bir bileşenidir. Değişkenlerle yapılandırmaları dinamik ve yeniden kullanılabilir hale getirebilirsiniz. Örneğin, Terraform kodunuzdaki değişkenleri kullanarak bir Azure Sanal Makinesi oluşturduğunuzda, aynı kodu başka bir ortama dağıtmak için kolayca kullanabilirsiniz. Bu strateji, ekiplerinizin hızını ve verimliliğini artırır. Vakit kaybetmeden bir örnekte değişkenlerin kullanımına bir göz atalım.
- Daha önce olduğu gibi, bu örnekte VS Code kullanıyorum. VS Kodunda değişken.tf adlı bir dosya oluşturun. Bu dosya, adı gösterildiği gibi değişkenleri içerecektir. Aşağıdaki kodu bu dosyaya yapıştırabilirsiniz.
variable "location" {
type = string
description = "Azure location of terraform server environment"
default = "northeurope"
}
variable "vnet_address_space" {
type = list
description = "Address space for Virtual Network"
default = ["30.0.0.0/16"]
}
variable "snet_address_space" {
type = list
description = "Address space for Virtual Network"
default = ["30.0.0.0/24"]
}
- Örneğimizde, bir Azure Kaynak Grubu içinde bir Sanal Ağ ve Alt Ağ oluşturacağız. Kodun ileride tekrar kullanılabilmesi için vnet/alt ağ adresleri ve lokasyon için değişkenler tanımlanmıştır.
- “variable” anahtar sözcüğünden sonraki etiket, aynı modüldeki tüm değişkenler arasında benzersiz olması gereken değişkenin adıdır. (konum, vnet_address_space, snet_address_space) Bu ad, değişkene dışarıdan bir değer atamak ve değişkenin değerine modül içinden referans vermek için kullanılır.
- “Type” argümanı, değişken için hangi değer türlerinin kabul edildiğini belirtir.
- Değişkeni isteğe bağlı yapan bir “default” değer.
- “Description”, giriş değişkeninin belgelerini belirtir.
- Aynı dizinde bir main.tf dosyası oluşturun ve aşağıdaki kodu bu dosyaya yapıştırabilirsiniz.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.40.0"
}
}
}
provider "azurerm" {
features {}
}
resource "azurerm_virtual_network" "vnet" {
name = "vnet-dev-${var.location}-001"
address_space = var.vnet_address_space
location = var.location
resource_group_name = "demo03"
}
resource "azurerm_subnet" "subnet" {
name = "snet-dev-${var.location}-001 "
resource_group_name = "demo03"
virtual_network_name = azurerm_virtual_network.vnet.name
address_prefixes = var.snet_address_space
}
- Değişkenlere “var” kullanılarak başvurulur. ve değişken adı ile birleştirilir. “azurerm_virtual_network” bloğunun içinde, “address_space” bağımsız değişkeni, değeri için “var.vnet_address_space” değişkenine başvuruyor. Ayrıca, “name” bağımsız değişkeninde adın, “var.location” değişkeniyle enterpolasyon yapılan bir dize olduğuna dikkat edin. Değişken adının bir dizge içinde kullanılabilmesi için ${} ile çevrelenmesi gerekir.
- Şimdi var’able.tf ve main.tf dosyalarını kaydedin ve Terminal’i VS Kodunda çalıştırın. Buradan Connect-AzAccount komutuyla Azure aboneliğinizde oturum açın.
- Terraform yapılandırma dosyalarını içeren çalışma dizinini “Terraform init” komutuyla başlatın.
- “Terraform Apply” komutuyla terraform yapılandırma dosyalarınızı dağıtın. Değişkenleri ayrıca aşağıda gösterildiği gibi terraform application komutunda da kullanabilirsiniz. Burada kullanacağınız değişkenlerin,variable.tf dosyasındaki değişkenlere göre önceliğe sahip olduğunu unutmayın.
terraform apply -var='vnet_address_space=["20.0.0.0/16"]' -var='snet_address_space=["20.0.0.0/24"]' -var="location=westeurope"
Değişkenlerdeki yeni türlere bir göz atalım. “Map” tipi, değerleri saklamak için kullanılacak bir anahtar-değer çifti değişken tipidir. “Object” türü, farklı türlerdeki birkaç değeri bir araya getirmek için kullanılır. Aşağıdaki örnekte “Map” ve “Object” türlerinin değişkenlerde nasıl kullanıldığını görebilirsiniz. Ayrıca, aşağıdaki kodu variable.tf dosyanıza yapıştırın.
variable "servername" {
type = string
description = "Server name of the virtual machine"
}
variable "admin_username" {
type = string
description = "Administrator username for server"
}
variable "admin_password" {
type = string
description = "Administrator password for server"
}
variable "managed_disk_type" {
type = map
description = "Disk type Premium in Primary location Standard in DR location"
default = {
northeurope = "Premium_LRS"
westeurope = "Standard_LRS"
}
}
variable "vm_size" {
type = string
description = "Size of VM"
default = "Standard_D2s_V3"
}
variable "os" {
description = "OS image to deploy"
type = object({
publisher = string
offer = string
sku = string
version = string
})
}
Bundan sonra “main.tf” dosyanıza aşağıdaki kodu ekleyin. “Managed_disk_type” bağımsız değişkeni, yapılandırmaya koşullu mantık ekleyen bir “lookup” işleviyle birlikte kullanılır. İşlev ifadesi, options.tf içindeki “managed_disk_type” değişkenine bakar ve değeri “location” değişkenindeki değerle eşleştirir. Yani “var.location” “northeurope” değerini içeriyorsa, “northeurope” anahtarının altındaki “managed_disk_type” değişken haritasında bulunan Premium_LRS disk tipini otomatik olarak kullanacaktır.
resource "azurerm_virtual_machine" "vm" {
name = var.servername
location = var.location
resource_group_name = "demo03"
network_interface_ids = [azurerm_network_interface.nic.id]
vm_size = "Standard_D2s_v3"
storage_os_disk {
name = "stvm${var.servername}os"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = lookup(var.managed_disk_type, var.location, "Standard_LRS")
}
storage_image_reference {
publisher = var.os.publisher
offer = var.os.offer
sku = var.os.sku
version = var.os.version
}
os_profile {
computer_name = var.servername
admin_username = var.admin_username
admin_password = var.admin_password
}
os_profile_linux_config {
disable_password_authentication = false
}
}
Bazı değişkenlerin variable.tf dosyasında değerleri olmadığını unutmayın. Örneğin sunucuadı, admin_username, admin_password vb. Değişkenler için değerler kullanılmıyorsa, Terraform dizinde otomatik olarak bir terraform.tfvars arayacak ve bulunursa, değişkenler için bu dosyadaki değerleri kullanacaktır. Bu, her değer için -var kullanmak zorunda kalmamanın harika bir yoludur. Ancak, hassas değişken bilgilerinin yalnızca -var ile kullanılması ve “terraform.tfvars” dosyasına yazılmaması önemlidir. Şimdi bir terraform.tfvars dosyası oluşturun ve aşağıdakini yapıştırın.
servername = "vmdemo03"
location = "northeurope"
admin_username = "dcoadmin"
admin_password = "D€VCL0ud0ps"
vnet_address_space = ["30.0.0.0/16"]
os = {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04.0-LTS"
version = "latest"
}
Artık “terraform apply” komutu ile dağıtımı gerçekleştirebilirsiniz.