added initial version of scripts for running Fuel Web under VirtualBox
This commit is contained in:
parent
95b13f85ec
commit
f92493d4ef
|
@ -0,0 +1,8 @@
|
||||||
|
In order to successfully run Fuel Web under VirtualBox, you need to:
|
||||||
|
- download the official release (.iso) and place it under 'iso' directory
|
||||||
|
- run "./launch.sh". it will automatically pick up the iso, and will spin up master node and slave nodes
|
||||||
|
|
||||||
|
If there are any errors, the script will report them and abort.
|
||||||
|
|
||||||
|
If you want to change settings (number of OpenStack nodes, CPU, RAM, HDD), please refer to "config.sh".
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# This script creates a master node for the product, launches its installation,
|
||||||
|
# and waits for its completion
|
||||||
|
#
|
||||||
|
|
||||||
|
# Include the handy functions to operate VMs and track ISO installation progress
|
||||||
|
source config.sh
|
||||||
|
source functions/vm.sh
|
||||||
|
source functions/product.sh
|
||||||
|
|
||||||
|
# Create master node for the product
|
||||||
|
name="${vm_name_prefix}master"
|
||||||
|
delete_vm $name
|
||||||
|
create_vm $name $hostonly_interface_name $vm_master_cpu_cores $vm_master_memory_mb $vm_master_disk_mb
|
||||||
|
mount_iso_to_vm $name $iso_path
|
||||||
|
|
||||||
|
# Start virtual machine with the master node
|
||||||
|
start_vm $name
|
||||||
|
|
||||||
|
# Wait until the machine gets installed and Puppet completes its run
|
||||||
|
wait_for_product_vm_to_install $vm_master_ip $vm_master_username $vm_master_password "$vm_master_prompt"
|
||||||
|
|
||||||
|
# Report success
|
||||||
|
echo "Master node has been installed."
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# This script performs initial check and configuration of the host system. It:
|
||||||
|
# - verifies that all available command-line tools are present on the host system
|
||||||
|
# - check that there is no previous installation of Fuel Web (if there is one, the script deletes it)
|
||||||
|
# - creates host-only network interfaces
|
||||||
|
#
|
||||||
|
# We are avoiding using 'which' because of http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script
|
||||||
|
#
|
||||||
|
|
||||||
|
# Include the script with handy functions to operate VMs and VirtualBox networking
|
||||||
|
source config.sh
|
||||||
|
source functions/vm.sh
|
||||||
|
source functions/network.sh
|
||||||
|
|
||||||
|
# Check for expect
|
||||||
|
echo -n "Checking for 'expect'... "
|
||||||
|
expect -v >/dev/null 2>&1 || { echo >&2 "'expect' is not available in the path, but it's required. Aborting."; exit 1; }
|
||||||
|
echo "OK"
|
||||||
|
|
||||||
|
# Check for VirtualBox
|
||||||
|
echo -n "Checking for 'VBoxManage'... "
|
||||||
|
VBoxManage -v >/dev/null 2>&1 || { echo >&2 "'VBoxManage' is not available in the path, but it's required. Likely, VirtualBox is not installed. Aborting."; exit 1; }
|
||||||
|
echo "OK"
|
||||||
|
|
||||||
|
# Check for ISO image to be available
|
||||||
|
echo -n "Checking for Fuel Web ISO image... "
|
||||||
|
if [ -z $iso_path ]; then
|
||||||
|
echo "Fuel Web image is not found. Please download it and put under 'iso' directory."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "OK"
|
||||||
|
|
||||||
|
# Delete all VMs from the previous Fuel Web installation
|
||||||
|
delete_vms_multiple $vm_name_prefix
|
||||||
|
|
||||||
|
# Delete all host-only interfaces
|
||||||
|
delete_all_hostonly_interfaces
|
||||||
|
|
||||||
|
# Create the required host-only interface
|
||||||
|
create_hostonly_interface $hostonly_interface_name $hostonly_interface_ip $hostonly_interface_mask
|
||||||
|
|
||||||
|
# Report success
|
||||||
|
echo "Setup is done."
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#
|
||||||
|
# This script creates slaves node for the product, launches its installation,
|
||||||
|
# and waits for its completion
|
||||||
|
#
|
||||||
|
|
||||||
|
# Include the handy functions to operate VMs
|
||||||
|
source config.sh
|
||||||
|
source functions/vm.sh
|
||||||
|
|
||||||
|
# Create and start slave nodes
|
||||||
|
for idx in $(seq 1 $cluster_size); do
|
||||||
|
name="${vm_name_prefix}slave-${idx}"
|
||||||
|
delete_vm $name
|
||||||
|
create_vm $name $hostonly_interface_name $vm_slave_cpu_cores $vm_slave_memory_mb $vm_slave_disk_mb
|
||||||
|
enable_network_boot_for_vm $name
|
||||||
|
start_vm $name
|
||||||
|
done
|
||||||
|
|
||||||
|
# Report success
|
||||||
|
echo "Slave nodes have been created. They will boot over PXE and get discovered by the master node."
|
||||||
|
echo "To access master node, please point your browser to:"
|
||||||
|
echo " http://${vm_master_ip}:8000/"
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# The number of nodes for installing OpenStack on
|
||||||
|
# - for minimal non-HA installation, specify 2 (1 controller + 1 compute)
|
||||||
|
# - for minimal HA installation, specify 4 (3 controllers + 1 compute)
|
||||||
|
cluster_size=2
|
||||||
|
|
||||||
|
# Get the first available ISO from the directory 'iso'
|
||||||
|
iso_path=`ls -1 iso/*.iso 2>/dev/null | head -1`
|
||||||
|
|
||||||
|
# Every Fuel Web machine name will start from this prefix
|
||||||
|
vm_name_prefix=fuel-web-
|
||||||
|
|
||||||
|
# This host-only interface will be created and all networking will be done throught it
|
||||||
|
hostonly_interface_name=vboxnet0
|
||||||
|
hostonly_interface_ip=10.20.0.1
|
||||||
|
hostonly_interface_mask=255.255.255.0
|
||||||
|
|
||||||
|
# Master node settings
|
||||||
|
vm_master_cpu_cores=1
|
||||||
|
vm_master_memory_mb=1024
|
||||||
|
vm_master_disk_mb=16384
|
||||||
|
vm_master_ip=10.20.0.2
|
||||||
|
vm_master_username=root
|
||||||
|
vm_master_password=r00tme
|
||||||
|
vm_master_prompt='root@nailgun ~]#'
|
||||||
|
|
||||||
|
# Slave node settings
|
||||||
|
vm_slave_cpu_cores=1
|
||||||
|
vm_slave_memory_mb=768 # PXE boot might not work with lower values
|
||||||
|
vm_slave_disk_mb=16384
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This file contains the functions to manage host-only interfaces in the system
|
||||||
|
|
||||||
|
get_hostonly_interfaces() {
|
||||||
|
echo -e `VBoxManage list hostonlyifs | grep '^Name' | sed 's/^Name\:[ \t]*//' | uniq`
|
||||||
|
}
|
||||||
|
|
||||||
|
is_hostonly_interface_present() {
|
||||||
|
name=$1
|
||||||
|
list=$(get_hostonly_interfaces)
|
||||||
|
|
||||||
|
# Check that the list of interfaces contains the given interface
|
||||||
|
if [[ $list = *$name* ]]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_hostonly_interface() {
|
||||||
|
name=$1
|
||||||
|
ip=$2
|
||||||
|
mask=$3
|
||||||
|
|
||||||
|
# Exit if the interface already exists (deleting it here is not safe, as VirtualBox creates hostonly adapters sequentially)
|
||||||
|
if is_hostonly_interface_present $name; then
|
||||||
|
echo "Fatal error. Interface $name cannot be created because it already exists. Exiting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create the interface
|
||||||
|
echo "Creating host-only interface: $name..."
|
||||||
|
VBoxManage hostonlyif create
|
||||||
|
|
||||||
|
# If it does not exist after creation, let's abort
|
||||||
|
if ! is_hostonly_interface_present $name; then
|
||||||
|
echo "Fatal error. Interface $name does not exist after creation. Exiting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Disable DHCP
|
||||||
|
echo "Disabling DHCP server on interface: $name..."
|
||||||
|
VBoxManage dhcpserver remove --ifname $name 2>/dev/null
|
||||||
|
|
||||||
|
# Set up IP address and network mask
|
||||||
|
echo "Configuring IP address $ip and network mask $mask on interface: $name..."
|
||||||
|
VBoxManage hostonlyif ipconfig $name --ip $ip --netmask $mask
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_all_hostonly_interfaces() {
|
||||||
|
list=$(get_hostonly_interfaces)
|
||||||
|
|
||||||
|
# Delete every single hostonly interface in the system
|
||||||
|
for interface in $list; do
|
||||||
|
echo "Deleting host-only interface: $interface..."
|
||||||
|
VBoxManage hostonlyif remove $interface
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This file contains the functions to connect to the product VM and see if it became operational
|
||||||
|
|
||||||
|
is_product_vm_operational() {
|
||||||
|
ip=$1
|
||||||
|
username=$2
|
||||||
|
password=$3
|
||||||
|
prompt=$4
|
||||||
|
|
||||||
|
# Log in into the VM, see if Puppet has completed its run
|
||||||
|
# Looks a bit ugly, but 'end of expect' has to be in the very beginning of the line
|
||||||
|
result=$(
|
||||||
|
expect << ENDOFEXPECT
|
||||||
|
spawn ssh -oConnectTimeout=5 -oStrictHostKeyChecking=no -oCheckHostIP=no -oUserKnownHostsFile=/dev/null $username@$ip
|
||||||
|
expect "connect to host" exit
|
||||||
|
expect "*?assword:*"
|
||||||
|
send "$password\r"
|
||||||
|
expect "$prompt"
|
||||||
|
send "grep -o 'Finished catalog run' /var/log/puppet/bootstrap_admin_node.log\r"
|
||||||
|
expect "$prompt"
|
||||||
|
ENDOFEXPECT
|
||||||
|
)
|
||||||
|
|
||||||
|
# When you are launching command in a sub-shell, there are issues with IFS (internal field separator)
|
||||||
|
# and parsing output as a set of strings. So, we are saving original IFS, replacing it, iterating over lines,
|
||||||
|
# and changing it back to normal
|
||||||
|
#
|
||||||
|
# http://blog.edwards-research.com/2010/01/quick-bash-trick-looping-through-output-lines/
|
||||||
|
OIFS="${IFS}"
|
||||||
|
NIFS=$'\n'
|
||||||
|
IFS="${NIFS}"
|
||||||
|
|
||||||
|
for line in $result; do
|
||||||
|
IFS="${OIFS}"
|
||||||
|
if [[ $line = Finished* ]]; then
|
||||||
|
return 0;
|
||||||
|
fi
|
||||||
|
IFS="${NIFS}"
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
wait_for_product_vm_to_install() {
|
||||||
|
ip=$1
|
||||||
|
username=$2
|
||||||
|
password=$3
|
||||||
|
prompt=$4
|
||||||
|
|
||||||
|
echo "Waiting for product VM to install. Please do NOT abort the script..."
|
||||||
|
|
||||||
|
# Loop until master node gets successfully installed
|
||||||
|
while ! is_product_vm_operational $ip $username $password "$prompt"; do
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,110 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This file contains the functions to manage VMs in through VirtualBox CLI
|
||||||
|
|
||||||
|
get_vm_base_path() {
|
||||||
|
echo -e `VBoxManage list systemproperties | grep '^Default machine folder' | sed 's/^Default machine folder\:[ \t]*//'`
|
||||||
|
}
|
||||||
|
|
||||||
|
get_vms_running() {
|
||||||
|
echo -e `VBoxManage list runningvms | sed 's/[ \t]*{.*}//' | sed 's/^"//' | sed 's/"$//'`
|
||||||
|
}
|
||||||
|
|
||||||
|
get_vms_present() {
|
||||||
|
echo -e `VBoxManage list vms | sed 's/[ \t]*{.*}//' | sed 's/^"//' | sed 's/"$//'`
|
||||||
|
}
|
||||||
|
|
||||||
|
is_vm_running() {
|
||||||
|
name=$1
|
||||||
|
list=$(get_vms_running)
|
||||||
|
|
||||||
|
# Check that the list of running VMs contains the given VM
|
||||||
|
if [[ $list = *$name* ]]; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_vm() {
|
||||||
|
name=$1
|
||||||
|
main_network_interface=$2
|
||||||
|
cpu_cores=$3
|
||||||
|
memory_mb=$4
|
||||||
|
disk_mb=$5
|
||||||
|
vm_base_path=$(get_vm_base_path)
|
||||||
|
vm_disk_path="$vm_base_path/$name/$name.vdi"
|
||||||
|
|
||||||
|
# Create virtual machine with the right name and type (assuming CentOS)
|
||||||
|
VBoxManage createvm --name $name --ostype RedHat_64 --register
|
||||||
|
|
||||||
|
# Set the real-time clock (RTC) operate in UTC time
|
||||||
|
VBoxManage modifyvm $name --rtcuseutc on --memory $memory_mb --cpus $cpu_cores
|
||||||
|
|
||||||
|
# Configure network interfaces
|
||||||
|
VBoxManage modifyvm $name --nic1 hostonly --hostonlyadapter1 $main_network_interface --nictype1 Am79C973 \
|
||||||
|
--cableconnected1 on --macaddress1 auto
|
||||||
|
VBoxManage controlvm $name setlinkstate1 on
|
||||||
|
|
||||||
|
# Configure storage controllers
|
||||||
|
VBoxManage storagectl $name --name 'IDE' --add ide
|
||||||
|
VBoxManage storagectl $name --name 'SATA' --add sata
|
||||||
|
|
||||||
|
# Create and attach the main hard drive
|
||||||
|
VBoxManage createhd --filename "$vm_base_path/$name/$name" --size $disk_mb --format VDI
|
||||||
|
VBoxManage storageattach $name --storagectl 'SATA' --port 0 --device 0 --type hdd --medium "$vm_disk_path"
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_vm() {
|
||||||
|
name=$1
|
||||||
|
vm_base_path=$(get_vm_base_path)
|
||||||
|
vm_path="$vm_base_path/$name/"
|
||||||
|
|
||||||
|
# Power off VM, if it's running
|
||||||
|
if is_vm_running $name; then
|
||||||
|
VBoxManage controlvm $name poweroff
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Virtualbox does not fully delete VM file structure, so we need to delete the corresponding directory with files as well
|
||||||
|
if [ -d "$vm_path" ]; then
|
||||||
|
echo "Deleting existing virtual machine $name..."
|
||||||
|
VBoxManage unregistervm $name --delete
|
||||||
|
rm -rf "$vm_path"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_vms_multiple() {
|
||||||
|
name_prefix=$1
|
||||||
|
list=$(get_vms_present)
|
||||||
|
|
||||||
|
# Loop over the list of VMs and delete them, if its name matches the given refix
|
||||||
|
for name in $list; do
|
||||||
|
if [[ $name == $name_prefix* ]]; then
|
||||||
|
echo "Found existing VM: $name. Deleting it..."
|
||||||
|
delete_vm $name
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
start_vm() {
|
||||||
|
name=$1
|
||||||
|
|
||||||
|
# Just start it
|
||||||
|
VBoxManage startvm $name --type headless
|
||||||
|
}
|
||||||
|
|
||||||
|
mount_iso_to_vm() {
|
||||||
|
name=$1
|
||||||
|
iso_path=$2
|
||||||
|
|
||||||
|
# Mount ISO to the VM
|
||||||
|
VBoxManage storageattach $name --storagectl "IDE" --port 0 --device 0 --type dvddrive --medium "$iso_path"
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_network_boot_for_vm() {
|
||||||
|
name=$1
|
||||||
|
|
||||||
|
# Set the right boot priority
|
||||||
|
VBoxManage modifyvm $name --boot1 disk --boot2 net --boot3 none --boot4 none --nicbootprio1 1
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Prepare the host system
|
||||||
|
./actions/prepare-environment.sh || exit 1
|
||||||
|
|
||||||
|
# Create and launch master node
|
||||||
|
./actions/master-node-create-and-install.sh || exit 1
|
||||||
|
|
||||||
|
# Create and launch slave nodes
|
||||||
|
./actions/slave-nodes-create-and-boot.sh || exit 1
|
||||||
|
|
Loading…
Reference in New Issue