将 cloud-init 与 VirtualBox 一起使用?

将 cloud-init 与 VirtualBox 一起使用?

Cloudinit被许多云镜像(例如 EC2 上的镜像)用来获取其初始配置,如 IP 地址、ssh 密钥等。有没有办法以类似的方式将其与 VirtualBox 一起使用?

我正在寻找一种将 ssh authorized_keys 文件放在 VirtualBox 实例上的方法,而无需将其硬编码到图像本身中。

有一个关于“无云”的部分这里但我并不完全理解这如何应用于 VirtualBox。我是否可以生成一个包含相关文件的 /dev/sdb,并在启动实例之前将其作为第二个驱动器提供给 VirtualBox,然后它会以某种方式神奇地获取信息?

答案1

我搞清楚了,并写了一篇博客这里. 来自该链接:

#VirtualBox 和 cloud-init

如果其他人想知道:

  • 您可以使用 cloud-init 来配置 VirtualBox 虚拟机,而不用有太多麻烦。

  • 一种方法是使用“配置驱动器”,即安装另一个(仅)具有 cloud-init 配置数据的虚拟硬盘驱动器。

  • 创建方法如下:

      # Create empty virtual hard drive file
      dd if=/dev/zero of=config.img bs=1 count=0 seek=2M
      # put correct filesystem and disk label on
      mkfs.vfat -n cidata config.img
      # mount it somewhere so you can put the config data on
      sudo mount config.img /mnt
    
  • 现在将您的配置数据放入/mnt/user-data和中/mnt/meta-data

  • 示例:/mnt/user-data.这将创建一个具有 ssh 密钥的用户ubos-admin,以便您无需密码即可通过 ssh 登录。

      #cloud-config
      users:
       - name: ubos-admin
         gecos: UBOS administrative user
         ssh-authorized-keys:
          - insert ssh key here
         sudo: "ALL=(ALL) NOPASSWD: /usr/bin/ubos-admin *, /usr/bin/bash *"
    
  • 例子/mnt/meta-data

      instance-id: my-instance-1
    
  • 然后,卸载:

      sudo umount /mnt
    
  • 并在启动前将其作为第二块硬盘连接。如果主映像中安装了 cloud-init,它应该会获取配置信息。

  • apt如果您使用的是使用以下命令的 Linux 发行版,则可以使用以下命令创建此第二块硬盘的 .vmdk 映像文件:

     sudo apt-get install qemu-kvm
     qemu-img convert -O vmdk  config.img config.vmdk
    

答案2

稍微不同的方法也有效:

使用此处找到的 CentOS 7 云映像:https://cloud.centos.org/centos/7/images/(选择 CentOS-7-x86_64-GenericCloud.qcow2)

用户数据

#!/bin/bash
##
## dependencies required for:
##        VBoxGuestAdditions
##        Minimal Desktop
##
DEPS='wget unzip python-pip git gnome-classic-session gnome-terminal nautilus-open-terminal control-center liberation-mono-fonts bzip2 libguest libguestfs binutils gcc make kernel-headers kernel-devel'

update(){
    sudo yum -y -q update
}


install_epel(){
    sudo yum -y install epel-release
    sudo yum -y update
}

configure(){
    sudo yum -y -q install $DEPS
    yum -y groupinstall "X Window System"
    unlink /etc/systemd/system/default.target
    ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target

    reboot
}

set -x
update
install_epel
configure

元数据

instance-id: dev
local-hostname: dev.example.com
public-keys:
    - ssh-rsa AAAAB3NzaC1y[...]2yX3 [email protected]

network-interfaces: |
    auto eth1
    iface eth1 inet dhcp

vbox-配置-驱动器.sh

#!/bin/bash

##
## generate the config-drive iso
##
gen_iso(){
    echo "Generating ISO"
    genisoimage -output vbox-config.iso -volid cidata -joliet -r meta-data user-data
}

##
## resize as necessary
##
resize(){
    echo "Resizing Disk"
    qemu-img create -f qcow2 -o preallocation=metadata CentOS-7-x86_64-GenericCloud.qcow2.new 12G
    virt-resize --quiet --expand /dev/sda1 CentOS-7-x86_64-GenericCloud.qcow2 CentOS-7-x86_64-GenericCloud.qcow2.new
    mv CentOS-7-x86_64-GenericCloud.qcow2.new CentOS-7-x86_64-GenericCloud.qcow2
}
##
## convert the qcow to vmdk
##
make_vmdk(){
    echo "Converting QCOW to VMDK"
    qemu-img convert -f qcow2 CentOS-7-x86_64-GenericCloud.qcow2 -O vmdk CentOS-7-x86_64-GenericCloud.vmdk
}

gen_iso
##
## OPTIONAL
## resize
##
make_vmdk
echo "Done"

使用生成的 VMDK 作为 VirtualBox 主磁盘,并使用生成的 ISO 作为光驱。

希望这有帮助。M.

相关内容