我正在尝试通过 packer 配置 Ubuntu 20.04,并尝试使用 packer 的 http 服务器来提供 cloud-init 配置。在 Ubuntu 18.04 上,我可以通过使用 di(debian-installer)预先设置 ip 来实现这一点,但同时这似乎已经过时了,但我不知道如何对 Ubuntu 20 执行相同的操作。据我所知,Ubuntu 20.04 可以使用 dhcp,但我有兴趣分配一个静态 IP,以便 VM 可以连接到 http 服务器。有什么想法可以实现这一点吗?或者方法可能是错误的?
这是打包程序在启动过程中(实际安装程序之前)运行的内容:
"/casper/vmlinuz/ ",
"initrd=/casper/initrd debug= ",
"autoinstall ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ ",
"--- <enter>"
操作系统在“主机和网络名称查找”目标处冻结(就在 cloud-init 加载/初始化之前)。这是 cloud-init 的内容:
#cloud-config
autoinstall:
version: 1
locale: en_US
keyboard:
layout: fr
ssh:
install-server: true
allow-pw: true
packages:
- qemu-guest-agent
storage:
layout:
name: direct
swap:
size: 0
user-data:
package_upgrade: true
timezone: Europe/Paris
users:
- name: username
passwd: $6$xyz$1D0kz5pThgRWqxWw6JaZy.6FdkUCSRndc/PMtDr7hMK5mSw7ysChRdlbhkX83PBbNBpqXqef3sBkqGw3Rahs..
groups: [adm, cdrom, dip, plugdev, lxd, sudo]
lock-passwd: false
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJEXrziuUOCpWPvwOsGuF4K+aq1ufToGMi4ra/1omOZb
(密码哈希值在互联网上公开,请不要讨论:))
实际上,这与打包程序没有严格关系。我只是想知道如何确保 Ubuntu 20.04 安装可以远程连接到 Web 服务器以检索 cloud-init 配置。基本上就是这样 :)
谢谢!我的设置是 proxmox 6.4-9、packer 1.7.4(在 apple m1 上运行)和 Ubuntu 20.04.3
我随后将其添加到内核命令行:
ip=10.88.88.159:10.88.88.126:255.255.255.0::eth0:off autoinstall ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/
我使用eth0
,因为这似乎是接口在更改为 之前的名称ens18
。但是,安装程序一直抱怨说它无法识别该设备。当然,我尝试了这两个名字,但都无济于事。
答案1
ip=
我通过在内核命令行中添加指令解决了这个问题。boot_command
现在看起来是这样的:
"boot_command": [
"<esc><enter><f6><esc><wait> ",
"<bs><bs><bs><bs><bs>",
"ip={{ user `vm_ip` }}::{{ user `vm_gateway` }}:{{ user `vm_netmask` }}::::{{ user `vm_dns` }} ",
"autoinstall ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ ",
"--- <enter>"
]
语法如下:
client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:
<dns0-ip>:<dns1-ip>:<ntp0-ip>:...
参考: https://git.kernel.org/pub/scm/libs/klibc/klibc.git/tree/usr/kinit/ipconfig/README.ipconfig
因此我跳过了以下内容:server-ip(用于 nfs - 不需要),然后是主机名、设备(即网络接口 - 不需要它,它只会导致我更加困惑)和 autoconf,我在网关的网络掩码后添加了 dns0。例如:
ip=192.168.0.20::192.168.0.1:255.255.255.0::::8.8.8.8
因此,对于任何感兴趣的人来说,完整的命令将是(虚拟 IP):
initrd=/casper/initrd quiet ip=192.168.0.20::192.168.0.1:255.255.255.0::::8.8.8.8 autoinstall ds=nocloud-net;s=http://192.168.0.50:80 ---
---
很重要,因为之后写入的任何内容都会保留在 proc 命令行 ( /proc/cmdline
) 中,因此这意味着它将在启动时反复运行。您可能不想对自动安装和网络配置执行此操作(无论如何,它将自动复制到 cloud-init 中,因此无论如何都会保留)。
也许这会对某些人有所帮助。我自己还有很多事情需要了解 :)
更新:
对于 Ubuntu,22.04
我已经更新了 boot_command,如下所示:
"boot_command": [
"<e><bs><down><down><down>",
"<right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right><right>",
"<spacebar>",
"ip={{ user `vm_ip` }}::{{ user `vm_gateway` }}:{{ user `vm_netmask` }}::::{{ user `vm_dns` }} ",
"autoinstall 'ds=nocloud-net;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/' ",
"<F10>"
]
主要的区别在于我将其放在ds=nocloud...
引号中并且直接编辑 grub 配置(所以这是一种略有不同的方法。乍一看,F6 似乎不起作用,所以我根本没有进一步理会)。