在安装期间为 ubuntu 20.04 分配 ip(packer/cloud-init 上下文)

在安装期间为 ubuntu 20.04 分配 ip(packer/cloud-init 上下文)

我正在尝试通过 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 似乎不起作用,所以我根本没有进一步理会)。

相关内容