
注意:本文只写了脚本,其中所需文件,请自行下载。
天翼云网盘:https://cloud.189.cn/t/zeqequF3Abey(访问码:jsk0)
123云盘:https://www.123pan.com/s/UToZjv-URYOd
1、controller节点脚本
#!/bin/bash
echo "------------------设置主机名-------------------------------"
echo ""
sleep 1
echo -n "请输入控制节点主机名:"
read host_name
echo -n "请输入计算节点主机名:"
read compute_host_name
echo -n "请输入存储节点主机名:"
read cinder_host_name
hostnamectl set-hostname $host_name
echo ""
echo "------------------设置IP-------------------------------"
echo ""
sleep 1
echo -n "请输入控制节点ip:"
read controller_ip
echo "$controller_ip $host_name" >> /etc/hosts
echo -n "请输入计算节点ip:"
read compute_ip
echo "$compute_ip $compute_host_name" >> /etc/hosts
echo -n "请输入存储节点ip:"
read cinder_ip
echo "$cinder_ip $cinder_host_name" >> /etc/hosts
echo -n "请输入控制节点外部网卡名称(比如eth0):"
read network_interface
echo -n "请输入控制节点隧道ip地址:"
read vm_tunnal_ip
echo -n "请输入时钟同步允许使用的网段:"
read chrony_ip_network
echo ""
echo "------------------设置数据库密码-------------------------------"
echo ""
echo "请在20秒内输入对应数据库密码,否则使用默认密码:000000"
echo ""
echo "密码输入完毕后,按Enter(回车键)确认"
sleep 5
# 数据库密码
read -p "请输入旧MariaDB root用户的密码(如果是第一次安装请忽略): " -t 20 old_password || { old_password=""; echo; }
read -p "请输入新MariaDB root用户的密码: " -t 20 mariadb_root_password || { mariadb_root_password="000000"; echo; }
read -p "keystone数据库密码: " -t 20 keystone_password || { keystone_password="000000"; echo; }
read -p "glance数据库密码: " -t 20 glance_password || { glance_password="000000"; echo; }
read -p "nova数据库密码: " -t 20 nova_password || { nova_password="000000"; echo; }
read -p "neutron数据库密码: " -t 20 neutron_password || { neutron_password="000000"; echo; }
read -p "cinder数据库密码: " -t 20 cinder_password || { cinder_password="000000"; echo; }
echo ""
# 平台密码
echo "------------------设置平台密码-------------------------------"
echo "请在20秒内输入对应平台密码,否则使用默认密码:000000"
echo ""
echo "密码输入完毕后,按Enter(回车键)确认"
sleep 5
read -p "admin用户密码: " -t 20 admin_password || { admin_password="000000"; echo; }
read -p "glance用户密码: " -t 20 glance_user_password || { glance_user_password="000000"; echo; }
read -p "nova用户密码: " -t 20 nova_user_password || { nova_user_password="000000"; echo; }
read -p "placement用户密码: " -t 20 placement_password || { placement_password="000000"; echo; }
read -p "neutron用户密码: " -t 20 neutron_user_password || { neutron_user_password="000000"; echo; }
read -p "openstack密码: " -t 20 openstack_password || { openstack_password="000000"; echo; }
read -p "cinder用户密码: " -t 20 cinder_user_password || { cinder_user_password="000000"; echo; }
echo ""
#关闭selinux和防火墙firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl stop firewalld.service
systemctl disable firewalld.service
currentDir="$(pwd)"
echo $currentDir
#配置yum源
echo "------------------配置yum源------------------"
echo ""
echo "请输入编号 (1 或 2)"
echo ""
echo -e "编号1:配置华为网络yum源 \n编号2:配置华为本地yum源"
echo ""
# 读取用户输入
read -p "请输入一个数字 (1 或 2): " input
# 检查输入是否为1或2
if [[ $input == "1" ]]; then
echo "你输入了编号:1,将配置华为网络yum源"
# 在这里添加与1相关的操作
rm -rf /etc/yum.repos.d/*
/bin/cp -f $currentDir/openstack_network.repo /etc/yum.repos.d/
elif [[ $input == "2" ]]; then
echo "你输入了编号:2,将配置华为本地yum源"
# 在这里添加与2相关的操作
yum install -y nfs*
rm -rf /etc/yum.repos.d/*
mount -o loop $currentDir/openstack.iso /mnt
/bin/cp -f $currentDir/openstack_local.repo /etc/yum.repos.d/
else
echo "无效的输入,请输入1或2"
exit 1
fi
#安装软件
echo "------------------安装软件-------------------------------"
sleep 1
sudo yum install -y python-openstackclient chrony mariadb mariadb-server python2-PyMySQL rabbitmq-server memcached python-memcached etcd openstack-keystone httpd mod_wsgi openstack-glance openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables openstack-dashboard openstack-cinder vim nfs* net-tools
# 检查用户输入是否为2
if [ "$input " == "2" ]; then
echo "-------------------配置NFs------------------------------"
sleep 1
echo '/mnt *(rw,sync,no_subtree_check,no_root_squash)' > /etc/exports
chmod 755 /mnt
# 启动 NFS 服务并设置开机自启
systemctl restart rpcbind
systemctl restart nfs
systemctl enable rpcbind
systemctl enable nfs
# 重新加载 NFS 配置
exportfs -r
echo "NFS 配置已完成。"
fi
#配置时钟源
echo "------------------配置时钟同步chrony-------------------------------"
sleep 1
echo "allow $chrony_ip_network" >> /etc/chrony.conf
echo "local stratum 10" >> /etc/chrony.conf
sudo systemctl enable chronyd.service
sudo systemctl restart chronyd.service
#配置数据库
echo "-----------------------配置mariaDB数据库 --------------------------"
sleep 1
/bin/cp -rf $currentDir/openstack.cnf /etc/my.cnf.d/
sed -i "s/controller_ip/$controller_ip/g" /etc/my.cnf.d/openstack.cnf
sudo systemctl daemon-reload
sudo systemctl enable mariadb.service
sudo systemctl restart mariadb.service
# 运行安全脚本,使用用户输入的密码
sudo mysql_secure_installation <<EOF
$old_password
y
$mariadb_root_password
$mariadb_root_password
y
y
y
y
EOF
#创建数据库
echo "-----------------------创建数据库 --------------------------"
sleep 1
#keystone
# 尝试创建数据库
mysql -uroot -p"$mariadb_root_password" -e "create DATABASE IF NOT EXISTS keystone;" 2>&1 | grep -q "ERROR 1007 (HY000): Can't create database 'keystone'; database exists"
# 检查上一条命令的退出状态
if [ $? -eq 0 ]; then
echo "Database already exists, continuing script."
else
# 检查是否有其他错误
if mysql -uroot -p"$mariadb_root_password" -e "create DATABASE IF NOT EXISTS keystone;" 2>&1 | grep -q "ERROR"; then
echo "An error occurred while creating the database. Stopping script."
exit 1
else
echo "Database created successfully."
fi
fi
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '$keystone_password';"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '$keystone_password';"
#glance
mysql -uroot -p"$mariadb_root_password" -e "create DATABASE glance;"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY '$glance_password';"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY '$glance_password';"
#nova
mysql -uroot -p"$mariadb_root_password" -e "CREATE DATABASE nova_api;"
mysql -uroot -p"$mariadb_root_password" -e "CREATE DATABASE nova;"
mysql -uroot -p"$mariadb_root_password" -e "CREATE DATABASE nova_cell0;"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '$nova_password';"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '$nova_password';"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '$nova_password';"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '$nova_password';"
mysql -uroot -p"$mariadb_root_password" -e "grant all privileges on nova_cell0.* to nova@localhost identified by '$nova_password';"
mysql -uroot -p"$mariadb_root_password" -e "grant all privileges on nova_cell0.* to 'nova'@'%' identified by '$nova_password';"
#neutron
mysql -uroot -p"$mariadb_root_password" -e "CREATE DATABASE neutron;"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '$neutron_password';"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '$neutron_password';"
#cinder
mysql -uroot -p"$mariadb_root_password" -e "create DATABASE cinder;"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY '$cinder_password';"
mysql -uroot -p"$mariadb_root_password" -e "GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY '$cinder_password';"
#安装rabbitmq-server
echo "-----------------------rabbitmq -------------------------"
sleep 1
mkdir -p /etc/rabbitmq
echo "NODENAME=rabbit@$host_name" > /etc/rabbitmq/rabbitmq-env.conf
rm -rf /var/lib/rabbitmq/mnesia/
systemctl enable rabbitmq-server.service
systemctl restart rabbitmq-server.service
echo ""
netstat -lantu |grep 5672
sleep 2
echo "-----------------------创建openstack用户-------------------------"
sleep 1
# 添加openstack用户
rabbitmqctl add_user openstack "$openstack_password"
if [ $? -ne 0 ]; then
echo "Error adding user openstack"
exit 1
fi
# 设置openstack用户的权限
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
if [ $? -ne 0 ]; then
echo "Error setting permissions for user openstack"
exit 1
fi
echo "rabbitmq安装和配置完成"
#echo "rabbitmqctl add_user openstack $openstack_password"
#printf "rabbitmqctl set_permissions openstack \".*\" \".*\" \".*\"\n"
sleep 5
#增加rabbitmq socket最大打开数
#echo "fs.file-max=1000000" >> /etc/sysctl.conf
#sysctl -p
#设置ulimit最大打开数
#echo "* soft nofile 655350" >> /etc/security/limits.conf
#echo "* hard nofile 655350" >> /etc/security/limits.conf
#设置systemctl管理的服务文件最大打开数为1024000
#echo "DefaultLimitNOFILE=1024000" >> /etc/systemd/system.conf
#echo "DefaultLimitNPROC=1024000" >> /etc/systemd/system.conf
#安装memcached
echo "-----------------------配置memcached ---------------------------"
sleep 1
/bin/cp -rf $currentDir/memcached /etc/sysconfig/
sed -i "s/host_name/$host_name/g" /etc/sysconfig/memcached
systemctl enable memcached.service
systemctl restart memcached.service
#安装ectd
#echo "-----------------------配置etcd - --------------------------"
#sleep 1
#yum install etcd -y
#/bin/cp -rf $currentDir/etcd.conf /etc/etcdsystemctl enable etcd
#systemctl start etcd
#systemctl enable etcd
#安装keystone
echo "-----------------------配置keystone ---------------------------"
sleep 1
/bin/cp -rf $currentDir/keystone/keystone.conf /etc/keystone
sed -i "s/keystone_password/$keystone_password/g" /etc/keystone/keystone.conf
sed -i "s/controller_ip/$controller_ip/g" /etc/keystone/keystone.conf
su -s /bin/sh -c "keystone-manage db_sync" keystone
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
keystone-manage bootstrap --bootstrap-password $admin_password --bootstrap-admin-url http://"$host_name":5000/v3/ --bootstrap-internal-url http://"$host_name":5000/v3/ --bootstrap-public-url http://"$host_name":5000/v3/ --bootstrap-region-id RegionOne
#配置Apache
#sed -i 's/#ServerName www.example.com:80/ServerName controller/g' /etc/httpd/conf/httpd.conf
echo "ServerName $host_name" >> /etc/httpd/conf/httpd.conf
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
systemctl enable httpd.service
systemctl restart httpd.service
sed -i "s/admin_password/$admin_password/g" $currentDir/openstack_admin
sed -i "s/host_name/$host_name/g" $currentDir/openstack_admin
source $currentDir/openstack_admin
openstack project create --domain default service
openstack role create user
#openstack token issue
#创建平台用户
echo "-----------------------创建平台用户--------------------------"
sleep 1
openstack user create --domain default glance --password $glance_user_password
openstack user create --domain default nova --password $nova_user_password
openstack user create --domain default placement --password $placement_password
openstack user create --domain default neutron --password $neutron_user_password
openstack user create --domain default cinder --password $cinder_user_password
echo "-----------------------配置glance --------------------------"
sleep 1
openstack role add --project service --user glance admin
openstack service create --name glance image
openstack endpoint create --region RegionOne image public http://$host_name:9292
openstack endpoint create --region RegionOne image internal http://$host_name:9292
openstack endpoint create --region RegionOne image admin http://$host_name:9292
/bin/cp -rf $currentDir/glance/glance-api.conf /etc/glance/
sed -i "s/glance_user_password/$glance_user_password/g" /etc/glance/glance-api.conf
sed -i "s/glance_password/$glance_password/g" /etc/glance/glance-api.conf
sed -i "s/controller_ip/$controller_ip/g" /etc/glance/glance-api.conf
/bin/cp -rf $currentDir/glance/glance-registry.conf /etc/glance/
sed -i "s/glance_user_password/$glance_user_password/g" /etc/glance/glance-registry.conf
sed -i "s/glance_password/$glance_password/g" /etc/glance/glance-registry.conf
sed -i "s/controller_ip/$controller_ip/g" /etc/glance/glance-registry.conf
su -s /bin/sh -c "glance-manage db_sync" glance
systemctl enable openstack-glance-api.service openstack-glance-registry.service
systemctl start openstack-glance-api.service openstack-glance-registry.service
echo "-----------------------配置nova --------------------------"
sleep 1
openstack role add --project service --user nova admin
openstack service create --name nova --description "OpenStack Compute" compute
openstack endpoint create --region RegionOne compute public http://$host_name:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://$host_name:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://$host_name:8774/v2.1
openstack service create --name placement placement
openstack role add --project service --user placement admin
openstack endpoint create --region RegionOne placement public http://$host_name:8778
openstack endpoint create --region RegionOne placement internal http://$host_name:8778
openstack endpoint create --region RegionOne placement admin http://$host_name:8778
/bin/cp -rf $currentDir/nova/nova.conf /etc/nova/
sed -i "s/local_constroller_ip/$controller_ip/g" /etc/nova/nova.conf
sed -i "s/openstack_password/$openstack_password/g" /etc/nova/nova.conf
sed -i "s/controller_ip/$controller_ip/g" /etc/nova/nova.conf
sed -i "s/nova_password/$nova_password/g" /etc/nova/nova.conf
sed -i "s/nova_user_password/$nova_user_password/g" /etc/nova/nova.conf
sed -i "s/neutron_user_password/$neutron_user_password/g" /etc/nova/nova.conf
sed -i "s/placement_password/$placement_password/g" /etc/nova/nova.conf
#添加配置来启用对Placement API的访问
/bin/cp -rf $currentDir/00-nova-placement-api.conf /etc/httpd/conf.d/00-nova-placement-api.conf
systemctl restart httpd
su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
su -s /bin/sh -c "nova-manage db sync" nova
systemctl enable openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
systemctl start openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
echo "---------------------------配置neutron -------------------------------"
sleep 1
openstack role add --project service --user neutron admin
openstack service create --name neutron --description "OpenStack Networking" network
openstack endpoint create --region RegionOne network public http://$host_name:9696
openstack endpoint create --region RegionOne network internal http://$host_name:9696
openstack endpoint create --region RegionOne network admin http://$host_name:9696
/bin/cp -rf $currentDir/neutron/dhcp_agent.ini /etc/neutron/
/bin/cp -rf $currentDir/neutron/l3_agent.ini /etc/neutron/
/bin/cp -rf $currentDir/neutron/metadata_agent.ini /etc/neutron/
sed -i "s/host_name/$host_name/g" /etc/neutron/metadata_agent.ini
/bin/cp -rf $currentDir/neutron/neutron.conf /etc/neutron/
sed -i "s/controller_ip/$controller_ip/g" /etc/neutron/neutron.conf
sed -i "s/openstack_password/$openstack_password/g" /etc/neutron/neutron.conf
sed -i "s/neutron_password/$neutron_password/g" /etc/neutron/neutron.conf
sed -i "s/neutron_user_password/$neutron_user_password/g" /etc/neutron/neutron.conf
sed -i "s/nova_user_password/$nova_user_password/g" /etc/neutron/neutron.conf
/bin/cp -rf $currentDir/neutron/plugins/ml2/linuxbridge_agent.ini /etc/neutron/plugins/ml2/
/bin/cp -rf $currentDir/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugins/ml2/
sed -i "s/eth0/$network_interface/g" /etc/neutron/plugins/ml2/linuxbridge_agent.ini
sed -i "s/vm_tunnal_ip/$vm_tunnal_ip/g" /etc/neutron/plugins/ml2/linuxbridge_agent.ini
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
#配置/usr/lib/sysctl.d/00-system.conf
/bin/cp -f $currentDir/00-system.conf /usr/lib/sysctl.d/00-system.conf
/bin/cp -rf $currentDir/sysctl.conf /etc/sysctl.conf
modprobe br_netfilter
/sbin/sysctl -p
/bin/cp -rf $currentDir/rc.sysinit /etc/
/bin/cp -rf $currentDir/br_netfilter.modules /etc/sysconfig/modules/
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
lsmod |grep br_netfilter
su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
systemctl restart openstack-nova-api.service
systemctl enable neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-agent.service
systemctl restart neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service neutron-l3-agent.service
echo "--------------------------配置cinder -------------------------------"
sleep 1
openstack role add --project service --user cinder admin
openstack service create --name cinderv2 volumev2
openstack service create --name cinderv3 volumev3
openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 public http://controller:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 internal http://controller:8776/v3/%\(project_id\)s
openstack endpoint create --region RegionOne volumev3 admin http://controller:8776/v3/%\(project_id\)s
#配置cinder
/bin/cp -rf /etc/cinder/cinder.conf /etc/cinder/cinder.conf.bak
/bin/cp -rf $currentDir/cinder.conf /etc/cinder/cinder.conf
sed -i "s/openstack_password/$openstack_password/g" /etc/cinder/cinder.conf
sed -i "s/controller_ip/$controller_ip/g" /etc/cinder/cinder.conf
sed -i "s/cinder_password/$cinder_password/g" /etc/cinder/cinder.conf
sed -i "s/cinder_user_password/$cinder_user_password/g" /etc/cinder/cinder.conf
sed -i "s/cinder_ip/$cinder_ip/g" /etc/cinder/cinder.conf
su -s /bin/sh -c "cinder-manage db sync" cinder
systemctl restart openstack-nova-api.service openstack-cinder-api.service openstack-cinder-scheduler.service
systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
echo "---------------------------配置horizon -------------------------------"
sleep 1
/bin/cp -rf $currentDir/openstack-dashboard/local_settings /etc/openstack-dashboard/
sed -i "s/host_name/$host_name/g" /etc/openstack-dashboard/local_settings
#echo "-----------------------配置horizon (DIY)-------------------------------"
#sleep 1
#/bin/cp -rf $currentDir/openstack-dashboard/DIY/_splash.html /usr/share/openstack-dashboard/openstack_dashboard/themes/material/templates/auth
#/bin/cp -rf $currentDir/openstack-dashboard/DIY/images/favicon.ico /usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img
#/bin/cp -rf $currentDir/openstack-dashboard/DIY/images/xf-logo-english.png /usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img
#/bin/cp -rf $currentDir/openstack-dashboard/DIY/images/xf-logo-white.png /usr/share/openstack-dashboard/openstack_dashboard/static/dashboard/img
systemctl restart httpd.service memcached.service
#创建外部网络
echo "---------------------------创建外部网络和镜像-------------------------------"
sleep 1
openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider
openstack image create "cirros" --file $currentDir/cirros-0.4.0-x86_64-disk.img --disk-format qcow2 --container-format bare --public
echo "改镜像属性:openstack image set --property hw_disk_bus=ide --property hw_vif_model=e1000 镜像id"
#检测
echo "---------------------------检测-------------------------------"
sleep 1
echo "查看计算组件(三条)"
openstack compute service list
sleep 3
echo ""
echo "查看glance组件(一条)"
openstack image list
sleep 3
echo ""
echo "查看代理服务(四条)"
openstack network agent list
sleep 3
echo ""
echo "您可以使用以下网址访问您的私有云平台:"
echo ""
echo "http://$controller_ip/dashboard"
echo ""
2、computer节点脚本
#!/bin/bash
#基础信息设置
echo "---------------------------设置主机名(与控制节点相同)-------------------------------"
echo ""
sleep 1
echo -n "请输入控制节点主机名:"
read host_name
echo -n "请输入计算节点主机名:"
read compute_host_name
hostnamectl set-hostname $compute_host_name
echo -n "请输入存储节点主机名:"
read cinder_host_name
echo ""
echo "---------------------------设置IP(与控制节点相同)-------------------------------"
echo ""
sleep 1
echo -n "请输入控制节点ip:"
read controller_ip
echo "$controller_ip $host_name" >> /etc/hosts
echo -n "请输入计算节点ip:"
read compute_ip
echo "$compute_ip $compute_host_name" >> /etc/hosts
echo -n "请输入存储节点ip:"
read cinder_ip
echo "$cinder_ip $cinder_host_name" >> /etc/hosts
echo -n "请输入计算节点隧道ip:"
read vm_tunnal_ip
echo ""
echo "---------------------------设置平台密码(与控制节点相同)-------------------------------"
echo ""
echo "请在20秒内输入对应平台密码且与控制节点输入的平台密码一致(若控制节点未输入密码,请忽略)"
echo ""
echo "密码输入完毕后,按Enter(回车键)确认"
sleep 3
#平台密码
read -p "nova用户密码: " -t 20 nova_user_password || { nova_user_password="000000"; echo; }
read -p "placement用户密码: " -t 20 placement_password || { placement_password="000000"; echo; }
read -p "openstack密码: " -t 20 openstack_password || { openstack_password="000000"; echo; }
read -p "neutron用户密码: " -t 20 neutron_user_password || { neutron_user_password="000000"; echo; }
#关闭selinux和防火墙firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl stop firewalld.service
systemctl disable firewalld.service
currentDir="$(pwd)"
echo $currentDir
#配置yum源
echo "------------------配置yum源------------------"
echo "请输入编号 (1 或 2)"
echo ""
echo -e "编号1:配置华为网络yum源 \n编号2:配置华为本地yum源"
echo ""
# 读取用户输入
read -p "请输入一个数字 (1 或 2): " input
# 检查输入是否为1或2
if [[ $input == "1" ]]; then
echo "你输入了编号:1,将配置华为网络yum源"
# 在这里添加与1相关的操作
rm -rf /etc/yum.repos.d/*
/bin/cp -f "$currentDir/openstack_network.repo" /etc/yum.repos.d/
elif [[ $input == "2" ]]; then
echo "你输入了编号:2,将配置华为本地yum源"
# 在这里添加与2相关的操作
mkdir -p /guazai
mount $currentDir/nfs.iso /guazai
rm -rf /etc/yum.repos.d/*
/bin/cp -f "$currentDir/nfs.repo" /etc/yum.repos.d/
yum clean all
yum repolist
sudo yum install -y "nfs*"
sleep 2
umount /guazai
rm -rf /guazai
# 假设$controller_ip已经设置
if mount "$controller_ip:/mnt" /mnt; then
echo "已挂载"
else
echo "挂载失败"
exit 1 # 非零退出状态表示错误
fi
# 如果挂载成功,则执行以下命令
rm -rf /etc/yum.repos.d/*
/bin/cp -f "$currentDir/openstack_local.repo" /etc/yum.repos.d/
else
echo "无效的输入,请输入1或2"
exit 1
fi
#安装软件
echo "---------------------------------安装软件-------------------------------------"
sleep 1
sudo yum -y install chrony openstack-neutron-linuxbridge ebtables ipset openstack-nova-compute vim
#配置安装源
#yum install centos-release-openstack-queens -y
#配置时钟源
sed -i 's/^server.*$//g' /etc/chrony.conf
sed -i "N;2aserver $host_name iburst" /etc/chrony.conf
/bin/cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
systemctl enable chronyd.service
systemctl start chronyd.service
#安装计算节点nova服务
echo "-------------------配置 nova ------------------------"
sleep 1
/bin/cp -f /etc/nova/nova.conf /etc/nova/nova.conf.bak
/bin/cp -f $currentDir/nova/nova.conf /etc/nova/
sed -i "s/compute_ip/${compute_ip}/g" /etc/nova/nova.conf
sed -i "s/host_name/$host_name/g" /etc/nova/nova.conf
sed -i "s/openstack_password/$openstack_password/g" /etc/nova/nova.conf
sed -i "s/placement_password/$placement_password/g" /etc/nova/nova.conf
sed -i "s/nova_user_password/$nova_user_password/g" /etc/nova/nova.conf
sed -i "s/neutron_user_password/$neutron_user_password/g" /etc/nova/nova.conf
sed -i "s/controller_ip/$controller_ip/g" /etc/nova/nova.conf
systemctl enable libvirtd.service openstack-nova-compute.service
systemctl start libvirtd.service openstack-nova-compute.service
#安装计算节点neutron服务
echo "-----------------------配置 neutron ------------------------"
sleep 1
/bin/cp -f /etc/neutron/neutron.conf /etc/neutron/neutron.conf.bak
/bin/cp -f $currentDir/neutron/neutron.conf /etc/neutron/
sed -i "s/host_name/$host_name/g" /etc/neutron/neutron.conf
sed -i "s/openstack_password/$openstack_password/g" /etc/neutron/neutron.conf
sed -i "s/nova_user_password/$nova_user_password/g" /etc/neutron/neutron.conf
sed -i "s/neutron_user_password/$neutron_user_password/g" /etc/neutron/neutron.conf
/bin/cp -f /etc/neutron/plugins/ml2/linuxbridge_agent.ini /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak
/bin/cp -f $currentDir/neutron/plugins/ml2/linuxbridge_agent.ini /etc/neutron/plugins/ml2/
sed -i "s/eth0/${network_interface}/g" /etc/neutron/plugins/ml2/linuxbridge_agent.ini
sed -i "s/vm_tunnal_ip/${vm_tunnal_ip}/g" /etc/neutron/plugins/ml2/linuxbridge_agent.ini
/bin/cp -f $currentDir/00-system.con /usr/lib/sysctl.d/00-system.conf
/bin/cp -f $currentDir/sysctl.conf /etc/sysctl.conf
modprobe br_netfilter
/sbin/sysctl -p
/bin/cp -rf $currentDir/rc.sysinit /etc/
/bin/cp -rf $currentDir/br_netfilter.modules /etc/sysconfig/modules/
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
lsmod |grep br_netfilter
systemctl enable neutron-linuxbridge-agent.service
systemctl restart neutron-linuxbridge-agent.service
echo "filter = [ "a/sda/", "r/.*/"]" >> /etc/lvm/lvm.conf
echo ""
echo "您的计算节点已经部署完毕,谢谢!"
echo ""
echo "请回到控制节点,执行以下命令,做计算cell1注册:"
echo ""
echo "nova-manage cell_v2 discover_hosts --verbose"
echo ""
3、cinder节点脚本
#!/bin/bash
echo "-------------------------设置主机名(与控制节点相同)-------------------------------"
sleep 1
echo -n "请输入控制节点主机名:"
read host_name
echo -n "请输入计算节点主机名:"
read compute_host_name
echo -n "请输入存储节点主机名:"
read cinder_host_name
hostnamectl set-hostname $cinder_host_name
echo ""
echo "-------------------------设置IP(与控制节点相同)-------------------------------"
echo ""
sleep 1
echo -n "请输入控制节点ip:"
read controller_ip
echo "$controller_ip $host_name" >> /etc/hosts
echo -n "请输入计算节点ip:"
read compute_ip
echo "$compute_ip $compute_host_name" >> /etc/hosts
echo -n "请输入存储节点ip:"
read cinder_ip
echo "$cinder_ip $cinder_host_name" >> /etc/hosts
echo ""
echo "-------------------------设置数据库密码(与控制节点相同)-------------------------------"
echo ""
echo "请在20秒内输入对应数据库密码且与控制节点输入的数据库密码一致(若控制节点未输入密码,请忽略)"
echo ""
echo "密码输入完毕后,按Enter(回车键)确认"
sleep 3
#数据库密码
read -p "cinder数据库密码: " -t 20 cinder_password || { cinder_password="000000"; echo; }
echo ""
echo "------------------------设置平台密码(与控制节点相同)-------------------------------"
echo ""
echo "请在20秒内输入对应平台密码且与控制节点输入的平台密码一致(若控制节点未输入密码,请忽略)"
echo ""
echo "密码输入完毕后,按Enter(回车键)确认"
sleep 3
#平台密码
read -p "cinder用户密码: " -t 20 cinder_user_password || { cinder_user_password="000000"; echo; }
read -p "openstack密码: " -t 20 openstack_password || { openstack_password="000000"; echo; }
#关闭selinux和防火墙firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl stop firewalld.service
systemctl disable firewalld.service
currentDir="$(pwd)"
echo $currentDir
#配置yum源
echo "------------------配置yum源------------------"
echo ""
echo "请输入编号 (1 或 2)"
echo ""
echo -e "编号1:配置华为网络yum源 \n编号2:配置华为本地yum源"
echo ""
# 读取用户输入
read -p "请输入一个数字 (1 或 2): " input
# 检查输入是否为1或2
if [[ $input == "1" ]]; then
echo "你输入了编号:1,将配置华为网络yum源"
# 在这里添加与1相关的操作
rm -rf /etc/yum.repos.d/*
/bin/cp -f "$currentDir/openstack_network.repo" /etc/yum.repos.d/
elif [[ $input == "2" ]]; then
echo "你输入了编号:2,将配置华为本地yum源"
# 在这里添加与2相关的操作
mkdir -p /guazai
mount $currentDir/nfs.iso /guazai
rm -rf /etc/yum.repos.d/*
/bin/cp -f "$currentDir/nfs.repo" /etc/yum.repos.d/
yum clean all
yum repolist
sudo yum install -y "nfs*"
sleep 2
umount /guazai
rm -rf /guazai
# 假设$controller_ip已经设置
if mount "$controller_ip:/mnt" /mnt; then
echo "已挂载"
else
echo "挂载失败"
exit 1 # 非零退出状态表示错误
fi
# 如果挂载成功,则执行以下命令
rm -rf /etc/yum.repos.d/*
/bin/cp -f "$currentDir/openstack_local.repo" /etc/yum.repos.d/
else
echo "无效的输入,请输入1或2"
exit 1
fi
#安装软件
echo "----------------------------安装软件-------------------------------"
sleep 1
sudo yum install -y lvm2 device-mapper-persistent-data centos-release-openstack-queens openstack-cinder targetcli python-keystone chrony*
sleep 2
systemctl enable lvm2-lvmetad.service
systemctl start lvm2-lvmetad.service
#逻辑卷
echo "---------------------------配置vgcreate-------------------------------"
sleep 1
# 声明一个关联数组来存储设备和编号
declare -A devices
# 初始化计数器变量
counter=1
# 获取当前系统中所有的磁盘设备
disks=$(lsblk -o NAME -n -p -d | grep -vE "/dev/sr0|/dev/ram|loop")
# 检查每个磁盘设备是否已被挂载和分区
for disk in $disks; do
mountpoint=$(lsblk -o MOUNTPOINT -n $disk)
if [ -z "$mountpoint" ]; then
# 将编号和磁盘名存储到关联数组中
devices[$counter]=$disk
((counter++))
fi
done
# 打印所有未挂载的磁盘和它们的编号
echo "未挂载的磁盘设备及其编号:"
for key in "${!devices[@]}"; do
echo "编号 $key: ${devices[$key]}"
done
# 设置5秒的超时时间
read -p "请输入磁盘设备的编号 (5秒内输入,否则将使用编号1): " -t 5 user_input
# 检查用户是否输入了内容
if [[ -z "$user_input" ]]; then
# 用户没有输入,使用默认编号1
user_input=1
echo "未在5秒内输入编号,将使用默认编号1。"
fi
# 检查用户输入的编号是否有效
if [[ -z "${devices[$user_input]}" ]]; then
echo "无效的编号,请输入一个有效的编号。"
exit 1 # 退出脚本
else
# 打印出对应的设备名
echo "使用设备: ${devices[$user_input]}"
pvcreate "${devices[$user_input]}"
vgcreate cinder-volumes "${devices[$user_input]}"
# 获取磁盘设备名称的部分,并更新lvm.conf
DEVICE="${devices[$user_input]}"
SDB_ONLY=$(echo $DEVICE | cut -d/ -f3)
/bin/cp -rf /etc/lvm/lvm.conf /etc/lvm/lvm.conf.bak
echo "filter = [ \"a/sda/\",\"a/$SDB_ONLY/\",\"r/.*/\" ]" >> /etc/lvm/lvm.conf
fi
#配置时钟源
sed -i 's/^server.*$//g' /etc/chrony.conf
sed -i "N;2aserver $host_name iburst" /etc/chrony.conf
/bin/cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
systemctl enable chronyd.service
systemctl start chronyd.service
#配置cinder
echo "----------------------------------配置cinder-----------------------------"
sleep 1
/bin/cp -rf /etc/cinder/cinder.conf /etc/cinder/cinder.conf.bak
/bin/cp -rf $currentDir/cinder.conf /etc/cinder/cinder.conf
sed -i "s/openstack_password/$openstack_password/g" /etc/cinder/cinder.conf
sed -i "s/controller_ip/$controller_ip/g" /etc/cinder/cinder.conf
sed -i "s/cinder_password/$cinder_password/g" /etc/cinder/cinder.conf
sed -i "s/cinder_user_password/$cinder_user_password/g" /etc/cinder/cinder.conf
sed -i "s/cinder_ip/$cinder_ip/g" /etc/cinder/cinder.conf
systemctl restart openstack-cinder-volume.service target.service
systemctl enable openstack-cinder-volume.service target.service
echo ""
echo "您的存储节点已经部署完毕,谢谢!"
echo ""
echo "请回到控制节点,执行以下命令,查看:"
echo ""
echo "openstack volume service list"
echo ""