Terraform 从 Packer 中制作的托管磁盘镜像创建 VM

标签 terraform packer terraform-provider-azure

我已经使用 Packer 创建了一个自定义 VM 镜像,现在我正在尝试使用 Terraform 基于此镜像创建一个新 VM,但我对如何设置我的 .TF 文件感到困惑。我可以创建其余的基础设施。

我想我的 packer json 文件创建了一个托管磁盘镜像,但我不确定如何设置它,也找不到在线示例。

我对基础架构即代码和一般的 Azure ecco 系统还很陌生

主要.tf

    resource "azurerm_managed_disk" "managedDisk" {
  name                 = "managed_disk_test1"
  location             = "northeurope"
  resource_group_name  = "${azurerm_resource_group.packer.name}"
  storage_account_type = "Standard_LRS"
  create_option        = "FromImage"
  image_reference_id   = "/subscriptions/33efe2dc-e7a0-4fb8-827d-8be939879420/resourceGroups/packerRG/providers/Microsoft.Compute/images/myPackerImage"
  disk_size_gb         = "1"
}


resource "azurerm_virtual_machine" "PackerVm_TEST" {
    name =  "${var.hostname}"
    location = "northeurope"
    resource_group_name   = "${azurerm_resource_group.packer.name}"
network_interface_ids = ["${azurerm_network_interface.packerNetInt_Test.id}"]
    vm_size = "Standard_D2s_v3"


    storage_os_disk {
        name            = "FromPackerImageOsDisk"
        managed_disk_type = "Standard_LRS"
        caching           = "ReadWrite"
        create_option     = "FromImage"
    }

        os_profile {
            computer_name  = "PackerVmTEST"
            admin_username = "packermakeradmin1"
            admin_password = "RMKRTest123"
          }
            os_profile_windows_config {
                enable_automatic_upgrades = "true"
                provision_vm_agent ="true"
            }

}

打包器.json

{
  "builders": [{
    "type": "azure-arm",

    "client_id": "",
    "client_secret": "",
    "tenant_id": "",
    "subscription_id": "",
    "object_id": "",

    "managed_image_resource_group_name": "packerRG",
    "managed_image_name": "myPackerImage",

    "os_type": "Windows",
    "image_publisher": "MicrosoftWindowsServer",
    "image_offer": "WindowsServer",
    "image_sku": "2016-Datacenter",

    "communicator": "winrm",
    "winrm_use_ssl": "true",
    "winrm_insecure": "true",
    "winrm_timeout": "3m",
    "winrm_username": "packer",

    "azure_tags": {
        "dept": "Engineering",
        "task": "Image deployment"
    },

    "location": "northeurope",
    "vm_size": "Standard_DS2_v2"
  }],
  "provisioners": [{
    "type": "powershell",
    "inline": [
      "Add-WindowsFeature Web-Server",
      "if( Test-Path $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml ){ rm $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml -Force}",
      "& $Env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /shutdown /quiet"
    ]
  }]
}

运行 terraform apply 时的输出

* azurerm_virtual_machine.PackerVm_TEST: compute.VirtualMachinesClient#CreateOrUpdate: Failure responding to request: StatusCode=400 -- Original Error: autorest/azure: Service returned an error. Status=400 Code="InvalidParameter" Message="Cannot specify user ima
ge overrides for a disk already defined in the specified image reference."

最佳答案

有两种方法可以将托管磁盘附加到 VM。

要么删除 azure_managed_disk 资源并在 azurerm_virtual_machine 资源中指定图像引用。托管磁盘将自动创建并附加到 VM。

resource "azurerm_virtual_machine" "PackerVm_TEST" {
name =  "${var.hostname}"
location = "northeurope"
resource_group_name   = "${azurerm_resource_group.packer.name}"
network_interface_ids = ["${azurerm_network_interface.packerNetInt_Test.id}"]
vm_size = "Standard_D2s_v3"

storage_os_disk {
    name            = "FromPackerImageOsDisk"
    managed_disk_type = "Standard_LRS"
    caching           = "ReadWrite"
    create_option     = "FromImage"
}
storage_image_reference {
    id = "/subscriptions/33efe2dc-e7a0-4fb8-827d-8be939879420/resourceGroups/packerRG/providers/Microsoft.Compute/images/myPackerImage"
}

os_profile {
    computer_name  = "PackerVmTEST"
    admin_username = "packermakeradmin1"
    admin_password = "RMKRTest123"
  }
os_profile_windows_config {
    enable_automatic_upgrades = "true"
    provision_vm_agent ="true"
}

或者在 azurerm_virtual_machine 资源中添加托管磁盘 ID。

resource "azurerm_managed_disk" "managedDisk" {
  name                 = "managed_disk_test1"
  location             = "northeurope"
  resource_group_name  = "${azurerm_resource_group.packer.name}"
  storage_account_type = "Standard_LRS"
  create_option        = "FromImage"
  image_reference_id   = "/subscriptions/33efe2dc-e7a0-4fb8-827d-8be939879420/resourceGroups/packerRG/providers/Microsoft.Compute/images/myPackerImage"
  disk_size_gb         = "1"
}

resource "azurerm_virtual_machine" "PackerVm_TEST" {
    name =  "${var.hostname}"
    location = "northeurope"
    resource_group_name   = "${azurerm_resource_group.packer.name}"
    network_interface_ids = ["${azurerm_network_interface.packerNetInt_Test.id}"]
    vm_size = "Standard_D2s_v3"

    storage_os_disk {
        name            = "FromPackerImageOsDisk"
        managed_disk_id = "${azurerm_managed_disk.managedDisk.id}"
        managed_disk_type = "Standard_LRS"
        caching           = "ReadWrite"
        create_option     = "Attach"
    }
    os_profile {
        computer_name  = "PackerVmTEST"
        admin_username = "packermakeradmin1"
        admin_password = "RMKRTest123"
      }
    os_profile_windows_config {
        enable_automatic_upgrades = "true"
        provision_vm_agent ="true"
    }
}

来自地形文档

managed_disk_id - (Optional) Specifies an existing managed disk to use by id. Can only be used when create_option is Attach.

关于Terraform 从 Packer 中制作的托管磁盘镜像创建 VM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48079735/

相关文章:

lambda - Terraform cloudwatch 保留逻辑

azure - 如何使用 Azure 中的 Terraform 创建具有多个协议(protocol)的安全规则?

amazon-web-services - Terraform 错误创建子网依赖

jenkins - Packer、Jenkins、Cloudformation,如何让他们协同工作?

continuous-integration - Packer 不会在 GCloud 上创建镜像

postgresql - 如何从 terraform 中 Azure 托管 PostgreSQL 的现有备份文件恢复数据库?

terraform - 在 terraform 变量中设置多行值

docker - 通过 packer 构建 docker 容器并通过 chef-solo 进行配置在启动服务时失败

azure - Terraform 如何跳过 1 个工作区的参数

azure - Azure Databricks 和 Terraform 出现错误