Terraform 从 Packer 中创建的托管磁盘映像创建 VM

2023-12-03

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

我认为我的打包器 json 文件创建了一个托管磁盘映像,但我不确定如何设置它,并且无法在网上找到示例。

我对基础架构即代码和 Azure 生态系统总体来说还很陌生

main.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"
    }
}

来自 terraform 文档

Managed_disk_id -(可选)指定要按 id 使用的现有托管磁盘。仅当 create_option 为 Attach 时才能使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Terraform 从 Packer 中创建的托管磁盘映像创建 VM 的相关文章

随机推荐

  • 在 Nitrous.IO 上使用 Django 和 Flask

    目录 入门 使用 Virtualenv 设置 Python 2 7 安装Django 安装烧瓶 这是我们的朋友 Greg McKeever 的客座帖子亚硝酸盐 Nitrous IO 是一个允许您在云中快速启动自己的开发环境的平台 以下是在上
  • Python 基础知识:字符串和字符串方法(概述)

    许多程序员 无论其专业如何 都会在计算机上处 理文本 每日基础 例如 网络开发人员使用来自以下位置的文本输入 网络表格 数据科学家处理文本以提取数据并执行 诸如情感分析之类的任务 可以帮助识别和分类 文本正文中的意见 Python 中的文本
  • Python 中的函数式编程:何时以及如何使用它

    目录 什么是函数式编程 Python 对函数式编程的支持程度如何 使用 lambda 定义匿名函数 Applying a Function to an Iterable With map 使用单个可迭代对象调用 map 使用多个可迭代对象调
  • 教材:书面教程

    在本视频中 您将了解如何访问 Real Python 上的另一种类型的学习资源 基于文本的教程 您将了解在哪里可以找到我们编写的 Python 教程 如何访问额外资源 例如代码示例和可下载指南 等等 重要链接 教程概述页面 教程主题页面
  • Jupyter Notebook:简介

    目录 Getting Up and Running With Jupyter Notebook 安装 启动 Jupyter Notebook 服务器 Creating a Notebook 命名 运行细胞 菜单 启动终端和其他东西 查看正在
  • 如何将一个字符串哈希为8位数字?

    无论如何 我可以将随机字符串哈希为 8 位数字 而无需自己实现任何算法吗 是的 您可以使用内置的hashlib模块或内置hash功能 然后 对哈希的整数形式使用模运算或字符串切片运算截取最后八位数字 gt gt gt s she sells
  • $_SERVER["HTTP_REFERER"] 无法在 Mozilla 上运行

    我开发了一个简单的模态框并添加了 SERVER HTTP REFERER 所以从特定的引荐来源网址到不会出现 它工作正常 但是 SERVER HTTP REFERER 不适用于 Mozilla 还有其他方法可以做到这一点吗 我正在使用简单的
  • 读取输入后隐藏控制台窗口

    我有一个带有 GUI 的脚本 它获取用户数据并将其存储到文本文件中 它运行另一个脚本 exe 等待用户输入 然后执行一些工作 我想要的是后一个脚本在读取用户的输入后隐藏其控制台窗口 但继续在后台工作 我尝试运行该脚本subprocess c
  • 基于另一列值的一列的累积和 (R)

    我有一个包含 2 列的数据框 如下所示 gt data frame x 1 10 y c 0 0 0 1 1 0 0 1 0 1 x y 1 1 0 2 2 0 3 3 0 4 4 1 5 5 1 6 6 0 7 7 0 8 8 1 9 9
  • 存储信用卡详细信息

    我的业务要求迫使我在短时间内存储客户的完整信用卡详细信息 号码 姓名 到期日 CVV2 理由 如果客户打电话订购产品 而他们的信用卡当场被拒绝 您很可能会失去销售机会 如果您获取他们的详细信息 感谢他们的交易 然后发现该卡被拒绝 您可以给他
  • 如何搜索可用的 RFC 功能模块和表

    我必须承认我不是 SAP R 3 编程方面的专家 所以这更多的是关于这个问题的基本问题 有没有办法获取 SAP 系统上可访问的 RFC 模块和 或表的列表 在互联网上的许多示例中 我发现一个 RFC 模块似乎在每个 SAP 系统上都可用 S
  • 查找所有重叠区间的计数

    我有所有记录的开始时间和结束时间 如下所示 startTime 21345678 endTime 31345678 我正在尝试查找所有冲突的数量 例如 如果有两条记录并且它们重叠 则冲突数为 1 如果有 3 个记录 其中两条重叠 则冲突为
  • 禁用按钮/禁用选项菜单的 tkinter 颜色

    我正在为 Unity Ubuntu 开发一个快速列表编辑器 初始 界面包含禁用的选项菜单按钮 右下的 和编辑按钮 右上角 和禁用的 正常 按钮 然而 tkinter 并不同等对待这两种禁用图标 禁用的选项菜单图标比 正常 禁用按钮图标稍暗
  • 如何标记视频播放器以从其他应用程序打开视频文件?

    我写了一个视频播放器 想知道 当您从其他应用程序 例如文件浏览器 单击视频文件时 会出现可以打开该视频文件的应用程序列表 如何让我的玩家也出现在该列表中 Thanks 您必须注册Intent你想要在你的活动中 从 API 15 开始 您需要
  • Xcode PhoneGap navigator.connection 未定义

    尝试将我的 PhoneGap javascript 代码移植到 Xcode 中以便在 iOS 中进行调试 使用 Cordova 3 0 0 当我打电话时 navigator connection type 我收到 navigator con
  • 在哪里可以获得 BERT 的预训练词嵌入?

    我知道 BERT 的总词汇量为 30522 其中包含一些单词和子词 我想获得 BERT 的初始输入嵌入 所以 我的要求是获得尺寸表 30522 768 我可以通过 token id 进行索引来获取其嵌入 我在哪里可以得到这张桌子 BertM
  • gl_PointSize、gl_Position、gl_FragCoord之间的关系

    例子 VS 着色器 void main gl Position vec4 0 0 0 1 gl PointSize 100 0 画布为 1x5 像素 宽度 高度 片段着色器使用 gl FragCoord 这 5 个像素的 gl FragCo
  • 从活动类中打开 Android 导航抽屉

    我正在开发安卓系统Navigation Drawer通过他们的文档看起来 抽屉只能扩展 Fragment Activity 因此要从我的所有活动中打开抽屉 我需要将我的所有活动变成一个片段 这不是一个可行的解决方案 有没有办法打开一个从 A
  • 如何在删除 SQLite 数据库中的行后更新 KEY_ROWID

    从数据库中删除一行后 如何更新 SQLite 数据库中的 KEY ROWID 编号 情况1 例如 如果我的数据库中有五行 则此时 KEY ROWID 的最大值为 5 我删除表中的所有行 然后我添加新行 此时KEY ROWID不再从1开始 它
  • Terraform 从 Packer 中创建的托管磁盘映像创建 VM

    我已经使用 Packer 创建了一个自定义 VM 映像 现在我尝试使用 Terraform 基于此映像创建一个新 VM 但我对如何设置 TF 文件感到困惑 我可以创建其余的基础设施 我认为我的打包器 json 文件创建了一个托管磁盘映像 但