理解并使用Packer模板中的多个构建器

71次阅读
没有评论

问题描述

在使用Packer时,遇到了一个模板中包含多个构建器的问题。他在一个Windows 10的模板中发现了多个floppy_files的引用,但是这些引用都是相同的脚本文件。他想知道为什么会有这样的重复,以及他是否需要将自己的脚本放在每个floppy_files集合中。他希望在进行操作之前能够理解其中的原因。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

问题解析

在这个问题中,用户提到的模板中包含了多个构建器。构建器是用于创建虚拟机或其他类型的构建工件的组件。每个构建器都有自己的参数和配置,以适应不同的虚拟化平台或工具。在这个模板中,有多个构建器,分别用于不同的虚拟化平台,如QEMU、Hyper-V、VMware、VirtualBox和Parallels。

解决方案

根据用户的描述,你只需要关注与你使用的虚拟化平台相关的构建器。在这个模板中,你可以选择使用hyperv-iso构建器,因为你在Hyper-V中创建了一个虚拟机。其他构建器对于不同的虚拟化平台是不需要的。
以下是解决方案的步骤:
1. 打开Packer模板文件。
2. 找到与你使用的虚拟化平台相关的构建器部分。在这个例子中,你应该关注hyperv-iso构建器。
3. 将你自己的PowerShell脚本添加到该构建器的floppy_files集合中。这些脚本将在构建过程中被复制到虚拟机中。
4. 忽略其他构建器的floppy_files集合,因为它们与你的虚拟化平台无关。

以下是一个示例,展示了如何修改Packer模板以适应你的需求:

{
  "builders": [
    {
      "boot_wait": "6m",
      "communicator": "winrm",
      "configuration_version": "8.0",
      "cpus": "2",
      "disk_size": "{{user `disk_size`}}",
      "floppy_files": [
        "{{user `autounattend`}}",
        "./floppy/WindowsPowershell.lnk",
        "./floppy/PinTo10.exe",
        "./scripts/fixnetwork.ps1",
        "./scripts/disable-screensaver.ps1",
        "./scripts/disable-winrm.ps1",
        "./scripts/enable-winrm.ps1",
        "./scripts/microsoft-updates.bat",
        "./scripts/win-updates.ps1"
      ],
      "guest_additions_mode": "none",
      "iso_checksum": "{{user `iso_checksum`}}",
      "iso_url": "{{user `iso_url`}}",
      "memory": "{{user `memory`}}",
      "shutdown_command": "shutdown /s /t 10 /f /d p:4:1 /c \"Packer Shutdown\"",
      "switch_name": "{{user `switch_name`}}",
      "type": "hyperv-iso",
      "vm_name": "{{user `vm_name`}}",
      "winrm_password": "vagrant",
      "winrm_timeout": "{{user `winrm_timeout`}}",
      "winrm_username": "vagrant"
    }
  ],
  "post-processors": [
    {
      "keep_input_artifact": false,
      "output": "windows_10_{{.Provider}}.box",
      "type": "vagrant",
      "vagrantfile_template": "vagrantfile-windows_10.template"
    }
  ],
  "provisioners": [
    {
      "execute_command": "{{ .Vars }} cmd /c \"{{ .Path }}\"",
      "remote_path": "/tmp/script.bat",
      "scripts": [
        "./scripts/enable-rdp.bat"
      ],
      "type": "windows-shell"
    },
    {
      "scripts": [
        "./scripts/vm-guest-tools.ps1",
        "./scripts/debloat-windows.ps1"
      ],
      "type": "powershell"
    },
    {
      "restart_timeout": "{{user `restart_timeout`}}",
      "type": "windows-restart"
    },
    {
      "scripts": [
        "./scripts/set-powerplan.ps1",
        "./scripts/docker/disable-windows-defender.ps1"
      ],
      "type": "powershell"
    },
    {
      "execute_command": "{{ .Vars }} cmd /c \"{{ .Path }}\"",
      "remote_path": "/tmp/script.bat",
      "scripts": [
        "./scripts/pin-powershell.bat",
        "./scripts/compile-dotnet-assemblies.bat",
        "./scripts/set-winrm-automatic.bat",
        "./scripts/uac-enable.bat",
        "./scripts/dis-updates.bat",
        "./scripts/compact.bat"
      ],
      "type": "windows-shell"
    }
  ],
  "variables": {
    "autounattend": "./answer_files/10/Autounattend.xml",
    "disk_size": "61440",
    "disk_type_id": "1",
    "memory": "2048",
    "headless": "false",
    "iso_checksum": "sha256:668fe1af70c2f7416328aee3a0bb066b12dc6bbd2576f40f812b95741e18bc3a",
    "iso_url": "https://software-download.microsoft.com/download/sg/17763.107.101029-1455.rs5_release_svc_refresh_CLIENT_LTSC_EVAL_x64FRE_en-us.iso",
    "restart_timeout": "5m",
    "vhv_enable": "false",
    "virtio_win_iso": "~/virtio-win.iso",
    "vm_name": "windows_10_pos",
    "winrm_timeout": "6h",
    "vmx_version": "14"
  }
}

在上面的示例中,我们只保留了与hyperv-iso构建器相关的部分,并将你自己的脚本添加到了floppy_files集合中。你可以根据自己的需求进行修改。

希望这个解决方案能帮助到你!如果你有任何其他问题,请随时提问。

正文完