AzureDevOpsGenel

Terraform ile Azure’da Sanal VM Oluşturma

Merhaba! Bu makalede, Terraform kullanarak Azure Cloud üzerinde nasıl sanal makine (VM) oluşturabileceğinizi adım adım ele alacağız.

Terraform, altyapıyı kod olarak yönetme imkânı sağlayan popüler bir araç olup, bulut kaynaklarını tanımlayıp otomatikleştirmenize olanak tanır.

Azure Cloud üzerinde sanal makine oluşturmak ise, geliştiriciler ve sistem yöneticileri için sıkça ihtiyaç duyulan bir işlemdir. Bu makalede Terraform ile nasıl hızlı ve verimli bir şekilde Azure VM’leri oluşturabileceğinizi göstererek, altyapınızı daha yönetilebilir hale getirme konusunda rehberlik edeceğiz.

Hazırsanız başlayalım!

Ben bu işlemleri bir linux-ubuntu makinede yapacağım o yüzden ön gereksinimler olarak aşağıdaki adımları tamamlıyoruz.

Terraform Kurulumu

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common curl
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt-get update && sudo apt-get install terraform

Kurulum sonrası doğrulamak için terraform -help yazıyorum herşey yolunda!

Azure CLI kurulumu

curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash


Terraform main.tf dosyam aşağıdaki gibi, burda ki bilgileri kendi azure subscription’a göre düzenleyebilirsiniz.

# Azure Provider tanımlamasi
provider "azurerm" {
  features {}

  # Tenant ID ve Subscription ID ayarları
  tenant_id       = "0123456789"
  subscription_id = "0123456789"
}

# Resource Group 
resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West US 2" 
}

# Sanal Ağ (VNet) Oluşturma
resource "azurerm_virtual_network" "example_vnet" {
  name                = "example-vnet"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location  # Düzeltilmiş kaynak ismi
  resource_group_name = azurerm_resource_group.example.name      # Düzeltilmiş kaynak ismi
}

# Alt Ağ (Subnet) Oluşturma
resource "azurerm_subnet" "example_subnet" {
  name                 = "example-subnet"
  resource_group_name  = azurerm_resource_group.example.name     # Düzeltilmiş kaynak ismi
  virtual_network_name = azurerm_virtual_network.example_vnet.name
  address_prefixes     = ["10.0.1.0/24"]
}

# Public IP Adresi Oluşturma
resource "azurerm_public_ip" "example_public_ip" {
  name                = "example-public-ip"
  location            = azurerm_resource_group.example.location 
  resource_group_name = azurerm_resource_group.example.name      
  allocation_method   = "Static"
}

# Ağ Arayüzü (Network Interface) Oluşturma
resource "azurerm_network_interface" "example_nic" {
  name                = "example-nic"
  location            = azurerm_resource_group.example.location  
  resource_group_name = azurerm_resource_group.example.name      

  ip_configuration {
    name                          = "internal"
    subnet_id                     = azurerm_subnet.example_subnet.id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.example_public_ip.id
  }
}

# Ubuntu Sanal Makine Oluşturma
resource "azurerm_linux_virtual_machine" "example_vm" {
  name                = "example-vm"
  resource_group_name = azurerm_resource_group.example.name      
  location            = azurerm_resource_group.example.location  
  size                = "Standard_DS1_v2"
  admin_username      = "azureuser"

  network_interface_ids = [
    azurerm_network_interface.example_nic.id,
  ]

  os_disk {
    caching              = "ReadWrite"
    storage_account_type = "Standard_LRS"
  }

  source_image_reference {
    publisher = "Canonical"
    offer     = "UbuntuServer"
    sku       = "18.04-LTS"
    version   = "latest"
  }

  admin_ssh_key {
    username   = "azureuser"
    public_key = file("~/.ssh/id_rsa.pub")  # Bu alanı kendi SSH anahtarına göre düzenle
  }

  computer_name                   = "example-vm"
  disable_password_authentication = true
}

# VM'nin Public IP'sini Çıktı Olarak Almak
output "public_ip" {
  value = azurerm_public_ip.example_public_ip.ip_address
}

Terraform init komutunu çalıştırıyorum.

Terraform init yapılandırmanızda belirtilen sağlayıcıları (provider’ları) indirir. Örneğin, Azure üzerinde kaynak oluşturacaksanız azurerm sağlayıcısını indirir. Sağlayıcılar, Terraform’un farklı bulut servisleri ve platformlarla iletişim kurmasını sağlar.

Terraform plan komutunu çalıştırıyorum.

Terraform yapılandırmanızda yapılacak değişikliklerin bir öngörüsünü (planını) oluşturur. Bu komut, hangi kaynakların oluşturulacağını, değiştirileceğini veya silineceğini gösterir, ancak bu değişiklikleri henüz uygulamaz. terraform plan, özellikle altyapınızda bir hata yapmadan önce yapılacak işlemleri anlamak için kullanılır.


Terraform Apply komutu ile tüm değişiklikleri uyguluyorum.

Ve Sonuç! 🙂

Azure Cloud Portal’den kontrol ediyorum…

Test-Lab ortamında işiniz bittikten sonra kaynakları tek bir komut ile (terraform destroy) temizleyebilirsiniz.