在同一资源组中创建两个 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 + 1nameapplication 标签。

【讨论】:

好吧,我明白你在说什么。我刚刚尝试了 count 属性,但这并不是我想要的。但是,我知道 Terraform 不是为了以这种方式使用而构建的。

以上是关于在同一资源组中创建两个 VM,但 Terraform 不希望销毁第一个的主要内容,如果未能解决你的问题,请参考以下文章

将 Azure VM 移动到新资源组后的备份问题

创建没有标记的资源组时 Azure Policy 的奇怪行为

在OpenStack环境中创建一个VM实例

在现有订阅和资源组的现有函数应用中创建 Azure 函数

微软azure云计算在门户中创建 Windows 虚拟机部署web网站

无法在 Kubernetes 集群中执行 GitLab Runner:无法在命名空间“gitlab”中的 API 组“”中创建资源“秘密”