Terraform kullanarak Linux sanal makinesi sağlama
Terraform, bileşenlerinin istenen durumunu açıklayan yapılandırma dosyalarını kullanarak hedef altyapıyı uygular ve denetler. Hashicorp Yapılandırma Dili'nde (HCL) ifade edilen dosyaların temel biçimi ve genel söz dizimi, bulut seçiminden bağımsız olarak aynıdır. Ancak tek tek bileşen açıklamaları, ilgili Terraform sağlayıcısı tarafından belirlenen buluta bağımlıdır.
Azure altyapı yönetimini destekleyen birkaç Terraform sağlayıcısı olsa da, AzureRM'nin özellikle ilgisi vardır. AzureRM sağlayıcısı sanal makineler, depolama hesapları ve ağ arabirimleri gibi yaygın Azure IaaS kaynaklarının sağlanmasını ve yapılandırılmasını kolaylaştırır. Ayrıca, dağıtımlarınıza dahil etmek isteyebileceğiniz buluta özgü olmayan başka sağlayıcılar da vardır. Bunlar rastgele karakter dizeleri oluşturarak kaynak adlandırma çakışmalarını önlemeye yardımcı olan rastgele sağlayıcıyı içerir; ve Linux kimlik doğrulamasının güvenliğini sağlamak için asimetrik anahtarları yönetmeyi basitleştiren tls sağlayıcısı.
Terraform, Hashicorp web sitesinden indirebileceğiniz tek bir ikili dosya olarak kullanılabilir. Bu ikili, Terraform komut satırı arabirimini (CLI) uygular ve ardından Terraform'ı başlatmak ve yapılandırma dosyalarını işlemek için bir kabuk oturumundan çağırabilirsiniz. Terraform CLI'yi Azure CLI'yi destekleyen herhangi bir kabuktan kullanabilirsiniz.
Dekont
Azure Cloud Shell kullanırken, Bash ile Azure Cloud Shell'de Terraform'u yapılandırma başlığında sağlanan yönergeleri izleyerek geçerli Terraform sürümünü çalıştırdığınızdan emin olun.
Terraform kullanarak Linux VM dağıtma
Terraform, kaynakları tanımlamanıza, önizlemenize ve sağlayıcıya özgü bir bulut altyapısına dağıtmanıza olanak tanır. Sağlama işlemi, Azure gibi hedef bulut ortamını ve bulut altyapınızı oluşturan kaynakları belirlemenizi sağlayan HCL söz dizimini kullanan yapılandırma dosyaları oluşturmakla başlar. Tüm ilgili yapılandırma dosyaları (genellikle aynı dosya sistemi konumunda) oluşturulduktan sonra, gerçek dağıtımdan önce elde edilen altyapı değişikliklerinin önizlemesini görüntülemenizi sağlayan bir yürütme planı oluşturabilirsiniz. Bu, bulut kaynaklarını uygulamak için gerekli sağlayıcı modüllerini indirmek için Terraform'un başlatılmasını gerektirir. Değişiklikleri doğruladıktan sonra, altyapıyı dağıtmak için yürütme planını uygulayabilirsiniz.
Dekont
Yürütme planı oluşturmak isteğe bağlıdır, ancak hedef ortamı etkilemeden planlanan dağıtımdan herhangi bir etkiyi belirlemenize olanak sağladığından bunu yapmanızı öneririz. Azure kaynaklarını etkileşimli olarak dağıttığınızda Terraform, hedef Azure aboneliğine erişmek için kimlik bilgilerinizi yeniden kullanarak Azure CLI kimlik doğrulamasını şeffaf bir şekilde destekler.
Terraform kullanarak Linux çalıştıran bir Azure VM sağlama işlemi genellikle aşağıdaki üst düzey adımları içerir:
- Uygun VM görüntüsünü tanımlayın.
- Uygun VM boyutunu belirleyin.
- Azure VM kaynağını bağımlılıklarıyla tanımlayan yapılandırma dosyaları oluşturun.
- Terraform'u başlatın.
- Terraform yürütme planı oluşturma.
- Terraform dağıtımı başlatın.
Uygun VM görüntüsünü ve boyutunu belirlemek için bu modülün 4. Ünitesinde açıklanan adımları izleyin. Bu ünite Terraform'a özgü görevlere odaklanır.
Yapılandırma dosyaları oluşturma
Dekont
Terraform dosyalarınız için seçtiğiniz dosya adları rastgeledir, ancak dosya içeriğini veya amacını yansıtan bir ad seçmek iyi bir uygulamadır. Dosya uzantısı için ".tf" kullanmalısınız.
Terraform kullanarak bir Linux VM dağıtmak için, yapılandırma dosyalarını barındırmak için bir dizin oluşturarak başlarsınız. Ardından, Terraform sürümünü zorlayan ve dağıtımınıza dahil edilen kaynakları tanımlarken güvendiğiniz sağlayıcıları belirleyen providers.tf adlı bir dosya oluşturun. Bu dosyanın içeriği aşağıdaki kod parçacığında görüntülenmelidir:
terraform {
required_version = ">=0.12"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~>2.0"
}
random = {
source = "hashicorp/random"
version = "~>3.0"
}
tls = {
source = "hashicorp/tls"
version = "~>4.0"
}
}
}
provider "azurerm" {
features {}
}
Aynı dizinde, Azure VM yapılandırmasını ve bağımlılıklarını tanımlayan aşağıdaki kodu kullanarak main.tf adlı bir dosya oluşturun:
resource "random_pet" "rg_name" {
prefix = var.resource_group_name_prefix
}
resource "azurerm_resource_group" "rg" {
location = var.resource_group_location
name = random_pet.rg_name.id
}
# Create virtual network
resource "azurerm_virtual_network" "terraform_network" {
name = "lnx-tf-vnet"
address_space = ["10.1.0.0/16"]
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
}
# Create subnet
resource "azurerm_subnet" "terraform_subnet" {
name = "subnet0"
resource_group_name = azurerm_resource_group.rg.name
virtual_network_name = azurerm_virtual_network.terraform_network.name
address_prefixes = ["10.1.0.0/24"]
}
# Create public IPs
resource "azurerm_public_ip" "terraform_public_ip" {
name = "lnx-tf-pip"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
allocation_method = "Dynamic"
}
# Create Network Security Group and rule
resource "azurerm_network_security_group" "terraform_nsg" {
name = "lnx-tf-nsg"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
security_rule {
name = "ssh"
priority = 300
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = "22"
source_address_prefix = "*"
destination_address_prefix = "*"
}
}
# Create network interface
resource "azurerm_network_interface" "terraform_nic" {
name = "lnx-tf-nic"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
ip_configuration {
name = "nic_configuration"
subnet_id = azurerm_subnet.terraform_subnet.id
private_ip_address_allocation = "Dynamic"
public_ip_address_id = azurerm_public_ip.terraform_public_ip.id
}
}
# Connect the security group to the network interface
resource "azurerm_network_interface_security_group_association" "lnx-tf-nic-nsg" {
network_interface_id = azurerm_network_interface.terraform_nic.id
network_security_group_id = azurerm_network_security_group.terraform_nsg.id
}
# Generate random text for a unique storage account name
resource "random_id" "random_id" {
keepers = {
# Generate a new ID only when a new resource group is defined
resource_group = azurerm_resource_group.rg.name
}
byte_length = 8
}
# Create storage account for boot diagnostics
resource "azurerm_storage_account" "storage_account" {
name = "diag${random_id.random_id.hex}"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
account_tier = "Standard"
account_replication_type = "LRS"
}
# Create (and display) an SSH key
resource "tls_private_key" "lnx-tf-ssh" {
algorithm = "RSA"
rsa_bits = 4096
}
# Create virtual machine
resource "azurerm_linux_virtual_machine" "lnx-tf-vm" {
name = "lnx-tf-vm"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
network_interface_ids = [azurerm_network_interface.terraform_nic.id]
size = "Standard_F4s"
os_disk {
name = "lnx-tf-vm-osdisk"
caching = "ReadWrite"
storage_account_type = "Premium_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
computer_name = "lnx-tf-vm"
admin_username = "azureuser"
disable_password_authentication = true
admin_ssh_key {
username = "azureuser"
public_key = tls_private_key.lnx-tf-ssh.public_key_openssh
}
boot_diagnostics {
storage_account_uri = azurerm_storage_account.storage_account.primary_blob_endpoint
}
}
Aynı dizinde, değeri main.tf dosyasında görünen değişkenlere atayan aşağıdaki kodu kullanarak variables.tf adlı başka bir dosya oluşturun:
variable "resource_group_location" {
default = "eastus"
description = "Location of the resource group"
}
variable "resource_group_name_prefix" {
default = "rg"
description = "Prefix of the resource group name that's combined with a random ID so name is unique in your Azure subscription"
}
Son olarak, başarılı bir dağıtımın ardından görüntülenen çıkışı belirleyen aşağıdaki kodu kullanarak outputs.tf adlı bir dosya oluşturun:
output "resource_group_name" {
value = azurerm_resource_group.rg.name
}
output "public_ip_address" {
value = azurerm_linux_virtual_machine.lnx-tf-vm.public_ip_address
}
output "tls_private_key" {
value = tls_private_key.lnx-tf-ssh.private_key_pem
sensitive = true
}
Terraform'u başlatma
Terraform dağıtımını başlatmak için kabuk isteminden aşağıdaki komutu çalıştırın:
terraform init
Bu komut, Azure kaynaklarını sağlamak ve yönetmek için gereken Azure modüllerini indirir.
Yürütme planı oluşturma
Başlatma işleminden sonra terraform planını çalıştırarak bir yürütme planı oluşturun. Komut bir yürütme planı oluşturur, ancak çalıştırmaz. Bunun yerine, yapılandırma dosyalarınızda tanımlanan kaynakları oluşturmak için hangi eylemlerin gerekli olduğunu belirler. İsteğe bağlı -out
parametresi, plan için gerçek dağıtım sırasında başvurabileceğiniz bir çıkış dosyası belirtmenize olanak tanır. Bu dosyanın kullanılması, gözden geçirdiğiniz planın tam dağıtım sonucuyla eşleşmesini sağlar. Yürütme planı oluşturmak için aşağıdaki komutu kullanın:
terraform plan -out <terraform_plan>.tfplan
Dağıtım başlatma
Yürütme planını Azure ortamınıza uygulamaya hazır olduğunuzda, önceki adımda oluşturduğunuz dosyanın adıyla birlikte komutunu çalıştırın terraform apply
. Beklenen sonucu gözden geçirmek için başka bir şansınız olacak. Terraform devam etmek için sizden onay ister, ancak anahtarı ekleyerek -auto-approve
istemi ortadan kaldırabilirsiniz. Dağıtımı başlatmak için aşağıdaki komutu kullanın:
terraform apply <terraform_plan>.tfplan
Azure VM kısa süre içinde, genellikle birkaç dakika içinde çalışmaya başlar. Komut çıktısı terraform apply
çıkış listesini içerir, ancak terraform değerini tls_private_key
hassas> etiketle <değiştirir:
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
Çıkış:
public_ip_address = "74.235.10.136"
resource_group_name = "rg-flexible-shark"
tls_private_key = <sensitive>
SSH bağlantınızın kimliğini doğrulamak için otomatik olarak oluşturulan özel anahtarı kullanmak için, bunu bir dosyada depolayın ve ardından dosyanın izinlerini başkaları tarafından erişilmediğinden emin olacak şekilde ayarlayın. Bunu gerçekleştirmek için aşağıdaki komutları çalıştırın:
terraform output -raw tls_private_key > id_rsa
chmod 600 id_rsa
Bu noktada aşağıdaki komutu çalıştırarak Azure VM'sine bağlanabileceksiniz (public_ip_address> yer tutucusunu <terraform apply-generated çıkışında tanımladığınız IP adresiyle değiştirdikten sonra):
ssh -i id_rsa azureuser@<public_ip_address>