AZURE ÜZERİNDE TERRAFORM İLE ALT YAPI GELİŞTİRME – BÖLÜM 11 : LOOPS (DÖNGÜLER)

Azure üzerinde Terraform ile Altyapı Geliştirme makale serisine hoş geldiniz. Yazı dizisinin on birinci bölümünde Terraform’da döngüleri nasıl kullanabileceğimize bakacağız. Döngüler, karmaşık kodu alıp temiz, basit ve anlaşılması kolay bir şeye dönüştürebilir. Yalnızca birkaç satır kodla altyapıyı ölçeklendirebilir ve kolaylaştırabilirsiniz. Döngüler, modülleri dinamik hale getirmek için Terraform topluluğunda yaygın olarak kullanılmaktadır. Örneğin, bir Sanal Makine modülü, gerekirse birden çok diski dağıtmak için döngüleri kullanabilir veya birden çok IP adresi içerebilir. Terraform’da döngüleri kullanmak, kodunuza daha temiz bir görünüm verir ve aynı kavramların Terraform konfigürasyonu boyunca tekrarlanmadığı DRY (Kendini Tekrar Etme) programlama ilkelerini takip eder.

  • Örneğimiz için ana dizinde aşağıdaki klasör yapısını oluşturun.
  • nsg klasöründe variables.tf oluşturun ve aşağıdaki Terraform kodlarının yapıştırın
variable "nsg_rule" {
    description = "OS image to deploy"
    type = list(object({
        name                       = string
        priority                   = number
        direction                  = string
        access                     = string
        protocol                   = string
        source_port_range          = string
        destination_port_range     = string
        source_address_prefix      = string
        destination_address_prefix = string
  }))
}    

variable "nsgname" {
    type = string
    description = "Name of NSG"
}
variable "rgname" {
    type = string
    description = "Name of resource group"
}
variable "location" {
    type = string
    description = "Azure location of NSG environment"
    default = "northeurope"
}
  • “nsg_rule” değişkeni liste (nesne) türüdür. Bu, bu değişkenin birkaç nesnenin bir listesini tutabileceğini gösterir. Sonraki adımlarda “nsg_rule” değişkenindeki tüm nesneleri tekrar eden ve değerleri ile bir NSG kuralı oluşturan bir döngü ile konfigürasyon oluşturacağız. Ayrıca nesneler yerine bir map listesi de oluşturabilirsiniz.
  • Şimdi nsg klasöründe main.tf dosyasını oluşturun ve aşağıdaki Terraform kodlarını yapıştırın.
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "2.40.0"
    }
  }
}

resource "azurerm_network_security_group" "nsg" {
  name                = var.nsgname
  location            = var.location
  resource_group_name = var.rgname

  dynamic security_rule {
    for_each = var.nsg_rule
    content{
      name                       = security_rule.value.name
      priority                   = security_rule.value.priority
      direction                  = security_rule.value.direction
      access                     = security_rule.value.access
      protocol                   = security_rule.value.protocol
      source_port_range          = security_rule.value.source_port_range
      destination_port_range     = security_rule.value.destination_port_range
      source_address_prefix      = security_rule.value.source_address_prefix
      destination_address_prefix = security_rule.value.destination_address_prefix
    }
  }
}
  • “azurerm_network_security_group” kaynak bloğunda, security_rule için başvurulan dinamik bir blok vardır. Dinamik bloklar, tekrarlanabilir konfigürasyon blokları içeren kaynaklar için kullanılabilir. Birkaç “security_rule” bloğunu tekrarlamak yerine, kodu basitleştirmek için dinamik bir blok kullanılır. Bu, dinamik bloğu içindeki “for_each” döngüsüyle birleştirerek yapılır. Dinamik bloğun içindeki ilk satır “for_each” döngüsüdür. Döngü, nesnelerin bir listesi olan “nsg_rule” değişkenleri listesi boyunca yinelenir. İçerik bloğunda, nesnenin her değerine, her nesnenin özniteliğiyle birlikte “security_rule.value” kullanılarak başvurulur. Dinamik blok, listedeki her nesnede tekrarlanır.
  • Şimdi ana dizin klasöründe main.tf dosyasını oluşturun ve aşağıdaki Terraform kodlarının yapıştırın.
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "2.40.0"
    }
  }
}

provider "azurerm" {
  features {}
}

module "nsg" {
    source = "./modules/nsg"

    nsgname    = "nsg"
    rgname    = "demo10"
    location  = "northeurope"

    nsg_rule =[
    {
    name                       = "http"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "80"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
    },
    {
     name                       = "ssh"
    priority                   = 101
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "22"
    destination_port_range     = "*"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
    }
]
}
  • Artık tüm dosyaları kaydedip “terraform init” ve “terraform plan” komutlarını çalıştırabiliriz. Elbette daha önce oturum açmadıysanız Azure aboneliğinizde oturum açmayı unutmayın.
  • “Terraform plan” komutunun çıktısı aşağıdaki gibi olacaktır.
  • “nsgname” argümanına “count.index” değişkenini değere dahil etmek için aşağıdaki kodu ekleyelim. “Count.index”, “count” kullanılırken kullanılabilir hale gelir. Oluşturulan kaynağın dizin değerini temsil eder. Count ile çoğaltıldığında kaynaklara benzersiz bir ad vermek için kullanılabilir. Bu örnekte, 4 NSG’nin NSG adları nsg0, nsg1, nsg2 ve nsg3 olacaktır.
# NSG module
module "nsg" {
    count = 4 
    source = "./modules/nsg"

    nsgname    = "nsg${count.index}"
  • main.tf dosyasının son hali aşağıdaki gibidir.
# Terraform
terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "2.40.0"
    }
  }
}

#Azure provider
provider "azurerm" {
  features {}
}

# NSG module
module "nsg" {
    count = 4 
    source = "./modules/nsg"

    nsgname    = "nsg${count.index}"
    rgname    = "demo10"
    location  = "northeurope"

    nsg_rule =[
    {
    name                       = "http"
    priority                   = 100
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "*"
    destination_port_range     = "80"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
    },
    {
     name                       = "ssh"
    priority                   = 101
    direction                  = "Inbound"
    access                     = "Allow"
    protocol                   = "Tcp"
    source_port_range          = "22"
    destination_port_range     = "*"
    source_address_prefix      = "*"
    destination_address_prefix = "*"
    }
]
}
  • Şimdi “Terraform apply” komutunu çalıştıralım ve 4 adet NSG oluşturalım. Bu 4 NSG içinde aynı kurallar atanacaktır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.