#!/bin/bash # # Copyright (C) 2011, Red Hat, Inc. # Russell Bryant # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. # # # Print --help output and exit. # usage() { cat << EOF Set up a local MySQL database for use with openstack-nova. This script will create a 'nova' database that is accessible only on localhost by user 'nova' with password 'nova'. The setup of MySQL with a multi-server OpenStack installation is outside of the scope of this simple helper script. Usage: openstack-nova-db-setup [options] Options: --help | -h Print usage information. --novapw | -n Specify the password for the 'nova' MySQL user that nova will use to connect to the 'nova' MySQL database. By default, the password 'nova' will be used. --rootpw | -r Specify the root MySQL password. If the script installs the MySQL server, it will set the root password to this value instead of prompting for a password. If the MySQL server is already installed, this password will be used to connect to the database instead of having to prompt for it. --yes | -y In cases where the script would normally ask for confirmation before doing something, such as installing mysql-server, just assume yes. This is useful if you want to run the script non-interactively. EOF exit 0 } install_mysql_server() { if [ -z "${ASSUME_YES}" ] ; then yum install mysql-server else yum install -y mysql-server fi } start_mysql_server() { systemctl start mysqld.service } MYSQL_NOVA_PW_DEFAULT="nova" MYSQL_NOVA_PW=${MYSQL_NOVA_PW_DEFAULT} NOVA_CONFIG="/etc/nova/nova.conf" ASSUME_YES="" while [ $# -gt 0 ] do case "$1" in -h|--help) usage ;; -n|--novapw) shift MYSQL_NOVA_PW=${1} ;; -r|--rootpw) shift MYSQL_ROOT_PW=${1} ;; -y|--yes) ASSUME_YES="yes" ;; *) # ignore shift ;; esac shift done # Make sure MySQL is installed. NEW_MYSQL_INSTALL=0 if ! rpm -q mysql-server > /dev/null then if [ -z "${ASSUME_YES}" ] ; then printf "mysql-server is not installed. Would you like to install it now? (y/n): " read response case "$response" in y|Y) ;; n|N) echo "mysql-server must be installed. Please install it before proceeding." exit 0 ;; *) echo "Invalid response." exit 1 esac fi NEW_MYSQL_INSTALL=1 install_mysql_server fi # Make sure mysqld is running. if ! systemctl status mysqld.service > /dev/null then if [ -z "${ASSUME_YES}" ] ; then printf "mysqld is not running. Would you like to start it now? (y/n): " read response case "$response" in y|Y) ;; n|N) echo "mysqld must be running. Please start it before proceeding." exit 0 ;; *) echo "Invalid response." exit 1 esac fi start_mysql_server # If we both installed and started, ensure it starts at boot [ $NEW_MYSQL_INSTALL -eq 1 ] && chkconfig mysqld on fi # Get MySQL root access. if [ $NEW_MYSQL_INSTALL -eq 1 ] then if [ ! "${MYSQL_ROOT_PW+defined}" ] ; then echo "Since this is a fresh installation of MySQL, please set a password for the 'root' mysql user." PW_MATCH=0 while [ $PW_MATCH -eq 0 ] do printf "Enter new password for 'root' mysql user: " read -s MYSQL_ROOT_PW echo printf "Enter new password again: " read -s PW2 echo if [ "${MYSQL_ROOT_PW}" = "${PW2}" ] ; then PW_MATCH=1 else echo "Passwords did not match." fi done fi echo "UPDATE mysql.user SET password = password('${MYSQL_ROOT_PW}') WHERE user = 'root'; DELETE FROM mysql.user WHERE user = ''; flush privileges;" | mysql -u root if ! [ $? -eq 0 ] ; then echo "Failed to set password for 'root' MySQL user." exit 1 fi elif [ ! "${MYSQL_ROOT_PW+defined}" ] ; then printf "Please enter the password for the 'root' MySQL user: " read -s MYSQL_ROOT_PW echo fi # Sanity check MySQL credentials. MYSQL_ROOT_PW_ARG="" if [ "${MYSQL_ROOT_PW+defined}" ] then MYSQL_ROOT_PW_ARG="--password=${MYSQL_ROOT_PW}" fi echo "SELECT 1;" | mysql -u root ${MYSQL_ROOT_PW_ARG} > /dev/null if ! [ $? -eq 0 ] then echo "Failed to connect to the MySQL server. Please check your root user credentials." exit 1 fi echo "Verified connectivity to MySQL." # Now create the db. echo "Creating 'nova' database." cat << EOF | mysql -u root ${MYSQL_ROOT_PW_ARG} CREATE DATABASE nova; CREATE USER 'nova'@'localhost' IDENTIFIED BY '${MYSQL_NOVA_PW}'; CREATE USER 'nova'@'%' IDENTIFIED BY '${MYSQL_NOVA_PW}'; GRANT ALL ON nova.* TO 'nova'@'localhost'; GRANT ALL ON nova.* TO 'nova'@'%'; flush privileges; EOF # Make sure nova configuration has the right MySQL password. if [ "${MYSQL_NOVA_PW}" != "${MYSQL_NOVA_PW_DEFAULT}" ] ; then echo "Updating 'nova' database password in ${NOVA_CONFIG}" sed -i -e "s/mysql:\/\/nova:\(.*\)@/mysql:\/\/nova:${MYSQL_NOVA_PW}@/" ${NOVA_CONFIG} fi # Ask openstack-nova to sync the db. echo "Asking openstack-nova to sync the databse." nova-manage db sync # Do a final sanity check on the database. echo "SELECT * FROM migrate_version;" | mysql -u nova --password=${MYSQL_NOVA_PW} nova > /dev/null if ! [ $? -eq 0 ] then echo "Final sanity check failed. File a bug report on bugzilla.redhat.com against the openstack-nova package." exit 1 fi echo "Complete!"