问题描述
在使用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
集合中。你可以根据自己的需求进行修改。
希望这个解决方案能帮助到你!如果你有任何其他问题,请随时提问。