Ironic: Setup/Configure iPXE

Setup the enviroment and configure Ironic to use iPXE for deployments. If
IRONIC_IPXE_ENABLED enviroment variable is True, DevStack will now start
and configure an Apache HTTP server to serve the images, will copy the
undionly.kpxe boot file in place of the standard pxelinux.0 and will set
the right configuration to Ironic to deploy the images using iPXE+HTTP.

Implements: blueprint ipxe-boot
Change-Id: I0ea40cb8bbf9236c634f803c2bde1081634679ff
This commit is contained in:
Lucas Alvares Gomes 2014-08-19 10:01:45 +01:00
parent 58f8f429c8
commit 5851e5f698
4 changed files with 97 additions and 18 deletions

View File

@ -0,0 +1,12 @@
Listen %PUBLICPORT%
<VirtualHost *:%PUBLICPORT%>
DocumentRoot "%HTTPROOT%"
<Directory "%HTTPROOT%">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>

View File

@ -1,5 +1,6 @@
ipmitool ipmitool
iptables iptables
ipxe
libguestfs0 libguestfs0
libvirt-bin libvirt-bin
openssh-client openssh-client

View File

@ -1,5 +1,6 @@
ipmitool ipmitool
iptables iptables
ipxe-bootimgs
libguestfs libguestfs
libvirt libvirt
libvirt-python libvirt-python

View File

@ -95,6 +95,32 @@ IRONIC_HOSTPORT=${IRONIC_HOSTPORT:-$SERVICE_HOST:6385}
# Tell Tempest this project is present # Tell Tempest this project is present
TEMPEST_SERVICES+=,ironic TEMPEST_SERVICES+=,ironic
# Enable iPXE
IRONIC_IPXE_ENABLED=$(trueorfalse False $IRONIC_IPXE_ENABLED)
IRONIC_HTTP_DIR=${IRONIC_HTTP_DIR:-$IRONIC_DATA_DIR/httpboot}
IRONIC_HTTP_SERVER=${IRONIC_HTTP_SERVER:-$HOST_IP}
IRONIC_HTTP_PORT=${IRONIC_HTTP_PORT:-8088}
# get_pxe_boot_file() - Get the PXE/iPXE boot file path
function get_pxe_boot_file {
local relpath=syslinux/pxelinux.0
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then
relpath=ipxe/undionly.kpxe
fi
local pxe_boot_file
if is_ubuntu; then
pxe_boot_file=/usr/lib/$relpath
elif is_fedora || is_suse; then
pxe_boot_file=/usr/share/$relpath
fi
echo $pxe_boot_file
}
# PXE boot image
IRONIC_PXE_BOOT_IMAGE=${IRONIC_PXE_BOOT_IMAGE:-$(get_pxe_boot_file)}
# Functions # Functions
# --------- # ---------
@ -116,6 +142,10 @@ function install_ironic {
done done
git_clone $IRONIC_REPO $IRONIC_DIR $IRONIC_BRANCH git_clone $IRONIC_REPO $IRONIC_DIR $IRONIC_BRANCH
setup_develop $IRONIC_DIR setup_develop $IRONIC_DIR
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then
install_apache_wsgi
fi
} }
# install_ironicclient() - Collect sources and prepare # install_ironicclient() - Collect sources and prepare
@ -125,6 +155,25 @@ function install_ironicclient {
sudo install -D -m 0644 -o $STACK_USER {$IRONICCLIENT_DIR/tools/,/etc/bash_completion.d/}ironic.bash_completion sudo install -D -m 0644 -o $STACK_USER {$IRONICCLIENT_DIR/tools/,/etc/bash_completion.d/}ironic.bash_completion
} }
# _cleanup_ironic_apache_wsgi() - Remove wsgi files, disable and remove apache vhost file
function _cleanup_ironic_apache_wsgi {
sudo rm -rf $IRONIC_HTTP_DIR
disable_apache_site ironic
sudo rm -f $(apache_site_config_for ironic)
restart_apache_server
}
# _config_ironic_apache_wsgi() - Set WSGI config files of Ironic
function _config_ironic_apache_wsgi {
local ironic_apache_conf=$(apache_site_config_for ironic)
sudo cp $FILES/apache-ironic.template $ironic_apache_conf
sudo sed -e "
s|%PUBLICPORT%|$IRONIC_HTTP_PORT|g;
s|%HTTPROOT%|$IRONIC_HTTP_DIR|g;
" -i $ironic_apache_conf
enable_apache_site ironic
}
# cleanup_ironic() - Remove residual data files, anything left over from previous # cleanup_ironic() - Remove residual data files, anything left over from previous
# runs that would need to clean up. # runs that would need to clean up.
function cleanup_ironic { function cleanup_ironic {
@ -137,22 +186,24 @@ function configure_ironic_dirs {
if [[ ! -d $IRONIC_CONF_DIR ]]; then if [[ ! -d $IRONIC_CONF_DIR ]]; then
sudo mkdir -p $IRONIC_CONF_DIR sudo mkdir -p $IRONIC_CONF_DIR
fi fi
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then
sudo mkdir -p $IRONIC_HTTP_DIR
sudo chown -R $STACK_USER:$LIBVIRT_GROUP $IRONIC_HTTP_DIR
fi
sudo mkdir -p $IRONIC_DATA_DIR sudo mkdir -p $IRONIC_DATA_DIR
sudo mkdir -p $IRONIC_STATE_PATH sudo mkdir -p $IRONIC_STATE_PATH
sudo mkdir -p $IRONIC_TFTPBOOT_DIR sudo mkdir -p $IRONIC_TFTPBOOT_DIR
sudo chown -R $STACK_USER $IRONIC_DATA_DIR $IRONIC_STATE_PATH sudo chown -R $STACK_USER $IRONIC_DATA_DIR $IRONIC_STATE_PATH
sudo chown -R $STACK_USER:$LIBVIRT_GROUP $IRONIC_TFTPBOOT_DIR sudo chown -R $STACK_USER:$LIBVIRT_GROUP $IRONIC_TFTPBOOT_DIR
if is_ubuntu; then mkdir -p $IRONIC_TFTPBOOT_DIR/pxelinux.cfg
local pxebin=/usr/lib/syslinux/pxelinux.0
elif is_fedora; then if [ ! -f $IRONIC_PXE_BOOT_IMAGE ]; then
local pxebin=/usr/share/syslinux/pxelinux.0 die $LINENO "PXE boot file $IRONIC_PXE_BOOT_IMAGE not found."
fi
if [ ! -f $pxebin ]; then
die $LINENO "pxelinux.0 (from SYSLINUX) not found."
fi fi
cp $pxebin $IRONIC_TFTPBOOT_DIR cp $IRONIC_PXE_BOOT_IMAGE $IRONIC_TFTPBOOT_DIR
mkdir -p $IRONIC_TFTPBOOT_DIR/pxelinux.cfg
} }
# configure_ironic() - Set config files, create data dirs, etc # configure_ironic() - Set config files, create data dirs, etc
@ -181,6 +232,10 @@ function configure_ironic {
if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then if [ "$LOG_COLOR" == "True" ] && [ "$SYSLOG" == "False" ]; then
setup_colorized_logging $IRONIC_CONF_FILE DEFAULT setup_colorized_logging $IRONIC_CONF_FILE DEFAULT
fi fi
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]]; then
_config_ironic_apache_wsgi
fi
} }
# configure_ironic_api() - Is used by configure_ironic(). Performs # configure_ironic_api() - Is used by configure_ironic(). Performs
@ -240,6 +295,15 @@ function configure_ironic_conductor {
iniset $IRONIC_CONF_FILE agent agent_pxe_append_params "nofb nomodeset vga=normal console=ttyS0" iniset $IRONIC_CONF_FILE agent agent_pxe_append_params "nofb nomodeset vga=normal console=ttyS0"
fi fi
fi fi
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then
local pxebin=`basename $IRONIC_PXE_BOOT_IMAGE`
iniset $IRONIC_CONF_FILE pxe ipxe_enabled True
iniset $IRONIC_CONF_FILE pxe pxe_config_template '\$pybasedir/drivers/modules/ipxe_config.template'
iniset $IRONIC_CONF_FILE pxe pxe_bootfile_name $pxebin
iniset $IRONIC_CONF_FILE pxe http_root $IRONIC_HTTP_DIR
iniset $IRONIC_CONF_FILE pxe http_url "http://$IRONIC_HTTP_SERVER:$IRONIC_HTTP_PORT"
fi
} }
# create_ironic_cache_dir() - Part of the init_ironic() process # create_ironic_cache_dir() - Part of the init_ironic() process
@ -307,6 +371,11 @@ function start_ironic {
if is_service_enabled ir-cond; then if is_service_enabled ir-cond; then
start_ironic_conductor start_ironic_conductor
fi fi
# Start Apache if iPXE is enabled
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then
restart_apache_server
fi
} }
# start_ironic_api() - Used by start_ironic(). # start_ironic_api() - Used by start_ironic().
@ -331,6 +400,11 @@ function stop_ironic {
# Kill the Ironic screen windows # Kill the Ironic screen windows
screen -S $SCREEN_NAME -p ir-api -X kill screen -S $SCREEN_NAME -p ir-api -X kill
screen -S $SCREEN_NAME -p ir-cond -X kill screen -S $SCREEN_NAME -p ir-cond -X kill
# Cleanup the WSGI files
if [[ "$IRONIC_IPXE_ENABLED" == "True" ]] ; then
_cleanup_ironic_apache_wsgi
fi
} }
function is_ironic { function is_ironic {
@ -438,15 +512,6 @@ function configure_iptables {
} }
function configure_tftpd { function configure_tftpd {
if is_ubuntu; then
local pxebin=/usr/lib/syslinux/pxelinux.0
elif is_fedora; then
local pxebin=/usr/share/syslinux/pxelinux.0
fi
if [ ! -f $pxebin ]; then
die $LINENO "pxelinux.0 (from SYSLINUX) not found."
fi
# stop tftpd and setup serving via xinetd # stop tftpd and setup serving via xinetd
stop_service tftpd-hpa || true stop_service tftpd-hpa || true
[ -f /etc/init/tftpd-hpa.conf ] && echo "manual" | sudo tee /etc/init/tftpd-hpa.override [ -f /etc/init/tftpd-hpa.conf ] && echo "manual" | sudo tee /etc/init/tftpd-hpa.override