Merge pull request #594 from metalefty/cloud-init/pubkeys

Add support for injecting multiple SSH pubkeys
This commit is contained in:
Mateusz Kwiatkowski
2025-02-13 13:54:05 +01:00
committed by GitHub
4 changed files with 19 additions and 10 deletions

View File

@@ -273,10 +273,11 @@ To list downloaded images:
default FreeBSD-14.2-RELEASE-amd64.raw
default xenial-server-cloudimg-amd64-uefi1.img
## Using cloud init
## Using cloud-init
vm-bhyve has basic support for providing cloud-init configuration to the guest. You can enable it with `-C` option
to `vm create` command. You can also pass public SSH key to be injected into the guest with option `-k <file>`.
to `vm create` command. You can also pass public SSH key to be injected into the guest with option `-k <file>`.
The public key file can contain multiple public SSH keys, one per line, in the `authorized_keys` format.
Example:
@@ -292,7 +293,7 @@ Example:
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.91' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-141-generic x86_64)
## Adding custom disks
Scenario: If you have a vm on one zpool and would like to add a new virtual disk to it that resides on a different zpool.

View File

@@ -139,7 +139,7 @@ core::list(){
core::create(){
local _name _opt _size _vmdir _disk _disk_dev _num=0
local _zfs_opts _disk_size _template="default" _ds="default" _ds_path _img _cpu _memory _uuid
local _enable_cloud_init _cloud_init_dir _ssh_public_key _ssh_key_file _network_config _mac
local _enable_cloud_init _cloud_init_dir _ssh_public_keys _ssh_public_key _ssh_key_file _network_config _mac
while getopts d:t:s:i:c:m:Ck:n: _opt ; do
case $_opt in
@@ -185,7 +185,7 @@ core::create(){
[ -z "${_enable_cloud_init}" ] && util::err "cloud-init is required for injecting public key. Use -C to enable it."
[ ! -r "${_ssh_key_file}" ] && util::err "can't read file with public key (${_ssh_key_file})"
_ssh_public_key="$(cat "${_ssh_key_file}")"
_ssh_public_keys="$(sed -e '/^$/d' -e '/^#/d' "${_ssh_key_file}")"
fi
# if we're on zfs, make a new filesystem
@@ -215,11 +215,11 @@ core::create(){
# create each disk
while [ -n "${_disk}" ]; do
case "${_disk_dev}" in
case "${_disk_dev}" in
zvol)
zfs::make_zvol "${VM_DS_ZFS_DATASET}/${_name}/${_disk}" "${_disk_size}" "0" "${_zfs_opts}"
[ $_num -eq 0 ] && [ ! -z "$_img" ] && core::write_img "/dev/zvol/${VM_DS_ZFS_DATASET}/${_name}/${_disk}" "${_img}" "${_disk_dev}" "${_disk_size}"
;;
;;
sparse-zvol)
zfs::make_zvol "${VM_DS_ZFS_DATASET}/${_name}/${_disk}" "${_disk_size}" "1" "${_zfs_opts}"
[ $_num -eq 0 ] && [ ! -z "$_img" ] && core::write_img "/dev/zvol/${VM_DS_ZFS_DATASET}/${_name}/${_disk}" "${_img}" "${_disk_dev}" "${_disk_size}"
@@ -306,11 +306,15 @@ resize_rootfs: True
manage_etc_hosts: localhost
EOF
if [ -n "${_ssh_public_key}" ]; then
if [ -n "${_ssh_public_keys}" ]; then
cat << EOF >> "${_cloud_init_dir}/user-data"
ssh_authorized_keys:
EOF
echo "${_ssh_public_keys}" | while read -r _ssh_public_key; do
cat << EOF >> "${_cloud_init_dir}/user-data"
- ${_ssh_public_key}
EOF
done
fi
makefs -t cd9660 -o R,L=cidata "${VM_DS_PATH}/${_name}/seed.iso" ${_cloud_init_dir} || util::err "Can't write seed.iso for cloud-init"
@@ -342,7 +346,7 @@ core::write_img(){
if [ ! -r "${_disk_dev}" ]; then
sleep 1
i=$(($i+1))
else
else
break
fi
done

View File

@@ -163,7 +163,7 @@ Usage: vm ...
datastore add <name> <path>
list [-r]
info [name] [...]
create [-d datastore] [-t template] [-s size] [-m memory] [-c vCPUs] <name>
create [-d datastore] [-t template] [-s size] [-m memory] [-c vCPUs] [-i vm-image] [-C -k pubkeys] <name>
install [-fi] <name> <iso>
start [-fi] <name> [...]
stop <name> [...]

4
vm.8
View File

@@ -75,6 +75,10 @@
.Op Fl d Ar datastore
.Op Fl t Ar template
.Op Fl s Ar size
.Op Fl c Ar vCPUs
.Op Fl m Ar memory
.Op Fl i Ar vm-image
.Op Fl C k Ar pubkeys
.Ar name
.Nm
.Cm