[root@openstack-controller1 ~]#cat openstack-deploy-controller-node.sh
#Author:QsyjSmy
#Date:2022-01-24
#QQ:582673967
#定义变量
HOST_IP=`ifconfig | grep 172 | awk '{print $2}'`
FIREWALLD_STATUS=`systemctl is-enabled firewalld.service`
GETENFORCE_STATUS=`getenforce`
#更改hosts文件
function setup-hosts {
echo "172.31.7.101 openstack-controller1.qsyjsmy.com openstack-controller1" >> /etc/hosts
echo "172.31.7.107 openstack-compute1.qsyjsmy.com openstack-compute1" >> /etc/hosts
echo "172.31.7.108 openstack-compute2.qsyjsmy.com openstack-compute2" >> /etc/hosts
}
#关闭防火墙与selinux
function disable-firewalld-seliunx {
if [ ${FIREWALLD_STATUS} != disabled ]
then
systemctl disable --now firewalld.service && echo "防火墙禁用成功" && sleep 3
fi
if [ ${GETENFORCE_STATUS} != disabled ]
then
sed -i.bak 's/^\(SELINUX=\).*/\1disabled/g' /etc/selinux/config && echo "selinux禁用成功" && sleep 3
fi
}
#配置阿里云yum源
function setup-aliyun-yum {
yum repolist | grep aliyun &> /dev/null
if [ $? -ne 0 ]
then
mkdir -p /etc/yum.repos.d/back/ && mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/back/
ping -c 3 www.baidu.com &> /dev/null && curl -so /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[ -f /etc/yum.repos.d/CentOS-Base.repo ] || ( echo "阿里云yum源下载失败,请检查网络配置,,脚本正在退出..." && sleep 3 && exit 1 )
yum clean all &> /dev/null && yum makecache &> /dev/null && yum repolist | grep aliyun &> /dev/null && echo "阿里云yum源配置成功" && sleep 3
fi
}
#安装常用基础命令
function install-software {
yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop lsof \
ntpdate telnet bridge-utils bash-completion sshpass libibverbs && echo "常用基础命令安装完成" && sleep 3
}
#配置时钟同步
function setup-timedate {
crontab -l | grep "ntp.aliyun.com" || echo "*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com && /usr/sbin/hwclock -w" | crontab && \
echo "时钟同步配置成功"
echo "当前服务器时间是: `date +'%Y年%m月%d日 %H时%M分%S秒'`" && sleep 3
}
#安装Train版yum源
function install-train-yum {
yum list centos-release-openstack* | grep "centos-release-openstack-train" &> /dev/null && yum install -y centos-release-openstack-train.noarch
if [ $? -eq 0 ]
then
yum install -y https://rdoproject.org/repos/rdo-release.rpm && yum repolist | grep train &> /dev/null && echo "Train版yum源安装完成" && \
sleep 3
else
echo "Train版yum源安装失败,请检查网络配置,脚本正在退出..." && sleep 3 && exit 1
fi
}
#安装OpenStack客户端
function install-openstack-client {
yum install -y python2-openstackclient.noarch && echo "OpenStack客户端安装完成" && sleep 3
}
#安装OpenStack selinux管理包
function install-openstack-selinux {
yum install -y openstack-selinux.noarch && echo "OpenStack客户端安装完成" && sleep 3
}
#安装并配置MySQL数据库服务
function install-mysql {
yum install mariadb mariadb-server python2-PyMySQL -y && sleep 3
if [ $? -eq 0 ]
then
wget -O /opt/openstack.conf http://www.qsyjsmy.com/testdir/openstack.conf && cat /opt/openstack.conf > /etc/my.cnf.d/openstack.conf
systemctl enable --now mariadb.service; sleep 3 && systemctl status mariadb.service || \
{ echo "MySQL数据库服务启动失败,正在退出...";sleep 3;exit 1; } && echo "MySQL数据库服务安装配置完成" && sleep 3
else
{ echo "MySQL数据库服务安装失败,请检查网络配置,脚本正在退出...";sleep 3;exit 1; }
fi
}
#安装并配置RabbitMQ服务
function install-rabbitmq {
yum install rabbitmq-server -y && sleep 3
if [ $? -eq 0 ]
then
systemctl enable --now rabbitmq-server.service; sleep 3 && netstat -tnlp | grep 5672 || \
{ echo "RabbitMQ服务启动失败,正在退出...";sleep 3;exit 1; } && echo "RabbitMQ服务启动成功" && sleep 3
rabbitmqctl add_user openstack RABBIT_PASS;sleep 5 && rabbitmqctl set_permissions openstack ".*" ".*" ".*";sleep 5 && \
rabbitmq-plugins enable rabbitmq_management;sleep 5 && echo "RabbitMQ服务配置成功" && sleep 3
else
{ echo "RabbitMQ服务安装失败,请检查网络配置,脚本正在退出...";sleep 3;exit 1; }
fi
}
#安装并配置memcached服务
function install-memcached {
yum install memcached python-memcached -y && sleep 3
if [ $? -eq 0 ]
then
sed -i 's/^\(CACHESIZE=\).*/\1"1024"/g' /etc/sysconfig/memcached
sed -i 's/^\(OPTIONS=\).*/\1"-l 0.0.0.0,::1"/g' /etc/sysconfig/memcached
systemctl enable --now memcached.service; sleep 3 && netstat -tnlp | grep memcached || \
{ echo "memcached服务启动失败,正在退出...";sleep 3;exit 1; } && echo "memcached服务配置成功" && sleep 3
else
{ echo "memcached服务安装失败,请检查网络配置,脚本正在退出...";sleep 3;exit 1; }
fi
}
#安装并配置keystone服务
function install-keystone {
#创建数据库并授权
mysql -e "CREATE DATABASE keystone;" && \
mysql -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';" && \
mysql -e "GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';" && \
mysql -e "show databases;" | grep keystone || { echo "keystone服务创库授权失败,正在退出...";sleep 3;exit 1; } && echo "创库授权完成" && sleep 3
if [ $? -eq 0 ]
then
#安装keystone服务
yum install openstack-keystone httpd mod_wsgi -y && echo "keystone服务安装成功" && sleep 3
#配置keystone服务
cp /etc/keystone/keystone.conf{,.bak} && wget -O /opt/keystone.conf http://www.qsyjsmy.com/testdir/keystone.conf && \
cat /opt/keystone.conf > /etc/keystone/keystone.conf
#初始化数据库
su -s /bin/sh -c "keystone-manage db_sync" keystone;sleep 3 && mysql -e "use keystone;show tables;" | grep "access_rule" || \
{ echo "初始化数据库失败,正在退出...";sleep 3;exit 1; } && echo "初始化数据库成功" && sleep 3
#初始化证书
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone && \
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone && \
[ -d /etc/keystone/credential-keys/ -a -d /etc/keystone/fernet-keys/ ] || { echo "初始化证书失败,正在退出...";sleep 3;exit 1; } && \
echo "证书初始化成功" && sleep 3
#初始化OpenStack
keystone-manage bootstrap --bootstrap-password ADMIN_PASS --bootstrap-admin-url http://openstack-controller1:5000/v3/ \
--bootstrap-internal-url http://openstack-controller1:5000/v3/ --bootstrap-public-url http://openstack-controller1:5000/v3/ \
--bootstrap-region-id RegionOne && echo "初始化OpenStack成功" && sleep 3
#配置Apache
sed -i "s/^#\(ServerName\).*/\1 172.31.7.101:80/g" /etc/httpd/conf/httpd.conf && \
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/ && httpd -t && \
systemctl enable --now httpd.service && systemctl status httpd.service &> /dev/null || \
{ echo "Apache服务启动失败,正在退出...";sleep 3;exit 1; } && \
echo "Apache服务启动成功" && sleep 3
#生成环境变量
cat > admin.sh<<EOF
#!/bin/bash
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://openstack-controller1:5000/v3
export OS_IDENTITY_API_VERSION=3
EOF
source admin.sh && curl http://openstack-controller1:5000 || { echo "keystone配置失败,正在退出...";sleep 3;exit 1; } && \
echo "keystone配置成功" && sleep 3
#创建域、用户、项目和角色
openstack domain create --description "An Example Domain" example && openstack domain list | grep example || \
{ echo "创建example域失败,正在退出...";sleep 3;exit 1; } && echo "创建example域成功" && sleep 3
openstack project create --domain default --description "Service Project" service && openstack project list | grep service || \
{ echo "创建service项目失败,正在退出...";sleep 3;exit 1; } && echo "创建service项目成功" && sleep 3
openstack project create --domain default --description "Demo Project" myproject && openstack project list | grep myproject || \
{ echo "创建myproject项目失败,正在退出...";sleep 3;exit 1; } && echo "创建myproject项目成功" && sleep 3
yum install -y expect && expect <<EOF
set timeout 10
spawn openstack user create --domain default --password-prompt myuser
expect {
"User Password:" { send "myuser\n";exp_continue }
"Repeat User Password:" { send "myuser\n" }
}
EOF
openstack role create myrole && openstack role list | grep myrole || \
{ echo "创建myrole角色失败,正在退出...";sleep 3;exit 1; } && echo "创建myrole角色成功" && sleep 3
openstack role add --project myproject --user myuser myrole
#创建OpenStack客户端环境脚本admin用户
cat > admin-openrc.sh<<EOF
#!/bin/bash
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://openstack-controller1:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
#创建OpenStack客户端环境脚本demo用户
cat > demo-openrc.sh<<EOF
#!/bin/bash
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=myuser
export OS_AUTH_URL=http://openstack-controller1:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
#运行脚本,验证keystone
source admin-openrc.sh && openstack token issue | grep "user_id" || \
{ echo "keystone服务运行异常,正在退出...";sleep 3;exit 1; } && echo "keystone服务运行正常" && sleep 3
else
{ echo "keystone数据库创建失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; }
fi
}
#安装并配置glance服务
function install-glance {
#创建数据库并授权
mysql -e "CREATE DATABASE glance;" && \
mysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';" && \
mysql -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';" && \
mysql -e "show databases;" | grep glance || { echo "glance数据库创建失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "创库授权完成" && sleep 3
#glance服务注册
source admin-openrc.sh && expect <<EOF
set timeout 10
spawn openstack user create --domain default --password-prompt glance
expect {
"User Password:" { send "GLANCE_PASS\n";exp_continue }
"Repeat User Password:" { send "GLANCE_PASS\n" }
}
EOF
openstack role add --project service --user glance admin
openstack service create --name glance --description "OpenStack Image" image
openstack endpoint create --region RegionOne image public http://openstack-controller1:9292
openstack endpoint create --region RegionOne image internal http://openstack-controller1:9292
openstack endpoint create --region RegionOne image admin http://openstack-controller1:9292
source admin-openrc.sh && GLANCE_ENDPOINTS=`openstack endpoint list | grep "glance" | wc -l`
[ ${GLANCE_ENDPOINTS} -eq 3 ] || { echo "glance服务注册失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "glance服务注册完成" && sleep 3
#安装并配置glance服务
yum install openstack-glance -y && cp /etc/glance/glance-api.conf{,.bak} && \
wget -O /opt/glance-api.conf http://www.qsyjsmy.com/testdir/glance-api.conf && cat /opt/glance-api.conf > /etc/glance/glance-api.conf
#初始化glance数据库
su -s /bin/sh -c "glance-manage db_sync" glance;sleep 3 && mysql -e "use glance;show tables;" | grep "alembic_version" || \
{ echo "初始化数据库失败,正在退出...";sleep 3;exit 1; } && echo "初始化数据库成功" && sleep 3
#启动glance服务
systemctl enable --now openstack-glance-api.service && systemctl status openstack-glance-api.service &> /dev/null || \
{ echo "glance服务启动失败,正在退出...";sleep 3;exit 1; } && echo "glance服务启动成功" && sleep 3
#测试glance上传镜像
wget http://www.qsyjsmy.com/testdir/cirros-0.5.1-x86_64-disk.img && ls -l /root/cirros-0.5.1-x86_64-disk.img || \
{ echo "cirros镜像下载失败,请检查网络连接,正在退出...";sleep 3;exit 1; } && echo "cirros镜像下载成功" && sleep 3
glance image-create --name "cirros-0.5.1" --file /root/cirros-0.5.1-x86_64-disk.img --disk-format qcow2 --container-format bare --visibility public
openstack image list | grep -w cirros | grep active || \
{ echo "cirros镜像上传失败,正在退出...";sleep 3;exit 1; } && echo "cirros镜像上传成功" && sleep 3
}
#安装并配置placement
function install-placement {
#创建数据库并授权
mysql -e "CREATE DATABASE placement;" && \
mysql -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY 'PLACEMENT_DBPASS';" && \
mysql -e "GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY 'PLACEMENT_DBPASS';" && \
mysql -e "show databases;" | grep placement || { echo "placement数据库创建失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "placement创库授权完成" && sleep 3
#placement服务注册
source admin-openrc.sh && expect <<EOF
set timeout 10
spawn openstack user create --domain default --password-prompt placement
expect {
"User Password:" { send "PLACEMENT_PASS\n";exp_continue }
"Repeat User Password:" { send "PLACEMENT_PASS\n" }
}
EOF
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://openstack-controller1:8778
openstack endpoint create --region RegionOne placement internal http://openstack-controller1:8778
openstack endpoint create --region RegionOne placement admin http://openstack-controller1:8778
source admin-openrc.sh && PLACEMENT_ENDPOINTS=`openstack endpoint list | grep "placement" | wc -l`
[ ${PLACEMENT_ENDPOINTS} -eq 3 ] || { echo "placement服务注册失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "placement服务注册完成" && sleep 3
#配置placement服务
yum install openstack-placement-api -y && cp /etc/placement/placement.conf{,.bak} && \
wget -O /opt/placement.conf http://www.qsyjsmy.com/testdir/placement.conf && cat /opt/placement.conf > /etc/placement/placement.conf
#初始化placement数据库
su -s /bin/sh -c "placement-manage db sync" placement;sleep 3 && mysql -e "use placement;show tables;" | grep "alembic_version" || \
{ echo "初始化placement数据库失败,正在退出...";sleep 3;exit 1; } && echo "初始化placement数据库成功" && sleep 3
#配置Apache
cat >> /etc/httpd/conf.d/00-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
#重启Apache服务
httpd -t && systemctl restart httpd.service;sleep 3
#测试服务端口
curl 172.31.7.101:8778 || { echo "placement服务运行异常,正在退出...";sleep 3;exit 1; } && echo "placement服务运行成功" && sleep 3
}
#安装并配置nova计算服务
function install-nova {
#创建数据库并授权
mysql -e "CREATE DATABASE nova_api;" && \
mysql -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';" && \
mysql -e "GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';" && \
mysql -e "CREATE DATABASE nova;" && \
mysql -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';" && \
mysql -e "GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';" && \
mysql -e "CREATE DATABASE nova_cell0;" && \
mysql -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';" && \
mysql -e "GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';" && \
NOVA_DATABASES=`mysql -e "show databases;" | egrep -w "nova_api|nova|nova_cell0" | wc -l` && \
[ ${NOVA_DATABASES} -eq 3 ] || { echo "nova计算服务数据库创建失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "nova计算服务数据库创建完成" && sleep 3
#nova服务注册
source admin-openrc.sh && expect <<EOF
set timeout 10
spawn openstack user create --domain default --password-prompt nova
expect {
"User Password:" { send "NOVA_PASS\n";exp_continue }
"Repeat User Password:" { send "NOVA_PASS\n" }
}
EOF
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://openstack-controller1:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://openstack-controller1:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://openstack-controller1:8774/v2.1
source admin-openrc.sh && NOVA_ENDPOINTS=`openstack endpoint list | grep "nova" | wc -l`
[ ${NOVA_ENDPOINTS} -eq 3 ] || { echo "nova服务注册失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "nova服务注册完成" && sleep 3
#配置nova服务
yum install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler -y && \
cp /etc/nova/nova.conf{,.bak} && wget -O /opt/nova.conf http://www.qsyjsmy.com/testdir/nova.conf && \
cat /opt/nova.conf > /etc/nova/nova.conf
#初始化nova_api数据库
su -s /bin/sh -c "nova-manage api_db sync" nova;sleep 3
mysql -e "use nova_api;show tables;" | grep "aggregate_hosts" || \
{ echo "初始化nova_api数据库失败,正在退出...";sleep 3;exit 1; } && echo "初始化nova_api数据库成功" && sleep 3
#初始化nova cell0数据库
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova;sleep 3
#创建nova cell1数据库
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova;sleep 3
#初始化nova数据库
su -s /bin/sh -c "nova-manage db sync" nova;sleep 3
#验证nova cell0和nova cell1是否注册成功
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova;sleep 3
#启动nova服务
systemctl enable --now openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service \
openstack-nova-novncproxy.service && sleep 20
#验证nova服务
NOVA_STATUS=`systemctl is-active openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service | grep -w active | wc -l`
[ ${NOVA_STATUS} -eq 4 ] || { echo "nova服务启动失败,正在退出...";sleep 3;exit 1; } && echo "nova服务启动成功" && sleep 3
}
#安装并配置neutron网络服务
function install-neutron {
#创建数据库并授权
mysql -e "CREATE DATABASE neutron;" && \
mysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';" && \
mysql -e "GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';" && \
mysql -e "show databases;" | grep neutron || { echo "neutron数据库创建失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "neutron创库授权完成" && sleep 3
#neutron服务注册
source admin-openrc.sh && expect <<EOF
set timeout 10
spawn openstack user create --domain default --password-prompt neutron
expect {
"User Password:" { send "NEUTRON_PASS\n";exp_continue }
"Repeat User Password:" { send "NEUTRON_PASS\n" }
}
EOF
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://openstack-controller1:9696
openstack endpoint create --region RegionOne network internal http://openstack-controller1:9696
openstack endpoint create --region RegionOne network admin http://openstack-controller1:9696
source admin-openrc.sh && NEUTRON_ENDPOINTS=`openstack endpoint list | grep "neutron" | wc -l`
[ ${NEUTRON_ENDPOINTS} -eq 3 ] || { echo "neutron服务注册失败,无法继续进行安装和配置,正在退出...";sleep 3;exit 1; } && \
echo "neutron服务注册完成" && sleep 3
#配置neutron服务
yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables -y
cp /etc/neutron/neutron.conf{,.bak} && wget -O /opt/neutron.conf http://www.qsyjsmy.com/testdir/neutron.conf && \
cat /opt/neutron.conf > /etc/neutron/neutron.conf
#配置Modular Layer2
cp /etc/neutron/plugins/ml2/ml2_conf.ini{,.bak} && wget -O /opt/ml2_conf.ini http://www.qsyjsmy.com/testdir/ml2_conf.ini && \
cat /opt/ml2_conf.ini > /etc/neutron/plugins/ml2/ml2_conf.ini
#配置Linuxbridge代理
cp /etc/neutron/plugins/ml2/linuxbridge_agent.ini{,.bak} && \
wget -O /opt/linuxbridge_agent.ini http://www.qsyjsmy.com/testdir/linuxbridge_agent.ini && \
cat /opt/linuxbridge_agent.ini > /etc/neutron/plugins/ml2/linuxbridge_agent.ini
#添加内核参数
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
#配置DHCP代理
cp /etc/neutron/dhcp_agent.ini{,.bak} && wget -O /opt/dhcp_agent.ini http://www.qsyjsmy.com/testdir/dhcp_agent.ini && \
cat /opt/dhcp_agent.ini > /etc/neutron/dhcp_agent.ini
#配置元数据代理
cp /etc/neutron/metadata_agent.ini{,.bak} && wget -O /opt/metadata_agent.ini http://www.qsyjsmy.com/testdir/metadata_agent.ini && \
cat /opt/metadata_agent.ini > /etc/neutron/metadata_agent.ini
#创建软链接
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
#初始化neutron数据库
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 >> /tmp/neutron-database-status.txt;sleep 3
grep "OK" /tmp/neutron-database-status.txt || { echo "初始化neutron数据库失败,正在退出...";sleep 3;exit 1; } && \
echo "neutron数据库初始化成功" && sleep 3
#重启nova-api服务
systemctl restart openstack-nova-api.service;sleep 3
#启动neutron服务
systemctl enable --now neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service
sleep 3
systemctl status neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.service neutron-metadata-agent.service \
&> /dev/null || { echo "neutron服务运行异常,正在退出...";sleep 3;exit 1; } && echo "neutron服务运行正常" && sleep 3
#neutron控制端验证服务是否注册成功
source admin-openrc.sh && NEUTRON_STATUS=`openstack network agent list | grep controller1 | awk -F"[|]|" '{print $6}'`
for i in ${NEUTRON_STATUS}
do
[ ${i} = ":-)" ] || { echo "neutron服务注册异常,正在退出...";exit 1; } && sleep 1
done
echo "neutron服务注册成功"
}
#创建桥接网络
function create-briage-network {
source admin-openrc.sh
openstack network create --share --external --provider-physical-network external --provider-network-type flat external-net
openstack network list | grep "external-net" || \
{ echo "外部网络创建失败,正在退出...";sleep 3;exit 1; } && echo "外部网络创建成功" && sleep 5
openstack subnet create --network external-net --allocation-pool start=172.31.7.51,end=172.31.7.100 --dns-nameserver 223.5.5.5 \
--gateway 172.31.0.2 --subnet-range 172.31.0.0/21 external-sub
openstack subnet list | grep "external-sub" || \
{ echo "子网创建失败,正在退出...";sleep 3;exit 1; } && echo "子网创建成功" && sleep 120
brctl show | grep eth0 || \
{ echo "网卡桥接失败,正在退出...";sleep 3;exit 1; } && echo "网卡桥接成功" && sleep 3
openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
openstack flavor list | grep "m1.nano" || \
{ echo "实例类型创建失败,正在退出...";sleep 3;exit 1; } && echo "实例类型创建成功" && sleep 3
[ -f /root/.ssh/id_rsa ] || expect <<EOF
set timeout 10
spawn ssh-keygen -q -N ""
expect {
"/root/.ssh/id_rsa" { send "\n" }
}
expect eof
EOF
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
openstack security group rule create --proto icmp default
openstack security group rule create --proto tcp --dst-port 22 default
}
#安装配置管理服务Horizon
function install-horizon {
yum install openstack-dashboard -y
cp /etc/openstack-dashboard/local_settings{,.bak} && wget -O /opt/local_settings http://www.qsyjsmy.com/testdir/local_settings && \
cat /opt/local_settings > /etc/openstack-dashboard/local_settings
sed -i "/WSGISocketPrefix run\/wsgi/a WSGIApplicationGroup %{GLOBAL}" /etc/httpd/conf.d/openstack-dashboard.conf
#重启Apache和memcached服务
systemctl restart httpd.service memcached.service;sleep 3
systemctl status httpd.service memcached.service &> /dev/null || \
{ echo "Apache或memcached服务运行异常,正在退出...";sleep 3;exit 1; } && echo "Apache或memcached服务运行正常" && sleep 3
}
setup-hosts
disable-firewalld-seliunx
setup-aliyun-yum
install-software
setup-timedate
install-train-yum
install-openstack-client
install-openstack-selinux
install-mysql
install-rabbitmq
install-memcached
install-keystone
install-glance
install-placement
install-nova
install-neutron
create-briage-network
install-horizon
echo "OpenStack控制节点安装部署成功!!!"很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时