Ana içeriğe geç

Başlarken

Bu rehber, DT Cloud'daki ilk makinenizi Terraform ile oluşturmayı adım adım anlatır: başlamadan önce neye ihtiyacınız olduğunu, en küçük yapılandırmanın neye benzediğini ve her komuttan ne beklemeniz gerektiğini. Daha önce Terraform kullanmadığınızı varsayar.

Terraform burada ne yapar​

İstediğiniz şeyi anlatan bir dosya yazarsınız. Terraform bununla var olan arasındaki farkı çıkarır, sonra aradaki farkı kapatacak çağrıları yapar.

Bütün fikir budur ve onu API'yi çağıran bir betikten ayıran da budur. Bir betik şu adımları uygula der. Terraform ise istediğim sonuç bu der; bu yüzden iki kez çalıştırmak ikincisinde hiçbir şeyi değiştirmez, biri bir şeyleri elle düzenledikten sonra çalıştırmak da onları eski haline getirir.

1. Terraform'u kurun​

releases.hashicorp.com adresinden indirin ve çalıştırılabilir dosyayı PATH üzerine koyun.

terraform version

2. Kimlik bilgilerinizi alın​

DT Cloud konsolundan üç şeye ihtiyacınız var: bir API erişim anahtarı, bir API gizli anahtarı ve projenizin bulunduğu bölge (sunucu) kimliği.

Size uyan yolu seçin; sağlayıcı bunları, onları içeren ilk yerden alır.

Makineyi bir kez yapılandırın (önerilen)​

terraform-provider-dtcloud configure

Üç değeri sorar, bir şey kaydetmeden önce onları API'ye karşı doğrular ve yalnızca sahibinin okuyabileceği izinlerle kullanıcı yapılandırma dizininize yazar. Bundan sonra makinedeki her proje boş bir provider bloğuyla ve ortada hiçbir kimlik bilgisi olmadan çalışır.

Komut sağlayıcının çalıştırılabilir dosyasının kendisidir, bu yüzden ek bir şey kurmanız gerekmez. PATH üzerinde değilse, terraform plan'dan aldığınız hata onun tam yolunu yazdırır.

Ya da proje başına Terraform sorsun​

Değerleri varsayılanı olmayan değişkenler olarak tanımlayın; Terraform ilk plan'da onları sorar:

variable "dtcloud_access_key" {
type = string
sensitive = true
}

variable "dtcloud_secret_key" {
type = string
sensitive = true
}

variable "dtcloud_region_id" {
type = string
}

variable "dtcloud_api_url" {
type = string
default = "https://console.dt.net.tr/api/v1"
}

provider "dtcloud" {
access_key = var.dtcloud_access_key
secret_key = var.dtcloud_secret_key
region_id = var.dtcloud_region_id
api_endpoint = var.dtcloud_api_url
}

Adresin varsayılan değeri olduğu için yalnızca diğer üçü sorulur; üretim dışındaki her ortam için dtcloud_api_url değerini verin. Yazmaktan yorulduğunuzda değerleri terraform.tfvars dosyasına koyun ve o dosyayı .gitignore'a ekleyin.

Ya da ortam değişkenleri; CI'ın kullanması gereken budur​

export DTCLOUD_ACCESS_KEY="..."
export DTCLOUD_SECRET_KEY="..."
export DTCLOUD_REGION_ID="2"
export DTCLOUD_API_URL="https://console.dt.net.tr/api/v1"

Bunlar yapılandırma dosyasını geçersiz kılar; böylece bir derleme ajanı asla bir geliştiricinin hesabını kullanmaz.

warning

Kimlik bilgilerini .tf dosyalarınızın dışında tutun. Oraya yazılan her şey sürüm denetimine girer ve terraform.tfstate de şifrelenmez. Yukarıdaki üç yoldan herhangi biri ikisini de temiz tutar.

not

Hiçbir argümana ihtiyaç duymasa bile yapılandırmanızda boş bir provider "dtcloud" {} bloğu tutun. Bu blok olmadan bir kimlik bilgisi sorunu Terraform tarafından önce "requires explicit configuration" olarak bildirilir ve bu sizi yanlış yöne götürür.

3. İhtiyacınız olan kimlikleri bulun​

Bir sanal makinenin bir flavor'a, bir imaja, bir ağa, bir güvenlik grubuna ve bir depolama politikasına ihtiyacı vardır. Bunları bir kez arayıp kimliklerini not edin:

data "dtcloud_networks" "virtual" {
network_type = "Virtual"
}

output "networks" {
value = [for n in data.dtcloud_networks.virtual.networks : "${n.name} ${n.id} ${n.cidr}"]
}
terraform apply    # yalnızca veri kaynakları; hiçbir şey oluşturulmaz
terraform output networks

4. Yapılandırmayı yazın​

main.tf dosyasını oluşturun:

terraform {
required_providers {
dtcloud = {
source = "dtcloudnow/dtcloud"
version = "~> 26.0.0"
}
}
}

provider "dtcloud" {}

resource "dtcloud_ssh_key" "mine" {
name = "my-key"
public_key = file("~/.ssh/id_rsa.pub")
}

resource "dtcloud_vm" "first" {
name = "my-first-vm"
flavor_id = "<flavor id>"
key_name = dtcloud_ssh_key.mine.name

network {
uuid = "<network id>"
security_groups = ["<security group id>"]

fixed_ip {
ip_version = 4
}
}

block_device {
boot_index = 0
volume_size = 20
source_type = "image"
device_type = "disk"
destination_type = "volume"
delete_on_termination = true
volume_type = "<storage policy>"
uuid = "<image id>"
}
}

output "address" {
value = dtcloud_vm.first.primary_ip
}

İlk denemede en sık takılınan iki şey:

  • key_name, user_data ya da script değerlerinden en az biri zorunludur. İçeri girmenin tek yolları bunlardır; üçü de olmayan bir sanal makine, oturum açmanın hiçbir yolu olmadan önyüklenir.
  • Belirli bir adres istemiyorsanız fixed_ip'yi yazmayın. Sağlayıcı o zaman tek bir adres ister ve platform onu ayırır; apply'dan sonra primary_ip onu bildirir. security_groups verilmezse arayüz projenin varsayılan grubunu alır.

5. Çalıştırın​

terraform init      # sağlayıcıyı indirir; dizin başına bir kez
terraform plan # neyin değişeceğini gösterir; hiçbir şey oluşturmaz
terraform apply # onayladıktan sonra uygular

Onaylamadan önce planı okuyun. Her şeyi simgeler anlatır:

SimgeAnlamı
+oluşturulacak
~yerinde değiştirilecek
-yok edilecek
-/+yok edilip yeniden oluşturulacak

Dikkat etmeniz gereken simge -/+'dır. Platformun çalışan bir makinede değiştiremediği bir argümanın değiştiği anlamına gelir; bu yüzden istediğiniz duruma ulaşmanın tek yolu yeniden oluşturmaktır. Hangi argümanların buna yol açtığını her kaynak sayfası listeler.

6. Bir şeyi değiştirin​

Dosyadaki name değerini düzenleyip terraform plan'ı yeniden çalıştırın. ~ göreceksiniz: yeniden adlandırma yerinde yapılır. Şimdi ağ kimliğini değiştirmeyi deneyin: bu -/+ gösterir, çünkü yerinde yapılamaz.

7. Kaldırın​

terraform destroy

Bu, yapılandırmadaki her şeyi siler. Geri alınamaz.

Zaten var olan makineleri Terraform'a almak​

Konsolda oluşturulmuş bir sanal makineyi Terraform'un yönetmesini istiyorsanız, terraform import makineye dokunmadan onu state'e yazar:

terraform import dtcloud_vm.first <vm-id>
terraform plan

Önemli olan sonrasındaki plandır. Terraform API'nin bildirdiklerini doldurur. Okuyamadığı her şey state'te boş kalır ve böyle bir argüman değiştirildiğinde yeni kaynak gerektiriyorsa ilk plan makineyi yeniden oluşturmayı önerir. Her kaynak sayfası bu argümanları ve içe aktarılan kaynağın nasıl korunacağını listeler.

Sırada ne var​

  • Her kaynağın ve veri kaynağının argümanları, öznitelikleri, zaman aşımları ve içe aktarma biçimiyle kendi sayfası vardır.
  • Sağlayıcı deposundaki examples/ her servis için çalışan yapılandırmalar içerir; bunlar sağlayıcıyı canlı platforma karşı test etmek için kullanılan dosyaların aynısıdır.