【发布时间】:2021-12-03 20:11:55
【问题描述】:
我正在尝试使用 for_each 循环在 Azure 中创建多个 VM。假设 VM 1-100。但是,会有删除请求,即 VM 编号 50。
我有两个问题:
terraform_azure> terraform state list
module.edit_vms.azurerm_linux_virtual_machine.test_seat["test-vm-1"]
terraform state rm module.edit_vms.azurerm_linux_virtual_machine.test_seat["test-vm-1"]
zsh: no matches found: module.edit_vms.azurerm_linux_virtual_machine.test_seat[test-vm-1]
-
当我尝试从 Terraform 状态删除 VM 50 时,出现上述错误。我不明白为什么在 terraform state list 命令下列出资源时没有找到匹配项
-
有没有办法删除 50 号 VM 并将 VM 计数设置为 1 -> 101 并防止 terraform 重新创建 50 号 VM?如果从状态文件中删除虚拟机不是一个好习惯,那么如果我可以在代码中指定我希望它被销毁并且在将来应用时不重新创建会更好。
这是我的变量.tf
variable "edit_seat_spec" {
description = "VM details"
type = list
default = [{
resource_group_name = "my_rg"
server_name = "test-vm"
server_size = "Standard_B2s"
location = "East US"
vnet = "test_vnet"
subnet_name = "default"
username = "username"
password = "password"
vm_count = "4"
}]
}
还有main.tf
locals{
edit_seat = [
for edit in var.edit_seat_spec : [
for i in range(1, edit.vm_count) : {
name = "${edit.server_name}-${i}"
resource_group = edit.resource_group_name
vnet = edit.vnet
nic = "${edit.server_name}-${i}-nic"
location = edit.location
subnet_name = edit.subnet_name
size = edit.server_size
admin_username = edit.username
admin_password = edit.password
}
]
]
}
locals {
edit_vm = flatten(local.edit_seat)
}
resource "azurerm_linux_virtual_machine" "vm" {
for_each = {for edit in local.edit_vm: edit.name => edit}
name = each.value.name
resource_group_name = each.value.resource_group
location = each.value.location
size = each.value.size
admin_username = each.value.admin_username
admin_password = each.value.admin_password
disable_password_authentication = false
network_interface_ids = [azurerm_network_interface.edit_seat_nic[each.key].id]
os_disk {
caching = "ReadWrite"
storage_account_type = "Standard_LRS"
}
source_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04-LTS"
version = "latest"
}
}
【问题讨论】: