Autoinstaller 和 cloud-init 的几个问题

Autoinstaller 和 cloud-init 的几个问题

我来自 debian-installer,现在尝试使用 Ubuntu 20.04 设置一个新服务器和虚拟机的通用安装环境,并且发现 debian-installer (di) 已被弃用并且不再受支持,我已经开始处理自动安装和 cloud-init,但仍然遇到一些困难。

安装服务器并从 /var/log/installer 复制安装文件并稍加调整后,我可以建立一个非常原始的系统,但仍然缺少以下内容,我可以轻松地用 di 完成。

所以我到目前为止所做的是:使用 Apache2 设置 tftp,以便我可以提供 PXE 映像和 cloud-init 用户数据。

cat /srv/tftp/pxelinux.cfg/default
DEFAULT vesamenu.c32
TIMEOUT 100
ONTIMEOUT local
PROMPT 0

NOESCAPE 1

LABEL local
        MENU DEFAULT
        MENU LABEL boot-from-local-disk
        LOCALBOOT 0

LABEL focal-live-install
        MENU label Install focal
        KERNEL vmlinuz
        INITRD initrd
        APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://172.16.16.41/tftp/ubuntu-20.04.1-live-server-amd64.iso

LABEL focal-live-install-autoinstall
        MENU label Install focal - autoinstall
        KERNEL vmlinuz
        INITRD initrd
        APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://172.16.16.41/tftp/ubuntu-20.04.1-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://172.16.16.41/tftp/cloud-init/
cat /etc/apache2/conf-enabled/tftp.conf
<Directory /srv/tftp>
        Options +FollowSymLinks +Indexes
        Require all granted
</Directory>
Alias /tftp /srv/tftp
cat /srv/tftp/cloud-init/user-data
#cloud-config
autoinstall:
  apt:
    geoip: true
    preserve_sources_list: false
    primary:
    - arches: [amd64, i386]
      uri: http://de.archive.ubuntu.com/ubuntu
    - arches: [default]
      uri: http://ports.ubuntu.com/ubuntu-ports
  identity: {hostname: localhost, password: <>,
    realname: ka_de_ae, username: ka_de_ae}
  keyboard: {layout: de, toggle: null, variant: ''}
  locale: en_GB
  network:
    ethernets:
      enp3s0: {dhcp4: true}
    version: 2
  ssh:
    allow-pw: true
    authorized-keys: []
    install-server: true
  user-data:
    disable_root: false
    chpasswd:
      root:<>
  storage:
    config:
    - {ptable: gpt, path: /dev/sda, wipe: superblock-recursive, preserve: false, name: '', grub_device: true, type: disk, id: disk-sda}
    - {device: disk-sda, size: 1048576, flag: bios_grub, number: 1, preserve: false,
      grub_device: false, type: partition, id: partition-sda1}
    - {device: disk-sda, size: 2147483648, wipe: superblock, flag: linux, number: 2,
      preserve: false, grub_device: false, type: partition, id: partition-sda2}
    - {fstype: ext4, volume: partition-sda2, preserve: false, type: format, id: format-0}
    - {device: disk-sda, size: -1, wipe: superblock, flag: linux, number: 3,
      preserve: false, grub_device: false, type: partition, id: partition-sda3}
    - name: vg0
      devices: [partition-sda3]
      preserve: false
      type: lvm_volgroup
      id: lvm_volgroup-0
    - {name: root, volgroup: lvm_volgroup-0, size: 5368709120B, preserve: false, type: lvm_partition,
      id: lvm_partition-0}
    - {fstype: ext4, volume: lvm_partition-0, preserve: false, type: format, id: format-1}
    - {device: format-1, path: /, type: mount, id: mount-1}
    - {name: swap, volgroup: lvm_volgroup-0, size: 4294967296B, preserve: false, type: lvm_partition,
      id: lvm_partition-1}
    - {fstype: swap, volume: lvm_partition-1, preserve: false, type: format, id: format-2}
    - {device: format-2, path: '', type: mount, id: mount-2}
    - {name: tmp, volgroup: lvm_volgroup-0, size: 4294967296B, preserve: false, type: lvm_partition,
      id: lvm_partition-2}
    - {fstype: ext4, volume: lvm_partition-2, preserve: false, type: format, id: format-3}
    - {device: format-3, path: /tmp, type: mount, id: mount-3}
    - {name: usr, volgroup: lvm_volgroup-0, size: 16106127360B, preserve: false, type: lvm_partition,
      id: lvm_partition-3}
    - {fstype: ext4, volume: lvm_partition-3, preserve: false, type: format, id: format-4}
    - {device: format-4, path: /usr, type: mount, id: mount-4}
    - {name: var, volgroup: lvm_volgroup-0, size: 10737418240B, preserve: false, type: lvm_partition,
      id: lvm_partition-4}
    - {fstype: ext4, volume: lvm_partition-4, preserve: false, type: format, id: format-5}
    - {device: format-5, path: /var, type: mount, id: mount-5}
    - {name: varlog, volgroup: lvm_volgroup-0, size: 4294967296B, preserve: false,
      type: lvm_partition, id: lvm_partition-5}
    - {fstype: ext4, volume: lvm_partition-5, preserve: false, type: format, id: format-6}
    - {device: format-6, path: /var/log, type: mount, id: mount-6}
    - {device: format-0, path: /boot, type: mount, id: mount-0}
    swap: {swap: 0}
  version: 1
  users:
    - name: ka_de_ae
      shell: /bin/bash
      ssh-authorized-keys:
        - ssh-rsa <key + comment>
        - ssh-rsa <key + comment>
        - ssh-rsa <key + comment>
        - ssh-rsa <key + comment>
  runcmd:
    - sed -i -e '/^#PermitRootLogin/s/^.*$/PermitRootLogin yes/' /etc/ssh/sshd_config
    - restart ssh

这已经比最初的简单安装领先了一些,但还有很多事情没有进展。

  • 主机名:我不想在这里输入固定的主机名,我想从 DNS 中填写,就像 di 所做的那样。但如果我将这里留空,安装程序就会停止,我必须手动执行此操作,而这并不是我想要的。使用“localhost”(如互联网上某些人建议的那样)只会将其设置为 localhost,而不是使用 DNS 服务器中的 DNS 名称。如何实现这一点?
  • 将 ssh 公钥放入 authorized_keyfile 不起作用。我尝试了几种方法,但仍然没有找到任何附加公钥的用户。
  • 安装后让 root 用户直接使用 authorized_keys。这样很好,但只要我们有一个具有 root 权限的用户,我们就可以从那里使用 Ansible。但让 root 工作还是更好。
  • 初始安装后,除了“身份”中的用户之外的其他用户对我来说仍然不起作用。
  • 网络接口:我正在测试的服务器有 4 个设备,其中只有一个当前有链接(enp3s0),但这并不总是接口名称,我仍然缺乏一种方法来告诉服务器“选择第一个有链接的设备,尝试 DHCP,当它工作正常时,使用它并暂时忽略所有其他接口”。这里有点缺少 eth0...
  • 最好将其放入自己的线程中,但万一它很容易回答:我们还希望服务器拥有自己的镜像,因此我们只需将所有内容下载到中央镜像一次,而不是每个服务器都自行下载。但是使用镜像(只是简单的 apt-mirror)不适用于 cloud-init,因为似乎缺少一些所需的文件夹。

我想,从我读到的内容来看,其中大多数事情应该是相当可行的,但是我确实错过了一些正确做法,因此任何帮助我都会感激不尽。

答案1

对于某些点,我同时找到了正确的语法。

  • hostname:仍然无法正常工作。为此我需要一些建议
  • ssh 公钥:至少对于安装的一个用户,我现在有可用的 ssh 公钥。我不确定为什么之前尝试的确切语法现在有效,也许这是第一次使用正确的组合(ssh -> 授权密钥,没有用户部分)。请参阅下面的配置
  • root:我们放弃了拥有一个可以工作的 root 用户,并决定拥有一个具有管理员权限的用户就足够了,并从这里开始使用 Ansible。
  • 其他用户:没有再尝试该部分,因为一个用户就足够了。
  • 网络接口:只需在配置中不输入任何内容,即可完成“使第一个工作”的部分。
  • 自己的镜像:还有待完成,不确定我们这里遗漏了什么。要清楚的是,如何在 cloud-init 中配置它是已知的,但如何使用自己的镜像来实现这一点,却未知。

对于 HDD 的 LVM 配置,我建议您从头开始手动安装一台服务器,并根据您的需要配置磁盘,然后获取安装日志以确保磁盘部分正确。经过几天的反复试验,我终于做到了这一点,结果发现,您无法按自己的意愿命名分区,最好使用系统会给出的数字,而不是其他任何东西。执行此操作时,将所有保留部分切换为 false,将最后一个分区的大小切换为 -1 以使用整个磁盘空间。

当前有效的用户数据:

#cloud-config
autoinstall:
  package_upgrade: true
  packages:
    - zsh
    - tmux
    - nmap
    - curl
    - wget
    - git
    - htop
    - iperf
    - fail2ban
    - vim
    - net-tools
  apt:
    geoip: true
    preserve_sources_list: false
    primary:
    - arches: [amd64, i386]
      uri: http://de.archive.ubuntu.com/ubuntu
    - arches: [default]
      uri: http://ports.ubuntu.com/ubuntu-ports
  identity: {hostname: localhost, password: <password>,
    username: ansible, realname: ansible}
  keyboard: {layout: de, toggle: null, variant: ''}
  locale: en_GB
  ssh:
    allow-pw: true
    install-server: true
    authorized-keys:
      - ssh-rsa ...
      - ssh-rsa ...
  user-data:
    disable_root: true
  storage:
    config:
    - {ptable: gpt, path: /dev/sda, wipe: superblock-recursive, preserve: false, name: '', grub_device: true, type: disk, id: disk-sda}
    - {device: disk-sda, size: 1048576, flag: bios_grub, number: 1, preserve: false,
      grub_device: false, type: partition, id: partition-sda1}
    - {device: disk-sda, size: 2147483648, wipe: superblock, flag: linux, number: 2,
      preserve: false, grub_device: false, type: partition, id: partition-sda2}
    - {fstype: ext4, volume: partition-sda2, preserve: false, type: format, id: format-0}
    - {device: disk-sda, size: -1, wipe: superblock, flag: linux, number: 3,
      preserve: false, grub_device: false, type: partition, id: partition-sda3}
    - name: vg0
      devices: [partition-sda3]
      preserve: false
      type: lvm_volgroup
      id: lvm_volgroup-0
    - {name: root, volgroup: lvm_volgroup-0, size: 5368709120B, preserve: false, type: lvm_partition,
      id: lvm_partition-0}
    - {fstype: ext4, volume: lvm_partition-0, preserve: false, type: format, id: format-1}
    - {device: format-1, path: /, type: mount, id: mount-1}
    - {name: swap, volgroup: lvm_volgroup-0, size: 4294967296B, preserve: false, type: lvm_partition,
      id: lvm_partition-1}
    - {fstype: swap, volume: lvm_partition-1, preserve: false, type: format, id: format-2}
    - {device: format-2, path: '', type: mount, id: mount-2}
    - {name: tmp, volgroup: lvm_volgroup-0, size: 4294967296B, preserve: false, type: lvm_partition,
      id: lvm_partition-2}
    - {fstype: ext4, volume: lvm_partition-2, preserve: false, type: format, id: format-3}
    - {device: format-3, path: /tmp, type: mount, id: mount-3}
    - {name: usr, volgroup: lvm_volgroup-0, size: 16106127360B, preserve: false, type: lvm_partition,
      id: lvm_partition-3}
    - {fstype: ext4, volume: lvm_partition-3, preserve: false, type: format, id: format-4}
    - {device: format-4, path: /usr, type: mount, id: mount-4}
    - {name: var, volgroup: lvm_volgroup-0, size: 10737418240B, preserve: false, type: lvm_partition,
      id: lvm_partition-4}
    - {fstype: ext4, volume: lvm_partition-4, preserve: false, type: format, id: format-5}
    - {device: format-5, path: /var, type: mount, id: mount-5}
    - {name: varlog, volgroup: lvm_volgroup-0, size: 4294967296B, preserve: false,
      type: lvm_partition, id: lvm_partition-5}
    - {fstype: ext4, volume: lvm_partition-5, preserve: false, type: format, id: format-6}
    - {device: format-6, path: /var/log, type: mount, id: mount-6}
    - {device: format-0, path: /boot, type: mount, id: mount-0}
    swap: {swap: 0}
  version: 1
  late-commands:
    - echo 'ansible ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/ansible

相关内容