使用Packer Hyper-V构建器创建Ubuntu镜像时无法获取SSH地址
问题场景:用Packer的Hyper-V构建器创建Ubuntu 22.04服务器镜像,虚拟机安装完成后已获取IP且可手动SSH连接,但Packer始终无法发现SSH地址,日志显示Skipping mounting Integration Services Setup Disk。
核心原因
Packer默认依赖Hyper-V集成服务(尤其是Guest Service Interface)通过Hyper-V API获取虚拟机IP地址。虽然Ubuntu 22.04默认包含Hyper-V集成服务组件,但如果Packer配置未启用集成服务、或安装过程中组件未正确加载,会导致Packer无法通过API获取IP。
具体解决步骤
启用Hyper-V集成服务配置
在Packer的hyperv-iso构建器块中添加集成服务列表,强制挂载集成服务盘:source "hyperv-iso" "ubuntu" { # 其他原有配置... integration_services = ["GuestServiceInterface", "Heartbeat", "Key-ValuePairExchange", "Shutdown", "TimeSynchronization", "VSS"] mount_integration_services_disk = true }其中
mount_integration_services_disk = true会覆盖默认跳过逻辑,确保Hyper-V集成服务盘被挂载,帮助系统识别并加载服务。确保Ubuntu安装Hyper-V工具包
在Ubuntu的autoinstall配置(通常是user-data文件)的packages段中添加必要工具包,保证集成服务组件完整:packages: - linux-tools-virtual - linux-cloud-tools-virtual配置Packer备选IP探测方式
如果Hyper-V API仍无法获取IP,让Packer扫描子网探测SSH端口,补充以下配置:source "hyperv-iso" "ubuntu" { # 其他原有配置... communicator = "ssh" ssh_timeout = "20m" ip_wait_timeout = "20m" ip_wait_address_timeout = "5m" ssh_pty = true }检查虚拟交换机配置
确保Hyper-V使用的虚拟交换机是外部交换机(与主机同网段),私有交换机可能导致Packer无法跨网段访问虚拟机。若使用内部交换机,需确保主机和虚拟机在同一子网且路由正常。
相关日志参考
==> hyperv-iso: Starting HTTP server on port 8882
==> hyperv-iso: Creating switch 'public' if required...
==> hyperv-iso: switch 'public' already exists. Will not delete on cleanup...
==> hyperv-iso: Creating virtual machine...
2022/12/12 20:01:40 packer.exe plugin: No existing virtual harddrive, not attaching.
==> hyperv-iso: Enabling Integration Service...
==> hyperv-iso: Mounting os dvd drive C:/Tools/ubuntu_server.iso ...
2022/12/12 20:01:50 packer.exe plugin: No floppy disk, not attaching.
==> hyperv-iso: Skipping mounting Integration Services Setup Disk...
2022/12/12 20:01:50 packer.exe plugin: No CD files specified. CD disk will not be made.
==> hyperv-iso: Mounting secondary DVD images...
==> hyperv-iso: Configuring vlan...
==> hyperv-iso: Determine Host IP for HyperV machine...
==> hyperv-iso: Host IP for the HyperV machine: 192.168.1.111
==> hyperv-iso: Attempting to connect with vmconnect...
==> hyperv-iso: Starting the virtual machine...
==> hyperv-iso: Waiting 10s for boot...
==> hyperv-iso: Typing the boot command...
............................. (removed the boot command).........................
2022/12/12 20:02:17 packer.exe plugin: [DEBUG] Unable to get address during connection step: No ip address.
==> hyperv-iso: Waiting for SSH to become available...
2022/12/12 20:02:17 packer.exe plugin: [INFO] Waiting for SSH, up to timeout: 20m0s
2022/12/12 20:02:22 packer.exe plugin: [DEBUG] Error getting SSH address: No ip address.
内容的提问来源于stack exchange,提问作者user2782999

