在同一资源组中创建两个 VM,但 Terraform 不希望销毁第一个
Posted
技术标签:
【中文标题】在同一资源组中创建两个 VM,但 Terraform 不希望销毁第一个【英文标题】:Creating two VMs in the same resource group without Terraform wanting to destoy the first one 【发布时间】:2019-09-24 22:58:08 【问题描述】:我正在尝试使用 Terraform 将同一资源组中的两个虚拟机部署到我们的 Azure 平台。在成功创建第一个之后,Terraform 想要销毁第一个以在我更改了第二个 VM 名称和 Azure 标记后创建第二个。
我一直在关注 Terraform 指南:https://www.terraform.io/docs/providers/azurerm/r/virtual_machine.html
resource "azurerm_virtual_machine" "main"
location = "$var.location"
name = "$var.vm_name"
network_interface_ids = ["$azurerm_network_interface.main.id"]
resource_group_name = "$var.resourcegroup_vm"
vm_size = "$var.vm_size"
tags
application = "$var.tag"
我希望 Terraform 在更改其变量名称和标签后创建第二个 VM。不想因为名称和标签的变化而破坏第一个。
【问题讨论】:
我认为您需要复制代码或使用迭代才能使其工作。或将此代码复制到一个新文件夹并在该文件夹中启动一个新的 terraform“项目” @4c74356b41 - 是的,如果我只是将代码复制到一个带有辅助 VM 的名称 + 标记的新项目中,它可能会起作用,但如果你可以使用相同的项目,它会容易得多创建多个名称更改的虚拟机。 @4c74356b41 - 从新项目部署第二个虚拟机时它工作正常。但是我仍然有兴趣知道是否可以在同一个项目中做。将多个 VM 部署到同一个资源组时更容易。 如果要在同一个项目中创建多个vm,只需在vm块中设置count即可。 【参考方案1】:Terraform 基于 HCL(Hashicorp 配置语言),这是编写 *.tf
文件的格式。它是一种声明性语言(与命令式相反),这意味着您可以描述您希望基础架构所需的状态to be 和 Terraform 将弄清楚需要进行哪些更改才能达到这一点。
如果您先创建一个实例,然后更改其名称,您就是在告诉 Terraform 您不再希望您的实例使用旧名称而是新名称。
要部署多个实例,您可以使用the count attribute。然后,您可以使用插值来获取基于计数器的名称和标签,类似于以下内容:
resource "azurerm_virtual_machine" "main"
location = "$var.location"
name = "$var.vm_name-$count.index + 1"
network_interface_ids = ["$azurerm_network_interface.main.id"]
resource_group_name = "$var.resourcegroup_vm"
vm_size = "$var.vm_size"
tags
application = "$var.tag-$count.index + 1"
count = 2
注意附加的-$count.index + 1
到name
和application
标签。
【讨论】:
好吧,我明白你在说什么。我刚刚尝试了 count 属性,但这并不是我想要的。但是,我知道 Terraform 不是为了以这种方式使用而构建的。以上是关于在同一资源组中创建两个 VM,但 Terraform 不希望销毁第一个的主要内容,如果未能解决你的问题,请参考以下文章
创建没有标记的资源组时 Azure Policy 的奇怪行为
微软azure云计算在门户中创建 Windows 虚拟机部署web网站
无法在 Kubernetes 集群中执行 GitLab Runner:无法在命名空间“gitlab”中的 API 组“”中创建资源“秘密”