dtcloud_vm (Kaynak)
Bir sanal makineyi yönetir.
Bu kaynak makineyi oluşturur, yeniden adlandırır, yeniden boyutlandırır, güç durumunu değiştirir ve yok eder. Önyüklemeden sonra eklenen arayüzler ve diskler dtcloud_vm_network_interface ile dtcloud_vm_volume_attachment'a aittir.
Örnek Kullanım
resource "dtcloud_vm" "web" {
name = "web-01"
flavor_id = data.dtcloud_flavors.small.flavors[0].id
state = "running"
key_name = dtcloud_ssh_key.deploy.name
# Misafir sisteme ulaşması gereken hâliyle yazılır; API yalnızca base64
# kodlanmış hâlini kabul ettiği için kodlamayı sağlayıcı yapar.
# Burada da kodlamak veriyi iki kez kodlar.
user_data = file("${path.module}/cloud-init.yaml")
# Burada tanımlanan arayüzler makineyle birlikte oluşturulur ve makineyle
# birlikte silinir. Sonradan arayüz eklemek için bunun yerine
# dtcloud_vm_network_interface kullanın.
network {
uuid = dtcloud_network.app.id
security_groups = [dtcloud_security_group.web.id]
fixed_ip {
ip_version = 4
}
}
# Önyükleme diski boot_index 0'dır.
block_device {
boot_index = 0
volume_size = 40
source_type = "image"
device_type = "disk"
destination_type = "volume"
uuid = var.image_id
volume_type = "standard"
delete_on_termination = true
}
}
key_name, user_data ya da script değerlerinden en az biri zorunludur. Kimlik bilgilerinin ya da bir hazırlama yükünün misafir işletim sistemine ulaşmasının tek yolları bunlardır. user_data ile script birlikte ayarlanamaz: platform cloud-init'i yalnızca user_data yokken script'ten oluşturur; bu yüzden plan, betiği sessizce yok saymak yerine bu birleşimi reddeder.
Linux imajında script içinde username, hostname ve disable_root değerlerini ayarlayın. Yalnızca Windows şablon imajları onları yok saydığı için isteğe bağlıdırlar ve bir Linux script'i bunlardan birini eksik bıraktığında apply uyarı verir.
Olağan durum için fixed_ip'yi yazmayın: sağlayıcı tek bir adres ister ve platform onu ayırır. Gerçekte atanan adresler network bloklarına geri bildirilir.
Şema
Zorunlu
flavor_id(String) Flavor'ın (boyutlandırma) kimliği. Bunu değiştirmek makineyi yerinde yeniden boyutlandırır. enable_hot_plug true değilse platform makinenin önce durdurulmasını ister; bu yüzden sağlayıcı onu durdurur, yeniden boyutlandırır ve yapılandırılmış güç durumuna geri döndürür. Bunu yapan plan,statusdeğerinin de (known after apply) olarak göründüğü plandır.name(String) Sanal makinenin adı. Yerinde değiştirilebilir.
İsteğe Bağlı
block_device(Block List) Önyüklemede bağlanacak blok cihazları. Önyükleme diski boot_index değeri 0 olan girdidir. En az bir tane zorunludur. Bu değiştirilirse yeni bir kaynak oluşturulur. (bkz. aşağıdaki iç içe şema)enable_hot_plug(Boolean) Makinede canlı vCPU/bellek yeniden boyutlandırmasına izin verir. Açıkken flavor_id'yi değiştirmek makineyi kapatıp açmaz. Oluşturulduktan sonra açılıp kapatılabilir.graceful_shutdown(Boolean) Durdururken gücü kesmek (hardStop) yerine misafir işletim sisteminin kendini kapatmasını ister (softStop).is_gpu_image(Boolean) Bir GPU imajı önyüklenirken ayarlanır. Bu değiştirilirse yeni bir kaynak oluşturulur.key_name(String) Eklenecek mevcut bir SSH anahtarının adı, örn. bir dtcloud_ssh_key kaynağının adı. Bu değiştirilirse yeni bir kaynak oluşturulur.network(Block List) Önyüklemede bağlanacak ağ arayüzleri. En az bir tane zorunludur. Bu değiştirilirse yeni bir kaynak oluşturulur. (bkz. aşağıdaki iç içe şema)script(Block List, Max: 1) İlk önyüklemede misafir işletim sistemine uygulanan başlangıç kimlik bilgileri. Linux imajında username, hostname ve disable_root değerlerini de ayarlayın; yalnızca Windows şablon imajları onları yok saydığı için isteğe bağlıdırlar. Bu değiştirilirse yeni bir kaynak oluşturulur. (bkz. aşağıdaki iç içe şema)state(String) İstenen güç durumu: running, stopped ya da shelved. Shelve işlemi sanal makineyi ve disklerini korurken bilişim kaynaklarını serbest bırakır.timeouts(Block, Optional) (bkz. aşağıdaki iç içe şema)user_data(String) Cloud-init kullanıcı verisi; misafir sisteme ulaşması gereken hâliyle yazılır. API bunu yalnızca base64 kodlanmış olarak kabul eder ve kodlamayı sağlayıcı yapar; bu yüzden burayabase64encode()çıktısı vermek veriyi iki kez kodlar ve misafire cloud-config yerine kodlanmış metin ulaşır. Bu değiştirilirse yeni bir kaynak oluşturulur.
Salt Okunur
created_at(String) Sanal makinenin oluşturulduğu zaman, RFC 3339 biçiminde.flavor_name(String) Sanal makinenin flavor'ının okunabilir adı.id(String) Bu kaynağın kimliği.image(String) Sanal makinenin oluşturulduğu imajın adı.image_os_type(String) İmajın işletim sistemi ailesi, örn. linux ya da windows.last_modified(String) Sanal makinenin son değiştirildiği zaman, RFC 3339 biçiminde.metadata(Map of String) Platformun makineye eklediği meta veri, örn. ha_enabled.network_interface(List of Object) Sanal makineye şu anda bağlı ağ arayüzleri. (bkz. a şağıdaki iç içe şema)primary_ip(String) Kolaylık kısayolu: ilk genel arayüzün birincil IP'si; yoksa adresi olan ilk arayüzünki.ram(String) API'nin bildirdiği haliyle bellek, örn. "512 MB".ssh_key(String) Sanal makineye eklenen SSH anahtarının adı.status(String) Güncel güç/hazırlama durumu, örn. ACTIVE, SHUTOFF, ERROR.task_state(String) Süren platform görevi; sanal makine kararlı durumdaysa boş.vcpus(Number) Sanal CPU sayısı.volume(List of Object) Önyükleme diski dahil, sanal makineye şu anda bağlı diskler. (bkz. aşağıdaki iç içe şema)
block_device için iç içe şema
Zorunlu:
boot_index(Number) Önyükleme sırası. Önyükleme diski 0'dır. Bu değiştirilirse yeni bir kaynak oluşturulur.delete_on_termination(Boolean) Cihazın sanal makineyle birlikte silinip silinmediği. Bu değiştirilirse yeni bir kaynak oluşturulur.destination_type(String) Şunlardan biri: volume, local. Bu değiştirilirse yeni bir kaynak oluşturulur.device_type(String) Şunlardan biri: cdrom, disk. Bu değiştirilirse yeni bir kaynak oluşturulur.source_type(String) Cihazın nereden geldiği. Şunlardan biri: blank, image, volume, backup. Bu değiştirilirse yeni bir kaynak oluşturulur.volume_size(Number) GB cinsinden boyut (1-8192). Yerinde artırılabilir; azaltma desteklenmez.volume_type(String) Diskin oluşturulduğu depolama politikası / disk tipi. Yerinde değiştirilebilir.
İsteğe Bağlı:
uuid(String) Kaynak imajın, diskin ya da yedeğin kimliği. Boş cihazlar için verilmez. Bu değiştirilirse yeni bir kaynak oluşturulur.
network için iç içe şema
Zorunlu:
uuid(String) Bağlanılacak ağın kimliği. Bu değiştirilirse yeni bir kaynak oluşturulur.
İsteğe Bağlı:
fixed_ip(Block List) Bu arayüzdeki sabit IP'ler. Tek bir adres ayrılması için yazmayın. Yerinde değiştirilebilir. (bkz. aşağıdaki iç içe şema)port_security_enabled(Boolean) Bu arayüze bağlantı noktası güvenliğinin (dolayısıyla güvenlik gruplarının) uygulanıp uygulanmadığı. Varsayılan olarak ağın kendi ayarıdır. Bu değiştirilirse yeni bir kaynak oluşturulur.security_groups(List of String) Bu arayüze bağlı güvenlik grubu kimlikleri. Yerinde değiştirilebilir. Varsayılan olarak projenin varsayılan grubudur.
network.fixed_ip için iç içe şema
İsteğe Bağlı:
ip_address(String) İstenecek belirli adres. Verilmezse platform ayırır; her iki durumda da buraya geri bildirilir.ip_version(Number) IP sürümü, 4 ya da 6. Yazarken yalnızca yol göstericidir: platform bağlı ağdan ayırır; bir adres seçmek için ip_address değerini sabitleyin. Atanan adresten geri bildirilir.
script için iç içe şema
Zorunlu:
os(String) Misafir işletim sistemi ailesi. Şunlardan biri: linux, windows. Bu değiştirilirse yeni bir kaynak oluşturulur.password(String, Sensitive) Misafir hesabı için başlangıç parolası. Bu değiştirilirse yeni bir kaynak oluşturulur.
İsteğe Bağlı:
disable_root(Boolean) Doğrudan root girişini devre dışı bırakır. Linux imajlarında pratikte zorunludur; Windows şablon imajları yok sayar. Bu değiştirilirse yeni bir kaynak oluşturulur.hostname(String) Misafir işletim sistemi içinde ayarlanacak ana bilgisayar adı. Linux imajlarında pratikte zorunludur; Windows şablon imajları yok sayar. Bu değiştirilirse yeni bir kaynak oluşturulur.username(String) Oluşturulacak hesap. Linux imajlarında pratikte zorunludur; Windows şablon imajları yok sayar. Bu değiştirilirse yeni bir kaynak oluşturulur.
timeouts için iç içe şema
İsteğe Bağlı:
create(String)delete(String)update(String)
network_interface için iç içe şema
Salt Okunur:
is_public(Boolean)mac_address(String)network_id(String)network_name(String)port_id(String)primary_ip(String)secondary_ips(List of String)security_groups(List of Object) (bkz. aşağıdaki iç içe şema)spoofing_protection(Boolean)
network_interface.security_groups için iç içe şema
Salt Okunur:
id(String)name(String)
volume için iç içe şema
Salt Okunur:
delete_on_termination(Boolean)id(String)name(String)size(Number)storage_policy(String)
Bilinmesi Gerekenler
- Yerinde değişenler.
name,flavor_id,state,enable_hot_plugve blokların içindenetwork.security_groups,network.fixed_ip,block_device.volume_size(yalnızca artırma) ileblock_device.volume_type. Bütün birnetworkya dablock_devicebloğu eklemek veya kaldırmak,network.uuid,network.port_security_enabled, diğerblock_devicealanları ve önyükleme zamanı argümanları olankey_name,user_data,scriptveis_gpu_imageyeni bir makine oluşturur. - Yeniden boyutlandırma.
enable_hot_plug = trueile flavor, makine çalışmaya devam ederken değişir. Bu olmadan platform çalışan bir makineyi yeniden boyutlandırmayı reddeder; bu yüzden sağlayıcı onu durdurur, yeniden boyutlandırır ve yapılandırılmışstatedurumuna döndürür. Bir planda makineyi kapatıp açan yeniden boyutlandırma,statusdeğerinin de apply sonrasında bilinecek olarak göründüğü plandır ve apply, makinenin yeniden başlatıldığı konusunda uyarır. - Diski büyütmek dosya sistemini büyütmez.
volume_sizearttıktan sonra misafir işletim sistemi içinde bölümü ve dosya sistemini genişletin (growpartveresize2fsya da dosya sisteminizin karşılığı); apply bu konuda uyarır.volume_sizeazaltılamaz. - Misafir işletim sistemi değişen bir
fixed_ip'yi hemen görmez. Adres bağlantı noktasında taşınır, ancak işletim sistemi DHCP kirası yenilenene kadar eski adresi tutar; arayüz statik olarak yapılandırılmışsa kalıcı olarak tutar. Kirayı yenileyin ya da yeniden başlatın; apply bu konuda uyarır. port_security_enabled'ın varsayılanı yoktur. Ayarlanmazsa gönderilmez ve ağ karar verir. Aynı bloktasecurity_groupsayarlıykenfalseolamaz.- Ek diskler boyuta ve depolama politikasına göre eşleştirilir. Önyükleme diskinin dışında platform bir sıra bildirmez; bu yüzden bağlı iki disk aynı göründüğünde bir
block_devicedeğişikliği reddedilir. Bu tür diskleridtcloud_vm_volume_attachmentile yönetin. - Terraform hangi sapmayı görebilir.
name,flavor_id,state,key_name,enable_hot_plug,networkblokları ve herblock_device'ın boyutu, depolama politikası ve makineyle birlikte silinme ayarı geri okunur.user_data,scriptveis_gpu_imagehiçbir uç nokta tarafından bildirilmez, bu yüzden Terraform dışında bunlarda yapılan bir değişiklik görünmez kalır. network_interfacevevolumeson yenilemeden alınmış bir anlık kopyadır. Aynı apply'da başka kaynakların bağladığı arayüzler ve diskler bir sonraki yenilemeden sonra görünür.- Bir kaynak bir makinedir. API tek bir çağrıda birden fazla makine oluşturabilir; bu kaynak bunu sunmaz. Terraform'un
countya dafor_eachözelliğini kullanın.
state, Terraform'un makineyi tuttuğu güç durumudur; bir makine her zaman önce çalışır durumda önyüklenir.
| Başlangıç | Hedef | Sağlayıcının yaptığı |
|---|---|---|
running | stopped | softStop; graceful_shutdown = false ise hardStop |
stopped | running | start |
| herhangi biri | shelved | bilişim kaynaklarını serbest bırakan, makineyi ve disklerini koruyan shelve |
shelved | running | unshelve |
shelved | stopped | unshelve, ardından durdurma |
Zaman Aşımları
create için varsayılan süre 20 dakika, update için 10 dakika, delete için 15 dakikadır. Oluşturma makinenin ACTIVE durumuna gelmesini bekler ve yeniden boyutlandırma makineyi durdurup yeniden başlatır, bu yüzden bir güncelleme birkaç dakika sürebilir. Bunları bir timeouts bloğuyla değiştirin:
resource "dtcloud_vm" "web" {
# ...
timeouts {
create = "30m"
}
}
İçe Aktarma
# user_data, script ve is_gpu_image hiçbir uç nokta tarafından bildirilmez:
# ilk apply'dan önce içe aktarma notlarını okuyun.
terraform import dtcloud_vm.web 4c9a1f37-8d25-4e60-b13f-6a7c2e5b9d88
İçe aktarmada geri okunanlar: name, flavor_id, state, key_name, enable_hot_plug, bir network bloğu olarak her arayüz ve bir block_device bloğu olarak önyükleme diski. Platform bildirmediği için önyükleme diskinin source_type, device_type ve destination_type değerleri tahmin edilir. Geri okunmayanlar: user_data, script, is_gpu_image, graceful_shutdown ve önyüklemeden sonra bağlanan diskler.
user_data, script ve is_gpu_image değiştirilince yeni bir makine gerektirir; bu yüzden yapılandırma bunları ayarlıyorsa içe aktarmadan sonraki ilk plan yeniden oluşturmayı önerir. İçe aktarılan makineyi korumak için bunları yok sayın:
resource "dtcloud_vm" "web" {
# ...
lifecycle {
ignore_changes = [user_data, script, is_gpu_image]
}
}
Bir makineye ek arayüz bağlamadan önce onu içe aktarın. İçe aktarmanın eşleştireceği bloklar yoktur, bu yüzden makinenin sahip olduğu her arayüz bir network bloğu olur. Bunlardan bazıları dtcloud_vm_network_interface kaynaklarına aitse yapılandırma içe aktarılandan daha az blok tanımlar ve ilk plan makineyi yeniden oluşturmayı önerir.