Maas 为 Ubuntu 定制配置

Maas 为 Ubuntu 定制配置

现在,我遇到了 Maas 的这个问题:

我已经为我的 Ubuntu 16.04 安装进行了自定义配置(因为我的情况需要不同的分区和驱动器配置)。我们的服务器有几个硬盘驱动器,其中两个专用于系统(通常是最小的两个)。所以我为这种配置创建了自定义配置,它使用一些脚本来确定最小的两个驱动器。之后我们使用自定义分区,包括软件 raid 创建。到目前为止一切正常,但在某些情况下,grub-install 的安装会失败。问题是:我需要在 curtin 中更改 grub 配置,以便它可以为 grub-install 获取正确的设备或完全禁用 grub 部分。我的 custom_userdata_ubuntu 现在看起来像这样:

#cloud-config
debconf_selections:
 maas: |
  {{for line in str(curtin_preseed).splitlines()}}
  {{line}}
  {{endfor}}

early_commands:
  01_get_device_list_script: wget -O /bin/list-devices http://10.7.36.1/list-devices
  02_get_smallest_drives_script: wget -O /tmp/root_disk.sh http://10.7.36.1/root_disk.sh
  03_chmod_list_devices: chmod 755 /bin/list-devices
  04_set_drive_1: /bin/bash /tmp/root_disk.sh raid1_2_disk1 >/tmp/drive1
  05_set_drive_2: /bin/bash /tmp/root_disk.sh raid1_2_disk2 >/tmp/drive2

partitioning_commands:
  builtin: []
  01_apt_get_update: apt-get update
  02_install_gdisk: apt-get -y install gdisk mdadm kpartx
  02_stop_raid_devices: for i in `ls /dev | grep -P 'md[0-9+]'`; do mdadm --stop /dev/$i; done
  02_wait_for_device_to_settle: sleep 10; echo "Devices should be settled"
  03_erase_metadata_drive_1: for i in 2 3 4 5 6 7; do mdadm --zero-superblock $(cat /tmp/drive1)${i} || /bin/true; done
  03_erase_metadata_drive_2: for i in 2 3 4 5 6 7; do mdadm --zero-superblock $(cat /tmp/drive2)${i} || /bin/true; done
  04_start_partitioning: echo Starting partitioning; sleep 10
  05_set_drive1_label: /sbin/parted $(cat /tmp/drive1) -s mklabel gpt
  06_set_drive2_label: /sbin/parted $(cat /tmp/drive2) -s mklabel gpt
  07_set_boot_part_1: /sbin/parted -s $(cat /tmp/drive1) unit s mkpart biosboot 2048 4095
  08_set_bios_boot_1: /sbin/parted -s $(cat /tmp/drive1) set 1 bios_grub on
  09_mk_swap_1: /sbin/parted -s $(cat /tmp/drive1)  mkpart primary 2098K 32G
  10_parted_mk_root_1: /sbin/parted -s $(cat /tmp/drive1) mkpart primary ext4 32G 52G
  11_parted_: /sbin/parted -s $(cat /tmp/drive1) mkpart primary ext4 52G 72G
  12_parted_: /sbin/parted -s $(cat /tmp/drive1) mkpart primary ext4 72G 92G
  13_parted_: /sbin/parted -s $(cat /tmp/drive1) mkpart primary ext4 92G 112G
  14_parted_: /sbin/parted -s $(cat /tmp/drive1) mkpart primary ext4 112G 100%
  141_start_copy_partitioning: echo Starting Partitioning copy process
  15_sgdisk_copy_table: /sbin/sgdisk -R $(cat /tmp/drive2) $(cat /tmp/drive1)
  16_sgdisk_generate_uuid: /sbin/sgdisk -G $(cat /tmp/drive2)
  17_parted_set_raid_1_2: /sbin/parted $(cat /tmp/drive1) set 2 "raid" on
  18_parted_set_raid_1_3: /sbin/parted $(cat /tmp/drive1) set 3 "raid" on
  19_parted_set_raid_1_4: /sbin/parted $(cat /tmp/drive1) set 4 "raid" on
  20_parted_set_raid_1_5: /sbin/parted $(cat /tmp/drive1) set 5 "raid" on
  21_parted_set_raid_1_6: /sbin/parted $(cat /tmp/drive1) set 6 "raid" on
  22_parted_set_raid_1_7: /sbin/parted $(cat /tmp/drive1) set 7 "raid" on
  23_parted_set_raid_2_2: /sbin/parted $(cat /tmp/drive2) set 2 "raid" on
  24_parted_set_raid_2_3: /sbin/parted $(cat /tmp/drive2) set 3 "raid" on
  25_parted_set_raid_2_4: /sbin/parted $(cat /tmp/drive2) set 4 "raid" on
  26_parted_set_raid_2_5: /sbin/parted $(cat /tmp/drive2) set 5 "raid" on
  27_parted_set_raid_2_6: /sbin/parted $(cat /tmp/drive2) set 6 "raid" on
  28_parted_set_raid_2_7: /sbin/parted $(cat /tmp/drive2) set 7 "raid" on
  28_let_devices_settle: sleep 10; echo "and again devices should be settled"
  29_mdadm_create_swap: yes | mdadm --create /dev/md0 --level=1 --force --raid-disks=2 --metadata=0.90 $(cat /tmp/drive2)2 $(cat /tmp/drive1)2
  30_mdadm_create_root: yes | mdadm --create /dev/md1 --level=1 --force --raid-disks=2 --metadata=0.90 $(cat /tmp/drive2)3 $(cat /tmp/drive1)3
  31_mdadm_create_usr:  yes | mdadm --create /dev/md2 --level=1 --force --raid-disks=2 --metadata=0.90 $(cat /tmp/drive2)4 $(cat /tmp/drive1)4
  32_mdadm_create_var:  yes | mdadm --create /dev/md3 --level=1 --force --raid-disks=2 --metadata=0.90 $(cat /tmp/drive2)5 $(cat /tmp/drive1)5
  33_mdadm_create_home: yes | mdadm --create /dev/md4 --level=1 --force --raid-disks=2 --metadata=0.90 $(cat /tmp/drive2)6 $(cat /tmp/drive1)6
  34_mdadm_create_data: yes | mdadm --create /dev/md5 --level=1 --force --raid-disks=2 --metadata=0.90 $(cat /tmp/drive2)7 $(cat /tmp/drive1)7
  35_mkswap: mkswap /dev/md0
  36_mkfs_root: mkfs -t ext4 /dev/md1
  37_mkfs_usr:  mkfs -t ext4 /dev/md2
  38_mkfs_var:  mkfs -t ext4 /dev/md3
  39_mkfs_home: mkfs -t ext4 /dev/md4
  40_mkfs_data: mkfs -t ext4 /dev/md5
  41_mount_root: mount /dev/md1 ${TARGET_MOUNT_POINT}
  42_mkdirs: mkdir ${TARGET_MOUNT_POINT}/usr ${TARGET_MOUNT_POINT}/var ${TARGET_MOUNT_POINT}/home ${TARGET_MOUNT_POINT}/data; mkdir -p ${TARGET_MOUNT_POINT}/boot/grub
  43_mount_usr: mount /dev/md2 ${TARGET_MOUNT_POINT}/usr
  44_mount_var: mount /dev/md3 ${TARGET_MOUNT_POINT}/var
  45_mount_home: mount /dev/md4 ${TARGET_MOUNT_POINT}/home
  46_mount_data: mount /dev/md5 ${TARGET_MOUNT_POINT}/data
  47_fstab_root: echo "/dev/md1 / ext4 errors=remount-ro 0 1" >> $OUTPUT_FSTAB
  48_fstab_usr:  echo "/dev/md2 /usr ext4 defaults 0 2" >> $OUTPUT_FSTAB
  49_fstab_var:  echo "/dev/md3 /var ext4 defaults 0 1" >> $OUTPUT_FSTAB
  50_fstab_home: echo "/dev/md4 /home ext4 defaults 0 2" >> $OUTPUT_FSTAB
  51_fstab_data: echo "/dev/md5 /data ext4 defaults 0 2" >> $OUTPUT_FSTAB
  52_fstab_swap: echo "/dev/md0 none swap sw 0 0" >> $OUTPUT_FSTAB
  53_make_device_map_dir: for i in 0 1 2 3 4 5; do echo "(md/$i)       /dev/md$i)" >>${TARGET_MOUNT_POINT}/boot/grub/device.map; done

swap:
  filename: swap.img
  size: 0

late_commands:
  maas: [wget, '--no-proxy', '{{node_disable_pxe_url}}', '--post-data', '{{node_disable_pxe_data}}', '-O', '/dev/null']
  40_create_grub_config: ["curtin", "in-target", "--", "sh", "-c", "/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg"]
  41_install_bootloader_drive_1: ["curtin", "in-target", "--", "sh", "-c", "grub-install $(cat /tmp/drive1)"]
  42_install_bootloader_drive_1: ["curtin", "in-target", "--", "sh", "-c", "grub-install $(cat /tmp/drive2)"]
  51_fill_mdadm: ["curtin", "in-target", "--", "sh", "-c", "mdadm --examine --scan >/etc/mdadm/mdadm.conf"]
  52_update_initramfs: ["curtin", "in-target", "--", "sh", "-c", "update-initramfs -u -k all"]

问题是,在某些情况下,如果我们有两个系统硬盘,并且我们在 raid 控制器上启用了 JBOD,安装会失败,导致 grub 尝试将自身安装在 /dev/sda 上,在这种情况下,这可能不是系统磁盘,而是内核设置为 sda 的 jbod 磁盘,并且它是空的。有没有办法告诉 maas 从内部在另一个磁盘上安装 grub(或者禁用安装 grub,因为我在配置的后面部分有它)?

此外,还有关于安装后 maas 行为的另一个问题,它们是:

  1. 当发布服务器时,Maas 会将其关闭 - 我该如何禁用这种行为?
  2. 此外,发布后,Maas 不会从 PXE 更改启动设备,因此此后的第一次启动会失败,因为 PXE 配置不再存在。
  3. 成功部署服务器后,Maas 没有在接口部分显示服务器 IP 地址,我们该如何解决这个问题?

答案1

现在,我一直在查看 Maas 代码和在线参考资料,所以我创建了新的配置,也许有人会喜欢它。有效的方法:1. 检测最小驱动器,如果我们有两个大小相同的驱动器,那么我们创建带有 /、/usr、/var、/home 挂载点的软件 raid 2. 当设备不是 sda/sdb 时,Grub 可以正确安装自身。

无法按预期工作的是 resolv.conf 配置,我认为它要么是 dnsmasq 或类似的东西,它会忽略我的网络配置并将 127.0.0.1 放入 resolv.conf,不过我会研究一下。也​​可以更改为类似 example.org 的内容。此外,我还在此列表中添加了来自我的配置的后期命令(尽管我省略了其中一些),它为 puppet 添加了事实,安装 puppet-agent 并运行它(在 puppet 运行之后还有 killall 部分 - 它需要释放 chroot 环境,否则安装会失败,导致临时目录保持繁忙并且无法卸载)

#cloud-config
debconf_selections:
 maas: |
  {{for line in str(curtin_preseed).splitlines()}}
  {{line}}
  {{endfor}}


early_commands:
  01_empty_command: echo INSTALLATION STARTED
{{py:
import operator
deviceListTmp = node.blockdevice_set.all()
deviceList = sorted(deviceListTmp, key=operator.attrgetter('size'))
has_raid = False
if (len(deviceList) > 1):
   bootdrive_1 = deviceList[0]
   bootdrive_2 = deviceList[1]
   if bootdrive_1.size == bootdrive_2.size:
      has_raid = True
else:
   bootdrive_1 = deviceList[0]
}}

{{if has_raid}}
storage:
  version: 1
  config:
    - id: {{bootdrive_1.name.strip()}}
      type: disk
      ptable: gpt
      path: /dev/{{bootdrive_1.name.strip()}}
      name: boot_drive_1
      grub_device: 1
      wipe: superblock-recursive
    - id: bios_boot_partition_1
      type: partition
      size: 1MB
      device: {{bootdrive_1.name.strip()}}
      flag: bios_grub
    - id: {{bootdrive_1.name.strip()}}2
      type: partition
      size: 30G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}3
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}4
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}5
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}6
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_2.name.strip()}}
      type: disk
      ptable: gpt
      path: /dev/{{bootdrive_2.name.strip()}}
      name: boot_drive_2
      grub_device: 1
      wipe: superblock-recursive
    - id: bios_boot_partition_2
      type: partition
      size: 1MB
      device: {{bootdrive_2.name.strip()}}
      flag: bios_grub
    - id: {{bootdrive_2.name.strip()}}2
      type: partition
      size: 30G
      device: {{bootdrive_2.name.strip()}}
    - id: {{bootdrive_2.name.strip()}}3
      type: partition
      size: 19G
      device: {{bootdrive_2.name.strip()}}
    - id: {{bootdrive_2.name.strip()}}4
      type: partition
      size: 19G
      device: {{bootdrive_2.name.strip()}}
    - id: {{bootdrive_2.name.strip()}}5
      type: partition
      size: 19G
      device: {{bootdrive_2.name.strip()}}
    - id: {{bootdrive_2.name.strip()}}6
      type: partition
      size: 19G
      device: {{bootdrive_2.name.strip()}}
    - id: mddevice0
      name: md0
      type: raid
      raidlevel: 1
      devices:
        - {{bootdrive_1.name.strip()}}2
        - {{bootdrive_2.name.strip()}}2
    - id: mddevice1
      name: md1
      type: raid
      raidlevel: 1
      devices:
        - {{bootdrive_1.name.strip()}}3
        - {{bootdrive_2.name.strip()}}3
    - id: mddevice2
      name: md2
      type: raid
      raidlevel: 1
      devices:
        - {{bootdrive_1.name.strip()}}4
        - {{bootdrive_2.name.strip()}}4
    - id: mddevice3
      name: md3
      type: raid
      raidlevel: 1
      devices:
        - {{bootdrive_1.name.strip()}}5
        - {{bootdrive_2.name.strip()}}5
    - id: mddevice4
      name: md4
      type: raid
      raidlevel: 1
      devices:
        - {{bootdrive_1.name.strip()}}6
        - {{bootdrive_2.name.strip()}}6
    - id: md_swap
      type: format
      fstype: swap
      volume: mddevice0
    - id: md_root
      type: format
      fstype: ext4
      volume: mddevice1
    - id: md_usr
      type: format
      fstype: ext4
      volume: mddevice2
    - id: md_var
      type: format
      fstype: ext4
      volume: mddevice3
    - id: md_home
      type: format
      fstype: ext4
      volume: mddevice4
    - id: mount_swap
      type: mount
      device: md_swap
    - id: mount_root
      type: mount
      path: /
      device: md_root
    - id: mount_usr
      type: mount
      path: /usr
      device: md_usr
    - id: mount_var
      type: mount
      path: /var
      device: md_var
    - id: mount_home
      type: mount
      path: /home
      device: md_home

grub:
  install_devices:
    - /dev/{{bootdrive_1.name.strip()}}
    - /dev/{{bootdrive_2.name.strip()}}
{{else}}
storage:
  version: 1
  config:
    - id: {{bootdrive_1.name.strip()}}
      type: disk
      ptable: gpt
      path: /dev/{{bootdrive_1.name.strip()}}
      name: boot_drive_1
      grub_device: 1
      wipe: superblock-recursive
    - id: bios_boot_partition
      type: partition
      size: 1MB
      device: {{bootdrive_1.name.strip()}}
      flag: bios_grub
    - id: {{bootdrive_1.name.strip()}}2
      type: partition
      size: 30G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}3
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}4
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}5
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: {{bootdrive_1.name.strip()}}6
      type: partition
      size: 19G
      device: {{bootdrive_1.name.strip()}}
    - id: fs_swap
      type: format
      fstype: swap
      volume: {{bootdrive_1.name.strip()}}2
    - id: fs_root
      type: format
      fstype: ext4
      volume: {{bootdrive_1.name.strip()}}3
    - id: fs_usr
      type: format
      fstype: ext4
      volume: {{bootdrive_1.name.strip()}}4
    - id: fs_var
      type: format
      fstype: ext4
      volume: {{bootdrive_1.name.strip()}}5
    - id: fs_home
      type: format
      fstype: ext4
      volume: {{bootdrive_1.name.strip()}}6
    - id: mount_swap
      type: mount
      device: fs_swap
    - id: mount_root
      type: mount
      path: /
      device: fs_root
    - id: mount_usr
      type: mount
      path: /usr
      device: fs_usr
    - id: mount_var
      type: mount
      path: /var
      device: fs_var
    - id: mount_home
      type: mount
      path: /home
      device: fs_home

grub:
  install_devices:
    - /dev/{{bootdrive_1.name.strip()}}
{{endif}}

network:
  version: 1
  config:
    - type: nameserver
      address:
        - 10.121.10.1
        - 192.168.121.1
      search:
        - <domainname>


swap:
  filename: swap.img
  size: 0

late_commands:
  12_reconfigure_openssh: ["curtin", "in-target", "--", "sh", "-c", "dpkg-reconfigure openssh-server"]
  13_add_puppet_key: ["curtin", "in-target", "--", "sh", "-c", "wget -O /tmp/puppet.key http://apt.puppetlabs.com/DEB-GPG-KEY-puppet && apt-key add /tmp/puppet.key"]
  14_add_puppet_repo: ["curtin", "in-target", "--", "sh", "-c", "echo 'deb http://apt.puppetlabs.com xenial PC1' >/etc/apt/sources.list.d/puppetlabs-pc1.list && apt-get update"]
  15_run_fix: ["curtin", "in-target", "--", "sh", "-c", "apt-get -y -f install"]
  18_install_puppet_and_requrements: ["curtin", "in-target", "--", "sh", "-c", "apt-get -y install puppet-agent lsof jq ipmiutil wget python-requests parted strace tcpdump mc net-tools lsb-release"]
  20_add_team_fact: ["curtin", "in-target", "--", "sh", "-c", "wget -O /tmp/smdb_data.py http://10.7.36.1/smdb_data.py && python /tmp/smdb_data.py && rm -f /tmp/smdb_data.py"]
  21_run_puppet: ["curtin", "in-target", "--", "sh", "-c", "/opt/puppetlabs/bin/puppet agent -t --server puppet4.<domain>; killall -9 splunkd; killall -9 zabbix_agentd; killall -9 mdadm; lsof /proc"]
  22_display_network_config: cat $OUTPUT_NETWORK_CONFIG

相关内容