Example config_drive init script, label the config drive
Configuration with DHCP & cloud-init can be painful. The config_drive is great, and it avoids disk injection, but there's no example of how to use it. So here's a little example init.d script for contrib, and a code patch to make sure the config drive gets a nice volume label. Change-Id: I22a1d6a824856ca9651b435d0fe54e348ab107fe
This commit is contained in:
parent
8924ad8d6d
commit
f4bf828775
|
@ -0,0 +1,65 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: openstack
|
||||||
|
# Required-Start: mountkernfs $local_fs
|
||||||
|
# Required-Stop: $local_fs
|
||||||
|
# X-Start-Before: networking
|
||||||
|
# Should-Start:
|
||||||
|
# Default-Start: S
|
||||||
|
# Default-Stop:
|
||||||
|
# Short-Description: Apply configuration from OpenStack Config Drive
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
|
||||||
|
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
|
copy_cloud_config() {
|
||||||
|
LABEL="config"
|
||||||
|
if [ ! -e /dev/disk/by-label/${LABEL} ]; then
|
||||||
|
log_warning_msg "OpenStack Cloud Config drive not found"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
MNT=/tmp/config
|
||||||
|
mkdir -p ${MNT}
|
||||||
|
mount /dev/disk/by-label/${LABEL} ${MNT}
|
||||||
|
if [ -e ${MNT}/root/.ssh/authorized_keys ]; then
|
||||||
|
mkdir -m 700 -p /root/.ssh/
|
||||||
|
cp ${MNT}/root/.ssh/authorized_keys /root/.ssh/
|
||||||
|
chmod 600 ${MNT}/root/.ssh/authorized_keys
|
||||||
|
fi
|
||||||
|
if [ -e ${MNT}/etc/network/interfaces ]; then
|
||||||
|
cp ${MNT}/etc/network/interfaces /etc/network/
|
||||||
|
chmod 644 /etc/network/interfaces
|
||||||
|
fi
|
||||||
|
umount ${MNT}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start|"")
|
||||||
|
log_action_begin_msg "Applying OpenStack Cloud Config"
|
||||||
|
if copy_cloud_config; then
|
||||||
|
log_action_end_msg $?
|
||||||
|
else
|
||||||
|
log_action_end_msg $?
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
restart|reload|force-reload|status)
|
||||||
|
echo "Error: argument '$1' not supported" >&2
|
||||||
|
exit 3
|
||||||
|
;;
|
||||||
|
|
||||||
|
stop)
|
||||||
|
# No-op
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Usage: openstack.sh [start|stop]" >&2
|
||||||
|
exit 3
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
:
|
|
@ -954,7 +954,8 @@ class LibvirtConnection(driver.ComputeDriver):
|
||||||
disk.extend(target, size)
|
disk.extend(target, size)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _create_local(target, local_size, unit='G', fs_format=None):
|
def _create_local(target, local_size, unit='G',
|
||||||
|
fs_format=None, label=None):
|
||||||
"""Create a blank image of specified size"""
|
"""Create a blank image of specified size"""
|
||||||
|
|
||||||
if not fs_format:
|
if not fs_format:
|
||||||
|
@ -963,7 +964,7 @@ class LibvirtConnection(driver.ComputeDriver):
|
||||||
libvirt_utils.create_image('raw', target,
|
libvirt_utils.create_image('raw', target,
|
||||||
'%d%c' % (local_size, unit))
|
'%d%c' % (local_size, unit))
|
||||||
if fs_format:
|
if fs_format:
|
||||||
libvirt_utils.mkfs(fs_format, target)
|
libvirt_utils.mkfs(fs_format, target, label)
|
||||||
|
|
||||||
def _create_ephemeral(self, target, ephemeral_size, fs_label, os_type):
|
def _create_ephemeral(self, target, ephemeral_size, fs_label, os_type):
|
||||||
self._create_local(target, ephemeral_size)
|
self._create_local(target, ephemeral_size)
|
||||||
|
@ -1109,8 +1110,9 @@ class LibvirtConnection(driver.ComputeDriver):
|
||||||
user_id=instance['user_id'],
|
user_id=instance['user_id'],
|
||||||
project_id=instance['project_id'],)
|
project_id=instance['project_id'],)
|
||||||
elif config_drive:
|
elif config_drive:
|
||||||
|
label = 'config'
|
||||||
self._create_local(basepath('disk.config'), 64, unit='M',
|
self._create_local(basepath('disk.config'), 64, unit='M',
|
||||||
fs_format='msdos') # 64MB
|
fs_format='msdos', label=label) # 64MB
|
||||||
|
|
||||||
if instance['key_data']:
|
if instance['key_data']:
|
||||||
key = str(instance['key_data'])
|
key = str(instance['key_data'])
|
||||||
|
|
|
@ -118,17 +118,22 @@ def copy_image(src, dest):
|
||||||
execute('cp', src, dest)
|
execute('cp', src, dest)
|
||||||
|
|
||||||
|
|
||||||
def mkfs(fs, path):
|
def mkfs(fs, path, label=None):
|
||||||
"""Format a file or block device
|
"""Format a file or block device
|
||||||
|
|
||||||
:param fs: Filesystem type (examples include 'swap', 'ext3', 'ext4'
|
:param fs: Filesystem type (examples include 'swap', 'ext3', 'ext4'
|
||||||
'btrfs', etc.)
|
'btrfs', etc.)
|
||||||
:param path: Path to file or block device to format
|
:param path: Path to file or block device to format
|
||||||
|
:param label: Volume label to use
|
||||||
"""
|
"""
|
||||||
if fs == 'swap':
|
if fs == 'swap':
|
||||||
execute('mkswap', path)
|
execute('mkswap', path)
|
||||||
else:
|
else:
|
||||||
execute('mkfs', '-t', fs, path)
|
args = ['mkfs', '-t', fs]
|
||||||
|
if label:
|
||||||
|
args.extend(['-n', label])
|
||||||
|
args.append(path)
|
||||||
|
execute(*args)
|
||||||
|
|
||||||
|
|
||||||
def ensure_tree(path):
|
def ensure_tree(path):
|
||||||
|
|
Loading…
Reference in New Issue