0x01
刚好有需要,就自己写了一个shell来自动化安装部署openstack-nova组件
ishells!
0x02
踩坑:
1、nova的配置文件全部是被注释的,有的需要更改的字段是被注释了,有的需要更改的字段根本就没有!这就导致使用sed匹配注释行进行更改配置文件的话,可能有的匹配不到
2、如果进行[ ]匹配,一定要使用正则把行首行尾匹配上,不然配置文件可能多处出现所匹配字段
3、在运行nova-compute服务前一定要确认两台虚拟机的防火墙已经关掉!!!一定要确认两台虚拟机的防火墙已经关掉!!!一定要确认两台虚拟机的防火墙已经关掉!!!
4、脚本已经测试,放心食用,所有1790600080处修改为自己的密码,controller-ZJB修改为自己的主机名
0x03
思路:
1、修改配置文件时使用cat -n首先将配置文件全部输出,然后使用grep + RE匹配到[],在使用awk '{print $1}'获取到[ ]的行数
2、在使用sed -i根据行数进行直接插入
3、每插入一行都会导致行数发生变化,所以获取行数要紧挨着sed
4、多行插入可以使用内置计算器expr行数+1即可
0x04:(controller节点代码)
#!/bin/bash
#This is a script for editing nova-controller file
# 如果你需要使用此脚本,将主机名controller-ZJB修改为你的主机名
# 所有1790600080处修改为自己的密码
readonly create_domain_pass=1790600080
readonly create_user_pass=1790600080
echo " 这是一个一键配置Nova-Controller组件的脚本:"
echo " --------------------------------"
echo " 1、下面开始创建数据库并赋予相应权限……"
mysql -uroot -p1790600080 <<EOF
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
CREATE DATABASE placement;
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '1790600080';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '1790600080';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '1790600080';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '1790600080';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY '1790600080';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY '1790600080';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY '1790600080';
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY '1790600080';
EOF
echo " --------------------------------"
echo " 数据库已创建成功并赋予了相应权限"
echo " --------------------------------"
echo " 2、创建Compute服务凭证:"
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=1790600080
export OS_AUTH_URL=http://controller-ZJB:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
openstack user create --domain default --password $create_domain_pass nova
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://controller-ZJB:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://controller-ZJB:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://controller-ZJB:8774/v2.1
openstack user create --domain default --password $create_user_pass placement
openstack role add --project service --user placement admin
openstack service create --name placement --description "Placement API" placement
openstack endpoint create --region RegionOne placement public http://controller-ZJB:8778
openstack endpoint create --region RegionOne placement internal http://controller-ZJB:8778
openstack endpoint create --region RegionOne placement admin http://controller-ZJB:8778
echo " --------------------------------"
echo " Compute服务凭证已创建完成!"
echo " 3、安装软件包……"
yum -y install openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler openstack-nova-placement-api
echo " --------------------------------"
if [ $? == 0 ];then
echo " 软件已成功安装!"
else
echo " 软件安装出错,请手动查看问题!"
fi
echo " --------------------------------"
echo " 4、修改Nova配置文件:"
echo " "
read -p " 是否选择一键修改Nova配置文件(y/n)" answer
#判断/etc/nova/nova.conf文件是否存在,不存在直接输出错误
if [ $answer == "y" ];then
ls /etc/nova/nova.conf &>/dev/null
if [ $? == 0 ];then
# 第一次尝试全部插入,多处出现则会插入到多处
# sed -i '/\[DEFAULT\]/a\enabled_apis = osapi_compute,metadata' /etc/nova/nova.conf
# sed -i '/\[api_database\]/a\connection = mysql+pymysql://nova:1790600080@controller-ZJB/nova_api' /etc/nova/nova.conf
# sed -i '/\[database\]/a\connection = mysql+pymysql://nova:1790600080@controller-ZJB/nova' /etc/nova/nova.conf
# sed -i '/\[placement_database\]/a\connection = mysql+pymysql://placement:1790600080@controller-ZJB/placement' /etc/nova/nova.conf
# sed -i '/\[DEFAULT\]/a\transport_url = rabbit://ZJB:1790600080@controller-ZJB' /etc/nova/nova.conf
# sed -i '/\[api\]/a\auth_strategy = keystone' /etc/nova/nova.conf
# sed -i '/\[keystone_authtoken\]/a\www_authenticate__uri = http://controller-ZJB:5000/\nauth_url = http://controller-ZJB:5000/v3\nmemcached_servers = controller-ZJB:11211\nauth_type = password\nproject_domain_name = Default\nuser_domain_name = Default\nproject_name = service\nusername = nova\npassword =1790600080' /etc/nova/nova.conf
# sed -i '/\[DEFAULT\]/a\my_ip = 192.168.52.100\nuse_neutron = true\nfirewall_driver = nova.virt.firewall.NoopFirewallDriver' /etc/nova/nova.conf
# sed -i '/\[vnc\]/a\enabled = true\nserver_listen = $my_ip\nserver_proxyclient_address = $my_ip' /etc/nova/nova.conf
# sed -i '/\[glance\]/a\api_servers = http://controller-ZJB:9292' /etc/nova/nova.conf
# sed -i '/\[placement\]/a\region_name = RegionOne\nproject_domain_name = Default\nproject_name = service\nauth_type = password\nuser_domain_name = Default\nauth_url = http://controller-ZJB:5000/v3\nusername = placement\npassword =1790600080' /etc/nova/nova.conf
#第二次尝试,对照源配置文件,#字段仅出现一次就选择替换,有的#字段在多个【】地方都会出现,也不行
# sed -ie '/\[DEFAULT\]/a\enabled_apis = osapi_compute,metadata' /etc/nova/nova.conf
# sed -ie 's/^#connection=mysql:\/\/nova:nova@localhost\/nova/connection = mysql+pymysql:\/\/nova:1790600080@controller-ZJB\/nova_api/g' /etc/nova/nova.conf
# sed -ie 's/^#connection=mysql:\/\/nova:nova@localhost\/nova/connection = mysql+pymysql:\/\/nova:1790600080@controller-ZJB\/nova_api/g' /etc/nova/nova.conf
# sed -ie '/\[placement_database\]/a\connection = mysql+pymysql://placement:1790600080@controller-ZJB/placement' /etc/nova/nova.conf
# sed -ie 's/^#transport_url=<None>/transport_url = rabbit:\/\/openstack:1790600080@controller-ZJB' /etc/nova/nova.conf
# sed -ie 's/^#auth_strategy=keystone/auth_strategy=keystone/g' /etc/nova/nova.conf
# 此处[keystone_authtoken]出现了多次,如果使用插入的话会在多处插入!
# 多次尝试之后,决定通过行数向里添加内容,如sed -ie 'N;8a我要做运维' test.txt 即在test.txt文件第8行后添加"我要做运维",a换成i即为第8行前
# sed -i '/\[keystone_authtoken\]/a\www_authenticate__uri = http://controller-ZJB:5000/\nauth_url = http://controller-ZJB:5000/v3\nmemcached_servers = controller-ZJB:11211\nauth_type = password\nproject_domain_name = Default\nuser_domain_name = Default\nproject_name = service\nusername = nova\npassword =1790600080' /etc/nova/nova.conf
#
# sed -ie 's/^#www_authenticate_uri=<None>/www_authenticate__uri = http:\/\/controller-ZJB:5000\//g'
# sed -ie 's/^#auth_uri=<None>/auth_url = http:\/\/controller-ZJB:5000\/v3/g' /etc/nova/nova.conf
# sed -ie 's/^#memcached_servers=<None>/memcached_servers = controller-ZJB:11211/g' /etc/nova/nova.conf
# sed -ie 's/^/g' /etc/nova/nova.conf
# 第三次直接根据未修改配置文件的行数进行插入数据,如sed -ie 'N;8a我要做运维' test.txt 即在test.txt文件第8行后添加"我要做运维",a换成i即为第8行前
# 如果根据行数修改的sed -i 'N;' 需要使用变量需要将格式变为 sed -i $变量'a需要添加的字符'
# 所以定义了变量值获取特定行的行数,然后sed使用变量,并根据变量行数值修改文件,如 api_start_line=`cat -n test.txt | grep "\[api\]$" | awk '{print $1}'`
#
# [DEFAULT]也会多次出现,所以也选择先获取行号在根据行号插入
DEFAULT_line=`cat -n /etc/nova/nova.conf | grep "\[DEFAULT\]$" | awk '{print $1}'`
sed -i $DEFAULT_line'a\enabled_apis = osapi_compute,metadata' /etc/nova/nova.conf
sed -i `expr $DEFAULT_line + 1`'a\transport_url = rabbit://ZJB:1790600080@controller-ZJB' /etc/nova/nova.conf
sed -i `expr $DEFAULT_line + 2`'a\enabled_apis = osapi_compute,metadata' /etc/nova/nova.conf
sed -i `expr $DEFAULT_line + 3`'a\my_ip = 192.168.52.100\nuse_neutron = true\nfirewall_driver = nova.virt.firewall.NoopFirewallDriver' /etc/nova/nova.conf
# 其余部分可以根据行号插入,首先通过一个变量获取行号,在使用sed根据行数添加
api_database_line=`cat -n /etc/nova/nova.conf | grep "\[api_database\]$" | awk '{print $1}'`
sed -i $api_database_line'a\connection = mysql+pymysql://nova:1790600080@controller-ZJB/nova_api' /etc/nova/nova.conf
database_line=`cat -n /etc/nova/nova.conf | grep "\[database\]$" | awk '{print $1}'`
sed -i $database_line'a\connection = mysql+pymysql://nova:1790600080@controller-ZJB/nova' /etc/nova/nova.conf
placement_database_line=`cat -n /etc/nova/nova.conf | grep "\[placement_database\]$" | awk '{print $1}'`
sed -i $placement_database_line'a\connection = mysql+pymysql://placement:1790600080@controller-ZJB/placement' /etc/nova/nova.conf
api_line=`cat -n /etc/nova/nova.conf | grep "\[api\]$" | awk '{print $1}'`
sed -i $api_line'a\auth_strategy = keystone' /etc/nova/nova.conf
keystone_authtoken_line=`cat -n /etc/nova/nova.conf | grep "\[keystone_authtoken\]$" | awk '{print $1}'`
sed -i $keystone_authtoken_line'a\auth_url = http://controller-ZJB:5000/v3' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 1`'a\memcached_servers = controller-ZJB:11211' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 2`'a\auth_type = password' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 3`'a\project_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 4`'a\user_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 5`'a\project_name = service' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 6`'a\username = nova' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 7`'a\password = 1790600080' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 8`'a\' /etc/nova/nova.conf
vnc_line=`cat -n /etc/nova/nova.conf | grep "\[vnc\]$" | awk '{print $1}'`
sed -i $vnc_line'a\enabled = true' /etc/nova/nova.conf
sed -i `expr $vnc_line + 1`'a\server_listen = $my_ip' /etc/nova/nova.conf
sed -i `expr $vnc_line + 2`'a\server_proxyclient_address = $my_ip' /etc/nova/nova.conf
glance_line=`cat -n /etc/nova/nova.conf | grep "\[glance\]$" | awk '{print $1}'`
sed -i $glance_line'a\api_servers = http://controller-ZJB:9292' /etc/nova/nova.conf
oslo_concurrency_line=`cat -n /etc/nova/nova.conf | grep "\[oslo_concurrency\]$" | awk '{print $1}'`
sed -i $oslo_concurrency_line'a\lock_path = /var/lib/nova/tmp' /etc/nova/nova.conf
placement_line=`cat -n /etc/nova/nova.conf | grep "\[placement\]$" | awk '{print $1}'`
sed -i $placement_line'a\region_name = RegionOne' /etc/nova/nova.conf
sed -i `expr $placement_line + 1`'a\project_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $placement_line + 2`'a\project_name = service' /etc/nova/nova.conf
sed -i `expr $placement_line + 3`'a\auth_type = password' /etc/nova/nova.conf
sed -i `expr $placement_line + 4`'a\user_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $placement_line + 5`'a\auth_url = http://controller-ZJB:5000/v3' /etc/nova/nova.conf
sed -i `expr $placement_line + 6`'a\username = placement' /etc/nova/nova.conf
sed -i `expr $placement_line + 7`'a\password = 1790600080' /etc/nova/nova.conf
echo " 1、/etc/nova/nova.conf文件已修改完毕"
else
echo "/etc/nova/nova.conf文件不存在!"
fi
#判断/etc/httpd/conf.d/00-nova-placement-api.conf文件是否存在,不存在直接输出错误
ls /etc/httpd/conf.d/00-nova-placement-api.conf &>/dev/null
if [ $? == 0 ]; then
# cat >> /etc/httpd/conf.d/00-nova-placement-api.conf <<EOF
# <Directory /usr/bin>
# <IfVersion >= 2.4>
# Require all granted
# </IfVersion>
# <IfVersion < 2.4>
# Order allow,deny
# Allow from all
# </IfVersion>
# </Directory>
#EOF
sed -i '$a\<Directory /usr/bin>\n \ <IfVersion >= 2.4>\n \ Require all granted\n \ </IfVersion>\n \ <IfVersion < 2.4>\n \ Order allow,deny\n \ Allow from all\n \ </IfVersion>\n \</Directory>' /etc/httpd/conf.d/00-nova-placement-api.conf
echo " 2、/etc/httpd/conf.d/00-nova-placement-api.conf文件已修改完毕"
else
echo "/etc/httpd/conf.d/00-nova-placement-api.conf配置文件不存在"
fi
#修改完配置文件,重启httpd
systemctl restart httpd
#填充nova-api和 placement的数据库
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
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
#重启nova相关服务
systemctl enable openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
systemctl start openstack-nova-api.service openstack-nova-consoleauth openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
elif [ $answer == "n" ]; then
echo " "
echo " 已退出此脚本"
fi
# 配置完nova-compute在controller上发现就算节点的最后两条命令未做,因为执行时间不一致
0x05:(compute节点代码)
#!/bin/bash
#This is a script for editing nova-compute file
# 如果你需要使用此脚本,将主机名controller-ZJB修改为你的主机名
# 所有1790600080处修改为自己的密码
echo " 这是一个一键配置Nova-Compute组件的脚本:"
echo " 1、下面开始安装openstack-nova-compute……"
yum -y install openstack-nova-compute
if [ $? == 0 ];then
echo " success: 组件已安装完毕,下面修改Nova-Compute配置文件:"
else
echo " error:组件安装出现了问题!请手动检查是否安装成功!"
fi
echo " "
read -p " 2、是否选择一键修改Nova配置文件(y/n)" answer
#判断/etc/nova/nova.conf文件是否存在,不存在直接输出错误
if [ $answer == "y" ];then
ls /etc/nova/nova.conf &>/dev/null
if [ $? == 0 ];then
# 设置变量获取行数,使用sed根据行号添加
DEFAULT_line=`cat -n /etc/nova/nova.conf | grep "\[DEFAULT\]$" | awk '{print $1}'`
sed -i $DEFAULT_line'a\enabled_apis = osapi_compute,metadata' /etc/nova/nova.conf
sed -i `expr $DEFAULT_line + 1`'a\transport_url = rabbit://ZJB:1790600080@controller-ZJB' /etc/nova/nova.conf
sed -i `expr $DEFAULT_line + 2`'a\my_ip = 192.168.52.200' /etc/nova/nova.conf
sed -i `expr $DEFAULT_line + 3`'a\use_neutron = true' /etc/nova/nova.conf
sed -i `expr $DEFAULT_line + 4`'a\firewall_driver = nova.virt.firewall.NoopFirewallDriver' /etc/nova/nova.conf
api_line=`cat -n /etc/nova/nova.conf | grep "\[api\]$" | awk '{print $1}'`
sed -i $api_line'a\auth_strategy = keystone' /etc/nova/nova.conf
keystone_authtoken_line=`cat -n /etc/nova/nova.conf | grep "\[keystone_authtoken\]$" | awk '{print $1}'`
sed -i $keystone_authtoken_line'a\auth_url = http://controller-ZJB:5000/v3' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 1`'a\memcached_servers = controller-ZJB:11211' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 2`'a\auth_type = password' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 3`'a\project_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 4`'a\user_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 5`'a\project_name = service' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 6`'a\username = nova' /etc/nova/nova.conf
sed -i `expr $keystone_authtoken_line + 7`'a\password =1790600080' /etc/nova/nova.conf
vnc_line=`cat -n /etc/nova/nova.conf | grep "\[vnc\]$" | awk '{print $1}'`
sed -i $vnc_line'a\enabled = true' /etc/nova/nova.conf
sed -i `expr $vnc_line + 1`'a\server_listen = 0.0.0.0' /etc/nova/nova.conf
sed -i `expr $vnc_line + 2`'a\server_proxyclient_address = $my_ip' /etc/nova/nova.conf
sed -i `expr $vnc_line + 3`'a\novncproxy_base_url = http://controller-ZJB:6080/vnc_auto.html' /etc/nova/nova.conf
glance_line=`cat -n /etc/nova/nova.conf | grep "\[glance\]$" | awk '{print $1}'`
sed -i $glance_line'a\api_servers = http://controller-ZJB:9292' /etc/nova/nova.conf
oslo_concurrency_line=`cat -n /etc/nova/nova.conf | grep "\[oslo_concurrency\]$" | awk '{print $1}'`
sed -i $oslo_concurrency_line'a\lock_path = /var/lib/nova/tmp' /etc/nova/nova.conf
placement_line=`cat -n /etc/nova/nova.conf | grep "\[placement\]$" | awk '{print $1}'`
sed -i $placement_line'a\region_name = RegionOne' /etc/nova/nova.conf
sed -i `expr $placement_line + 1`'a\project_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $placement_line + 2`'a\project_name = service' /etc/nova/nova.conf
sed -i `expr $placement_line + 3`'a\auth_type = password' /etc/nova/nova.conf
sed -i `expr $placement_line + 4`'a\user_domain_name = Default' /etc/nova/nova.conf
sed -i `expr $placement_line + 5`'a\auth_url = http://controller-ZJB:5000/v3' /etc/nova/nova.conf
sed -i `expr $placement_line + 6`'a\username = placement' /etc/nova/nova.conf
sed -i `expr $placement_line + 7`'a\password =1790600080' /etc/nova/nova.conf
echo " success: Compute节点/etc/nova/nova.conf文件已修改完毕"
else
echo "error: Compute节点/etc/nova/nova.conf文件不存在!"
fi
#确保Compute节点支持硬件虚拟化
echo " 3、检查Compute节点是否支持虚拟化硬件加速:"
num=`egrep -c '(vmx|svm)' /proc/cpuinfo`
if [ $num -gt 0 ];then
echo " 该Compute节点支持虚拟化硬件加速! "
else
libvirt_line=`cat -n /etc/nova/nova.conf | grep "\[libvirt\]$" | awk '{print $1}'`
sed -i $libvirt_line'a\virt_type = qemu' /etc/nova/nova.conf
echo " Compute节点不支持虚拟化硬件加速,已配置libvirt 使用 QEMU 取代 KVM"
fi
#设置compute服务开机自启动,并启动它
systemctl enable libvirtd openstack-nova-compute
systemctl start libvirtd openstack-nova-compute
if [ $? == 0 ];then
echo " nova-compute已经启动!"
else
echo " error: nova-compute未启动成功,请手动查看原因!"
fi
elif [ $answer == "n" ]; then
echo " "
echo " 已退出此脚本"
fi
0x06
当compute脚本执行之后,controller节点需要执行如下命令发现compute节点
# su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
0x07
随后可以进行多项测试,例:
# openstack compute service list
# nova-status upgrade check