对着这本书做,发现其中有很多问题,根本做不出来。中间上网查找了不少解决的办法,过程已经不记得了,现在把结果的代码放在这里。
脚本是我写的,一些关键的注释是我写的,不过后来又让豆包重新注释了一遍。
环境规划
使用的是vmware软件,创建两个虚拟机,用做控制节点和计算节点,IP分别为192.168.1.100和192.168.1.200。每个虚拟机都只有一个网卡,使用的是NAT模式,硬盘为50G,其中计算节点在配置的过程中会增加一个20G的硬盘。CPU都是2核,并且在WMware的CPU设置中开启了虚拟化支持。
VMware的NAT网络设置的IP段是192.168.1.0段,网关是192.168.1.2。
虚拟机使用的操作系统是CentOS-7-x86_64-Minimal-2009.iso,安装过程中root用户的密码是123456,创建了一个普通用户user01,密码设置的是111111,系统语言选择的英文。
代码执行的前提
两个虚拟机已经修改网卡配置文件,修改了BOOTPROTO=static、ONBOOT=yes,配置好了IP地址、子网掩码、网关,实现了主机到虚拟机的ping通、xshell的ssh通、winscp通。
代码执行的顺序
从头到尾有很多代码,这些代码会在后面部分中一一给出,并且按顺序进行编号,这里给了代码的编号(全名在编号后面还有简单的说明)。
代码使用的说明:
可以把每一个代码复制到一个脚本文件中,然后使用bash执行这个脚本文件,执行时不需要输入什么内容,有时候会需要按回车键继续。
在windows里创建的脚本,传到CentOS中执行时,可能因为编码的问题执行失败。这时,可以在vi中打开脚本,然后使用:set ff=unix和:wq修改文件之后再执行。
执行过程中的一些说明:
- 不管在哪个节点上执行代码,请保证在执行时两个节点都是开机状态。
- 代码05和代码06之间、代码07和代码08之间需要手动上传对应的文件到指定的位置,并保证文件名正确。
- 代码08执行完之后,请使用root身份进入控制节点,在图形界面使用virt-manager完成虚拟机的创建工作,创建完后关闭里面的虚拟机,注意不是关闭控制节点本身。
- 代码08最后可能卡在create domain的环节而不继续,没有问题,可以进入图形界面去创建虚拟机。对后面没有影响。
- 使用virt-manager创建虚拟机时,安装完成之后,进入到虚拟机的
View->Details->Boot Options里面取消对IDE CDROM的勾选。 - 代码08和代码09可以不做,不影响后面的代码以及最终的结果。
- 如果不做代码08和代码09,那么,07之后的那个上传文件动作也可以不用做。
- 如果没有做08,那么09也就不能做,因为09以08为基础。
代码执行的顺序是:
控制节点执行:
01
计算节点执行:
02
控制节点执行:
03
计算节点执行:
04
控制节点执行:
05
上传cirros.img文件到/root/
06
07
上传CentOS-7-x86_64-Minimal-2009.iso文件到/opt/
08(可以不做)
09(可以不做,如果08没有做,那这个就做不了)
10
11
计算节点执行:
12
控制节点执行:
13
14
计算节点执行:
15
控制节点执行:
等待10秒钟左右
16
计算节点执行:
17
控制节点执行:
18
19
20
计算节点执行:
关机,添加第二块硬盘,重启
21
控制节点执行:
22
23
以default域、admin/000000身份登录网页192.168.1.100/dashboard使用功能。
控制节点执行:
24
计算节点执行:
25
完成。
脚本内容
01-控制节点-基础系统设置及软件源配置
#!/bin/bash
# 定义控制节点主机名变量
KongZhiJieDianName=kongzhi
# 定义计算节点主机名变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关标识变量
RuanJianBao=KongZhi# 备份当前DNS配置文件
cp /etc/resolv.conf /etc/resolv.conf.bak
# 向DNS配置文件追加腾讯云公共DNS服务器地址
cat <<'EOF'>> /etc/resolv.conf
nameserver 211.137.191.26
# 腾讯云DNS服务器1
nameserver 218.201.96.130
# 腾讯云DNS服务器2
EOF# 修改yum缓存目录为指定路径,并备份原配置文件
sed -i.bak "s/cachedir=\/var\/cache\/yum\/\$basearch\/\$releasever/cachedir=\/root\/OpenStack${RuanJianBao}RPMS-Train\/yum/" /etc/yum.conf
# 开启yum缓存功能(将keepcache从0改为1)
sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf
# 删除系统中所有已有的yum源配置文件
rm -f /etc/yum.repos.d/*# 下载腾讯云的CentOS 7基础yum源配置文件
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
# 创建OpenStack Train版本的yum源配置文件
cat <<'EOF'>> /etc/yum.repos.d/OpenStack-Train.repo
[OpenStack-Train]
name=OpenStack Train Repository
# 源名称描述
baseurl=http://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-train/
# 阿里云OpenStack Train源地址
enable=1
# 启用该源
gpgcheck=0
# 关闭GPG校验
EOF
# 清理yum缓存
yum clean all
# 生成新的yum缓存
yum makecache
# 列出当前可用的yum源
yum repolist# 设置控制节点的主机名
hostnamectl set-hostname $KongZhiJieDianName
# 停止firewalld防火墙服务
systemctl stop firewalld
# 禁用firewalld防火墙服务(开机不自动启动)
systemctl disable firewalld
# 修改SELinux配置为禁用模式,并备份原配置文件
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 备份当前hosts文件
cp /etc/hosts /etc/hosts.bak
# 向hosts文件追加控制节点和计算节点的IP与主机名映射
cat <<EOF>> /etc/hosts
$KongZhiJieDianIP $KongZhiJieDianName
# 控制节点IP与主机名映射
$JiSuanJieDianIP $JiSuanJieDianName
# 计算节点IP与主机名映射
EOF# 注释:原本用于安装OpenStack Train发行版包的命令,当前已注释
# yum install centos-release-openstack-train -y# 升级系统中所有已安装的软件包
yum upgrade -y
# 卸载已安装的vim、net-tools、wget工具
yum remove vim net-tools wget -y
# 重新安装vim、net-tools、wget工具
yum install -y vim net-tools wget
# 重启系统使配置生效
reboot
02-计算节点-基础系统设置及软件源配置
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义变量:控制节点的主机名
KongZhiJieDianName=kongzhi
# 定义变量:计算节点的主机名
JiSuanJieDianName=jisuan
# 定义变量:控制节点的IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点的IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包相关标识(此处用于OpenStack软件包路径)
RuanJianBao=JiSuan# 备份系统DNS配置文件resolv.conf到resolv.conf.bak
# 防止后续修改出错时可以恢复原始配置
cp /etc/resolv.conf /etc/resolv.conf.bak
# 向resolv.conf文件追加DNS服务器配置
# 使用'EOF'包裹内容可避免变量解析,确保内容原样写入
cat <<'EOF'>> /etc/resolv.conf
nameserver 211.137.191.26
# 添加第一个DNS服务器地址
nameserver 218.201.96.130
# 添加第二个DNS服务器地址
EOF# 修改yum配置文件,调整缓存目录
# -i.bak:修改文件并创建.bak备份
# 将默认缓存目录替换为/root/OpenStack${RuanJianBao}RPMS-Train/yum
# 此处RuanJianBao变量会被解析为JiSuan,最终路径为/root/OpenStackJiSuanRPMS-Train/yum
sed -i.bak "s/cachedir=\/var\/cache\/yum\/\$basearch\/\$releasever/cachedir=\/root\/OpenStack${RuanJianBao}RPMS-Train\/yum/" /etc/yum.conf# 修改yum配置,启用缓存保留功能
# 将keepcache=0(不保留缓存)改为keepcache=1(保留缓存)
# 便于后续复用下载的rpm包,无需重复下载
sed -i 's/keepcache=0/keepcache=1/' /etc/yum.conf# 删除系统中已有的yum源配置文件
# 避免旧源与新配置的源产生冲突
rm -f /etc/yum.repos.d/*# 从腾讯云镜像站下载CentOS 7基础源配置文件
# 替换系统默认的基础yum源,提高软件包下载速度
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo# 创建OpenStack Train版本的yum源配置文件
# 配置阿里云的OpenStack Train镜像源,用于安装OpenStack相关组件
cat <<'EOF'>> /etc/yum.repos.d/OpenStack-Train.repo
[OpenStack-Train]
# 源标识,必须唯一
name=OpenStack Train Repository
# 源名称,用于识别
baseurl=http://mirrors.aliyun.com/centos/7/cloud/x86_64/openstack-train/
# 源地址
enable=1
# 启用该源(1为启用,0为禁用)
gpgcheck=0
# 不验证软件包签名(0为关闭,1为开启)
EOF# 创建虚拟化相关的yum源配置文件
# 配置阿里云的CentOS 7.9虚拟化组件源,用于安装KVM等虚拟化相关工具
cat <<'EOF'>> /etc/yum.repos.d/virt.repo
[Virt]
# 源标识,必须唯一
name=CentOS-$releasever-Virt
# 源名称,$releasever会自动替换为系统版本
baseurl=http://mirrors.aliyun.com/centos/7.9.2009/virt/x86_64/kvm-common/
# 源地址
gpgcheck=0
# 不验证软件包签名
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# 签名验证密钥(此处虽配置但gpgcheck=0,实际不生效)
EOF# 清理yum缓存,移除旧的缓存数据
yum clean all
# 生成新的yum缓存,加快后续软件包查询和安装速度
yum makecache
# 列出当前启用的yum源,验证源配置是否生效
yum repolist# 设置计算节点的主机名为本机定义的JiSuanJieDianName变量值(jisuan)
hostnamectl set-hostname $JiSuanJieDianName# 停止firewalld防火墙服务
systemctl stop firewalld
# 禁用firewalld防火墙服务,确保系统重启后不会自动启动
systemctl disable firewalld# 修改SELinux配置文件,关闭SELinux
# -i.bak:修改文件并创建.bak备份
# 将SELINUX=enforcing(强制模式)改为SELINUX=disabled(禁用模式)
# 注:此修改需重启系统后生效
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 备份系统hosts文件到hosts.bak
cp /etc/hosts /etc/hosts.bak
# 向hosts文件追加主机名与IP的映射关系
# 实现控制节点和计算节点之间通过主机名直接访问
cat <<EOF>> /etc/hosts
$KongZhiJieDianIP $KongZhiJieDianName
# 控制节点IP与主机名映射
$JiSuanJieDianIP $JiSuanJieDianName
# 计算节点IP与主机名映射
EOF# 注释:安装OpenStack Train版本的发行包(当前未启用)
# yum install centos-release-openstack-train -y# 升级系统中所有已安装的软件包到最新版本
yum upgrade -y# 卸载系统中已有的vim、net-tools、wget软件包
# 可能为了清除旧版本或冲突组件,后续将重新安装
yum remove vim net-tools wget -y# 重新安装vim(文本编辑器)、net-tools(网络工具集,含ifconfig等)、wget(下载工具)
yum install -y vim net-tools wget# 重启系统,使 hostname、SELinux 等配置生效
reboot
03-控制节点-第三章-环境准备-完成
#!/bin/bash
# 脚本说明:本脚本用于OpenStack控制节点的环境准备工作,包括时间同步服务、OpenStack客户端、数据库、消息队列、缓存服务和分布式键值存储等基础组件的安装与配置# 定义变量:设置控制节点、计算节点的名称和IP地址,以及软件包标识和密码
# 控制节点名称
KongZhiJieDianName=kongzhi
# 计算节点名称
JiSuanJieDianName=jisuan
# 控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 软件包标识(自定义)
RuanJianBao=KongZhi
# 通用密码(用于数据库、消息队列等组件)
PassWord=000000# 安装时间同步服务chrony
# chrony用于实现节点间的时间同步,保证集群时间一致性
yum install chrony -y# 配置chrony时间同步服务
# 第一步:备份原配置文件,并注释掉默认的CentOS官方NTP服务器
# sed -i.bak:修改文件并创建.bak备份;正则匹配以"server [0-3].centos.pool.ntp.org iburst"开头的行,在行首添加#注释
sed -i.bak "/^server [0-3]\.centos\.pool\.ntp\.org iburst$/s/^/#/" /etc/chrony.conf# 第二步:在注释掉的默认服务器配置后添加自定义配置
# 匹配到第一个被注释的默认服务器行后,继续向下查找其他被注释的默认服务器行
# 直到找不到更多被注释的默认服务器行时,插入两行配置:
# 1. 以控制节点作为本地NTP服务器
# 2. 允许192.168.1.0/24网段的节点同步时间
sed -i "/^#server [0-3]\.centos\.pool\.ntp\.org iburst$/ {
:a
n
/^#server [0-3]\.centos\.pool\.ntp\.org iburst$/ ba
i\server ${KongZhiJieDianName} iburst
i\allow ${KongZhiJieDianIP}/24
}" /etc/chrony.conf#### 启动NTP服务(chronyd)并设置开机自动启动:
# 启用开机自启
systemctl enable chronyd
# 重启服务使配置生效
systemctl restart chronyd
# 查看时间同步源状态,验证配置是否生效
chronyc sources# 3.4.2 安装OpenStack客户端工具
# 在控制节点和计算节点上都需要安装,用于通过命令行管理OpenStack
yum install python-openstackclient -y# 3.4.3 安装并配置SQL数据库(MariaDB)
## 安装MariaDB数据库
# 说明:数据库仅需在控制节点安装,计算节点不需要;此处记录个人操作备注(曾在计算节点误装,需关注后续影响)
yum install mariadb mariadb-server python2-PyMySQL -y# 此处为原文档中的图片占位符,用于说明配置过程(实际脚本无作用)
# ## 配置数据库
# 创建OpenStack专用的数据库配置文件,添加以下参数:
# - bind-address:绑定到控制节点IP,允许远程连接
# - default-storage-engine:默认存储引擎为InnoDB
# - innodb_file_per_table:每张表使用独立文件存储
# - max_connections:最大连接数设为4096(适应OpenStack多组件连接需求)
# - 字符集相关:使用utf8编码,确保中文等字符正常存储
cat <<EOF>> /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address=${KongZhiJieDianIP}
default-storage-engine=innodb
innodb_file_per_table=on
max_connections=4096
collation-server=utf8_general_ci
character-set-server=utf8
EOF### 启动数据库服务
# 启用开机自启
systemctl enable mariadb
# 启动服务
systemctl start mariadb### 初始化数据库安全设置
# 运行mysql_secure_installation脚本,通过 heredoc方式自动输入交互信息:
# 1. 首先按回车(默认无密码)
# 2. 确认设置root密码(输入y)
# 3. 输入新密码(${PassWord})
# 4. 再次输入新密码(${PassWord})
# 5. 移除匿名用户(输入y)
# 6. 不允许root远程登录(输入n,根据实际需求调整)
# 7. 删除test数据库(输入y)
# 8. 刷新权限表(输入y)
mysql_secure_installation << EOFy
${PassWord}
${PassWord}
y
n
y
y
EOF## 3.4.4 安装并配置消息服务器(RabbitMQ)
# 说明:消息服务器用于OpenStack各组件间的通信,仅在控制节点操作#### 安装RabbitMQ软件包
yum install rabbitmq-server -y### 启动RabbitMQ服务并设置开机自动启动
# 启用开机自启
systemctl enable rabbitmq-server
# 启动服务
systemctl start rabbitmq-server### 创建RabbitMQ用户
# 用户名:openstack,密码:${PassWord}(与前面统一密码)
rabbitmqctl add_user openstack ${PassWord}### 配置用户权限
# 授予openstack用户对所有资源的读、写、配置权限(正则".*"匹配所有)
rabbitmqctl set_permissions openstack ".*" ".*" ".*"# 此处为原文档中的图片占位符,用于展示权限设置结果(实际脚本无作用)
# # 3.4.5 安装Memcached(缓存服务)
# 说明:Memcached用于存储OpenStack各组件的会话信息,仅在控制节点操作# 安装Memcached及其Python客户端
# python-memcached用于OpenStack组件与Memcached交互
yum install memcached python-memcached -y# 配置Memcached监听地址
# 备份原配置文件,将默认监听地址(127.0.0.1,::1)添加控制节点名称,允许控制节点本地及通过节点名访问
sed -i.bak "s/^OPTIONS=\"-l 127.0.0.1,::1\"$/OPTIONS=\"-l 127.0.0.1,::1,${KongZhiJieDianName}\"/" /etc/sysconfig/memcached#### 启动Memcached服务并设置开机自动启动
# 启用开机自启
systemctl enable memcached
# 启动服务
systemctl start memcached## 3.4.6 安装Etcd(分布式键值存储)
# 说明:Etcd用于存储OpenStack集群的配置信息,仅在控制节点运行### 安装Etcd软件包
yum install etcd -y# 配置Etcd服务
# 1. 将默认的localhost替换为控制节点IP地址
sed -i.bak "s/localhost/${KongZhiJieDianIP}/g" /etc/etcd/etcd.conf
# 2. 设置Etcd实例名称为控制节点名称
sed -i "s/ETCD_NAME=\"default\"/ETCD_NAME=\"${KongZhiJieDianName}\"/" /etc/etcd/etcd.conf
# 3. 替换初始集群配置中的默认名称为控制节点名称
sed -i "s/#ETCD_INITIAL_CLUSTER=\"default/#ETCD_INITIAL_CLUSTER=\"${KongZhiJieDianName}/" /etc/etcd/etcd.conf# 定义需要启用的Etcd配置项数组# "ETCD_LISTEN_PEER_URLS" # 用于节点间通信的监听地址# "ETCD_INITIAL_ADVERTISE_PEER_URLS" # 向集群其他节点通告的地址# "ETCD_INITIAL_CLUSTER" # 初始集群成员列表# "ETCD_INITIAL_CLUSTER_TOKEN" # 集群唯一标识令牌# "ETCD_INITIAL_CLUSTER_STATE" # 初始集群状态(new为新建集群)
declare -a options=("ETCD_LISTEN_PEER_URLS" "ETCD_INITIAL_ADVERTISE_PEER_URLS""ETCD_INITIAL_CLUSTER""ETCD_INITIAL_CLUSTER_TOKEN""ETCD_INITIAL_CLUSTER_STATE"
)# 遍历配置项数组,移除行首的注释符#(仅处理以#开头且紧跟配置项的行)
for opt in "${options[@]}"; do# 正则匹配:行首为#,后跟任意空白字符(可选),再跟配置项# 替换为:直接以配置项开头(移除#和可能的空格)sed -i "s/^#\s*${opt}/${opt}/" /etc/etcd/etcd.conf
done# 设置集群令牌为"etcd-cluster-01"(自定义集群标识)
sed -i "/ETCD_INITIAL_CLUSTER_TOKEN/c ETCD_INITIAL_CLUSTER_TOKEN=\"etcd-cluster-01\"" /etc/etcd/etcd.conf### 设置Etcd开机启动并启动服务
systemctl enable etcd
systemctl start etcd## 3.4.7 验证基础环境
# 使用netstat命令查看各服务端口是否正常开启(确认服务启动成功)
# -t:显示TCP端口
# -u:显示UDP端口
# -n:不进行DNS解析(显示IP地址)
# -l:仅显示监听状态的端口
# -p:显示占用端口的进程(需要root权限)
netstat -tunlp
04-计算节点-第三章-环境准备-完成.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义控制节点的主机名变量
KongZhiJieDianName=kongzhi
# 定义计算节点的主机名变量
JiSuanJieDianName=jisuan
# 定义控制节点的IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点的IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关变量(此处为计算节点相关)
RuanJianBao=JiSuan
# 定义密码变量
PassWord=000000# 卸载chrony服务(若已安装),-y选项表示自动确认
yum remove chrony -y
# 重新安装chrony服务,-y选项表示自动确认
yum install chrony -y# 修改chrony配置文件:将以"server [0-3].centos.pool.ntp.org iburst"开头的行注释掉
# -i.bak表示修改文件时创建备份文件(备份文件后缀为.bak)
# s/^/#/表示在行首添加#号进行注释
sed -i.bak "/^server [0-3]\.centos\.pool\.ntp\.org iburst$/s/^/#/" /etc/chrony.conf# 继续修改chrony配置文件:在最后一个被注释的默认ntp服务器行之后添加控制节点作为ntp服务器
# /^#server [0-3]\.centos\.pool\.ntp\.org iburst$/ 匹配被注释的默认ntp服务器行
# :a 定义一个标签a
# n 读取下一行
# /^#server [0-3]\.centos\.pool\.ntp\.org iburst$/ ba 若下一行还是被注释的默认ntp服务器行,则跳转到标签a继续循环
# i\server ${KongZhiJieDianName} iburst 在循环结束后(即找到最后一个被注释的默认ntp服务器行后),插入一行内容,指定控制节点为主时间服务器
sed -i "/^#server [0-3]\.centos\.pool\.ntp\.org iburst$/ {:an/^#server [0-3]\.centos\.pool\.ntp\.org iburst$/ bai\server ${KongZhiJieDianName} iburst
}" /etc/chrony.conf#### 启动NTP服务并设置开机自动启动:
# 启用chronyd服务的开机自启动
systemctl enable chronyd
# 重启chronyd服务使配置生效
systemctl restart chronyd
# 查看chrony的时间源信息,验证时间同步配置
chronyc sources# 3.4.2 安装OpenStack包
# 在控制节点和计算节点上安装OpenStack包:
# 安装OpenStack命令行客户端工具python-openstackclient,-y选项表示自动确认
yum install python-openstackclient -y
05-控制节点-第四章-keystone配置-完成.sh
#!/bin/bash
# 脚本功能:OpenStack控制节点中Keystone服务的配置脚本
# 说明:该脚本用于自动化部署和配置OpenStack身份认证服务(Keystone),包括数据库准备、软件安装、配置文件修改、服务启动及身份验证等步骤# 定义变量:控制节点名称
KongZhiJieDianName=kongzhi
# 定义变量:计算节点名称
JiSuanJieDianName=jisuan
# 定义变量:控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包相关标识(此处未实际使用,保留作为预留变量)
RuanJianBao=KongZhi
# 定义变量:统一密码(用于数据库、Keystone等服务)
PassWord=000000# 数据库配置:为Keystone创建数据库并授权
# 使用mysql命令登录数据库(密码通过变量传递),执行以下SQL语句
mysql -uroot -p${PassWord} << EOF
# 创建名为keystone的数据库(Keystone服务专用)
CREATE DATABASE keystone;
# 授权keystone用户在所有主机(%)访问keystone数据库,密码为变量定义的密码
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '${PassWord}';
# 授权keystone用户在控制节点主机访问keystone数据库
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
# 授权keystone用户在本地主机访问keystone数据库
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '${PassWord}';
# 退出数据库连接
exit
EOF## 安装Keystone所需软件包
# 安装OpenStack Keystone服务、Apache HTTP服务器和mod_wsgi模块(用于运行Keystone的WSGI应用)
# -y选项表示自动确认安装
yum install openstack-keystone httpd mod_wsgi -y# 此处为图片注释占位符(原文档中的图片说明,不影响脚本执行)
# # 清理Keystone配置文件:移除注释行和空行,保留有效配置
# sed -i.bak:修改文件并创建.bak备份
# /^#/d:删除以#开头的行(注释行)
# /^[[:space:]]*$/d:删除空行(包括仅含空格的行)
sed -i.bak "/^#/d;/^[[:space:]]*$/d" /etc/keystone/keystone.conf# 配置Keystone数据库连接:在[database]配置段后添加连接信息
# mysql+pymysql:数据库连接驱动
# keystone:${PassWord}:数据库用户名和密码
# @${KongZhiJieDianName}:数据库所在主机(控制节点)
# /keystone:数据库名称
sed -i "/\[database\]/a \
connection = mysql+pymysql://keystone:${PassWord}@${KongZhiJieDianName}/keystone" /etc/keystone/keystone.conf# 配置Keystone令牌存储方式:在[token]配置段后添加fernet提供者
# Fernet是一种轻量级令牌格式,用于安全地存储和传输身份验证令牌
sed -i "/\[token\]/a \
provider = fernet" /etc/keystone/keystone.conf# 同步Keystone数据库表结构
# 使用keystone用户执行keystone-manage db_sync命令(避免权限问题)
# su -s /bin/sh -c:指定shell并执行命令
su -s /bin/sh -c "keystone-manage db_sync" keystone# 验证数据库表是否创建成功
# 登录数据库,切换到keystone库,显示所有表,确认表结构同步完成
mysql -uroot -p${PassWord} << EOF
use keystone;
show tables;
exit
EOF# 初始化Fernet密钥存储(用于令牌加密)
# --keystone-user:指定keystone服务运行用户
# --keystone-group:指定keystone服务运行用户组
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone# 初始化凭证存储(用于存储加密的敏感信息)
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone# Keystone服务引导配置(初始化管理员账户和服务端点)
# --bootstrap-password:管理员密码(使用前面定义的统一密码)
# --bootstrap-admin-url:管理员URL(Keystone服务管理端点)
# --bootstrap-internal-url:内部服务URL(OpenStack内部组件访问端点)
# --bootstrap-public-url:公共URL(外部用户访问端点)
# --bootstrap-region-id:区域ID(默认RegionOne)
keystone-manage bootstrap --bootstrap-password ${PassWord} \
--bootstrap-admin-url http://${KongZhiJieDianName}:5000/v3/ \
--bootstrap-internal-url http://${KongZhiJieDianName}:5000/v3/ \
--bootstrap-public-url http://${KongZhiJieDianName}:5000/v3/ \
--bootstrap-region-id RegionOne## 编辑Apache HTTP服务配置文件
### 添加ServerName配置(避免Apache启动警告)
# 清理httpd.conf:移除注释行和空行
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/httpd/conf/httpd.conf
# 在文件第一行插入ServerName配置,值为控制节点名称
sed -i "1i \
ServerName ${KongZhiJieDianName}" /etc/httpd/conf/httpd.conf## 创建Keystone的WSGI配置文件链接
# 将Keystone提供的wsgi配置文件链接到Apache的配置目录
# 使Apache能够加载Keystone的WSGI应用
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/# 此处为图片注释占位符(说明链接创建后的效果)
# 会在`etc/httpd/confi.d/`下面创建一个`wsgi-keystone.conf`的文件链接。
# ## 启动Apache HTTP服务并设置开机自启动
# enable:设置服务开机自动启动
systemctl enable httpd
# restart:重启服务(使配置生效)
systemctl restart httpd## 配置OpenStack客户端环境变量
# 以下配置的是临时环境变量(仅在当前shell会话中有效)
# 域相关配置(默认域)
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
# 项目和用户配置(管理员项目和用户)
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
# 管理员密码(与前面的统一密码一致)
export OS_PASSWORD=${PassWord}
# 身份认证服务URL(Keystone服务地址)
export OS_AUTH_URL=http://${KongZhiJieDianName}:5000/v3
# 身份认证API版本
export OS_IDENTITY_API_VERSION=3
# 镜像服务API版本(提前配置,后续使用)
export OS_IMAGE_API_VERSION=2# 首次验证:获取身份令牌,确认Keystone服务正常运行
openstack token issue# 此处为图片注释占位符(显示令牌验证成功的效果)
# ## 创建新域(Domain)
# OpenStack中的域用于隔离多租户环境,此处创建一个示例域
# --description:域的描述信息
openstack domain create --description "An Example Domain" example# 此处为图片注释占位符(显示域创建成功的效果)
# ## 创建新项目(Project)
### 创建Service项目(用于运行OpenStack服务的项目)
# --domain default:属于默认域
# --description:项目描述
openstack project create --domain default --description "Service Project" service# 此处为图片注释占位符(显示service项目创建成功的效果)
# ### 创建普通项目(用于演示的用户项目)
openstack project create --domain default --description "Demo Project" myproject# 此处为图片注释占位符(显示myproject项目创建成功的效果)
# ## 创建新用户(User)
# 执行以下命令创建普通用户myuser
# --domain default:属于默认域
# --password ${PassWord}:设置用户密码(使用统一密码)
openstack user create --domain default --password ${PassWord} myuser# 此处为图片注释占位符(显示myuser用户创建成功的效果)
# ## 创建新角色(Role)
# 创建名为myrole的角色(OpenStack中角色用于权限控制)
openstack role create myrole# 此处为图片注释占位符(显示myrole角色创建成功的效果)
# ## 进行权限关联(将用户、角色、项目关联起来)
# 给myuser用户在myproject项目中分配myrole角色
# 关联关系:用户(myuser) -> 角色(myrole) -> 项目(myproject)
openstack role add --project myproject --user myuser myrole# 此处为图片注释占位符(显示关联成功的效果)
# ## 清除临时环境变量(为后续验证做准备)
# 取消之前设置的OS_AUTH_URL和OS_PASSWORD环境变量
unset OS_AUTH_URL OS_PASSWORD## 使用admin用户重新请求身份验证令牌(验证权限配置)
# 显式指定认证参数,不依赖环境变量
# --os-auth-url:认证服务地址
# --os-project-domain-name/--os-user-domain-name:域信息
# --os-project-name/--os-username:项目和用户信息
# --os-password:用户密码
# token issue:获取令牌
openstack --os-auth-url http://${KongZhiJieDianName}:5000/v3 \
--os-project-domain-name Default \
--os-user-domain-name Default \
--os-project-name admin \
--os-username admin \
--os-password ${PassWord} token issue# 此处为图片注释占位符(显示管理员令牌获取成功的效果)
# ## 编写OpenStack客户端环境变量脚本(方便后续使用)
### 创建管理员环境变量脚本/root/admin-openrc
# 使用cat命令将环境变量写入文件,后续可通过source命令加载
cat <<EOF>> /root/admin-openrc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=${PassWord}
export OS_AUTH_URL=http://${KongZhiJieDianName}:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF### 创建普通用户环境变量脚本/root/demo-openrc
# 配置myuser用户的环境变量,用于普通用户操作验证
cat <<EOF>> /root/demo-openrc
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD=${PassWord}
export OS_AUTH_URL=http://${KongZhiJieDianName}:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF## 验证管理员环境变量脚本
# 切换到/root目录
cd /root
# 加载管理员环境变量脚本
source admin-openrc
# 获取令牌,验证配置是否生效
openstack token issue# 此处为图片注释占位符(显示环境变量脚本验证成功的效果)
# # 第四章结束。(标识脚本对应章节结束)
06-控制节点-第五章-5.5及之前-完成.sh
#!/bin/bash
# 该脚本用于在OpenStack控制节点部署和配置镜像服务Glance,包括数据库配置、服务凭证创建、软件安装、配置文件修改、服务启动及镜像上传等操作# 定义变量:控制节点名称、计算节点名称、控制节点IP、计算节点IP、软件包名称、密码
KongZhiJieDianName=kongzhi
# 控制节点主机名
JiSuanJieDianName=jisuan
# 计算节点主机名
KongZhiJieDianIP=192.168.1.100
# 控制节点IP地址
JiSuanJieDianIP=192.168.1.200
# 计算节点IP地址
RuanJianBao=KongZhi
# 软件包相关名称(此处未直接使用)
PassWord=000000
# 统一使用的密码(数据库、用户认证等)# 提示用户上传cirros镜像文件到控制节点的/root目录,等待用户确认
read -p "请把cirros.img文件上传到控制节点的/root/目录下,并且保证名字为cirros.img。完成之后按回车继续" continue# Glance服务部署在控制节点上,以下为具体部署步骤# ---------------------------- 数据库配置部分 ----------------------------
# 登录MySQL数据库,创建Glance所需的数据库及用户权限
# 使用here document方式执行MySQL命令
mysql -uroot -p${PassWord} << EOF
CREATE DATABASE glance;
# 创建名为glance的数据库
# 授权glance用户在所有主机、控制节点主机名、本地主机访问glance数据库的权限,密码为定义的PassWord
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY '${PassWord}';
flush privileges;
# 刷新权限使其生效
exit
EOF# ---------------------------- 创建服务凭证和API端点部分 ----------------------------
# 切换到/root目录,加载admin用户的环境变量(用于OpenStack命令认证)
cd /root
source admin-openrc## 创建Glance服务相关的凭证
### 创建名为glance的用户(属于default域,密码为定义的PassWord)
openstack user create --domain default --password ${PassWord} glance### 将admin角色添加到glance用户和service项目(关联权限)
openstack role add --project service --user glance admin### 创建Glance服务实体(名称为glance,描述为"OpenStack Image",类型为image)
openstack service create --name glance --description "OpenStack Image" image## 创建镜像服务的API端点(用于服务发现和访问)
### 创建公共端点(Region为RegionOne,服务类型为image,URL为控制节点主机名:9292)
openstack endpoint create --region RegionOne image public http://${KongZhiJieDianName}:9292### 创建内部端点(参数同公共端点,用于内部服务访问)
openstack endpoint create --region RegionOne image internal http://${KongZhiJieDianName}:9292### 创建管理端点(参数同公共端点,用于管理操作访问)
openstack endpoint create --region RegionOne image admin http://${KongZhiJieDianName}:9292# ---------------------------- 安装并配置Glance部分 ----------------------------
## 安装Glance所需的软件包(openstack-glance)
yum install openstack-glance -y## 配置Glance API服务的配置文件(/etc/glance/glance-api.conf)
# 清理配置文件:删除空行和注释行(保留备份文件.bak)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/glance/glance-api.conf
# 在[database]部分添加数据库连接配置(使用glance用户、密码、控制节点主机名连接glance数据库)
sed -i "/\[database\]/a \
connection=mysql+pymysql://glance:${PassWord}@${KongZhiJieDianName}/glance" /etc/glance/glance-api.conf### 配置[keystone_authtoken]部分(Keystone认证相关配置)
# auth_uri=http://${KongZhiJieDianName}:5000\\ # 认证URI
# auth_url=http://${KongZhiJieDianName}:5000\\ # 认证URL
# memecached_servers=${KongZhiJieDianName}:11211\\ # Memcached服务器地址
# auth_type=password\\ # 认证类型为密码
# project_domain_name=Default\\ # 项目域名称
# user_domain_name=Default\\ # 用户域名称
# project_name=service\\ # 项目名称
# username=glance\\ # 用户名
# password=${PassWord} # 密码
sed -i "/\[keystone_authtoken\]/a \\
auth_uri=http://${KongZhiJieDianName}:5000\\
auth_url=http://${KongZhiJieDianName}:5000\\
memecached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=Default\\
user_domain_name=Default\\
project_name=service\\
username=glance\\
password=${PassWord}" /etc/glance/glance-api.conf# 在[paste_deploy]部分添加flavor配置(使用keystone认证)
sed -i "/\[paste_deploy\]/a \
flavor=keystone" /etc/glance/glance-api.conf# 配置[glance_store]部分(镜像存储相关配置)
# stores=file,http\\ # 支持的存储类型
# default_store=file\\ # 默认存储类型为文件
# filesystem_store_datadir=\/var\/lib\/glance\/images\/ # 文件存储路径
sed -i "/\[glance_store\]/a \\
stores=file,http\\
default_store=file\\
filesystem_store_datadir=\/var\/lib\/glance\/images\/" /etc/glance/glance-api.conf## 配置Glance Registry服务的配置文件(/etc/glance/glance-registry.conf)
# 清理配置文件:删除空行和注释行(保留备份文件.bak)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/glance/glance-registry.conf
# 在[database]部分添加数据库连接配置(同glance-api.conf)
sed -i "/\[database\]/a \
connection=mysql+pymysql://glance:${PassWord}@${KongZhiJieDianName}/glance" /etc/glance/glance-registry.conf### 配置[keystone_authtoken]部分(同glance-api.conf的Keystone认证配置)
sed -i "/\[keystone_authtoken\]/a \\
auth_uri=http://${KongZhiJieDianName}:5000\\
auth_url=http://${KongZhiJieDianName}:5000\\
memecached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=Default\\
user_domain_name=Default\\
project_name=service\\
username=glance\\
password=${PassWord}" /etc/glance/glance-registry.conf# 在[paste_deploy]部分添加flavor配置(使用keystone认证)
sed -i "/\[paste_deploy\]/a \
flavor=keystone" /etc/glance/glance-registry.conf## 同步Glance数据库(使用glance用户执行数据库同步命令)
su -s /bin/sh -c "glance-manage db_sync" glance### 验证数据库同步结果:查看数据库和表结构
mysql -uroot -p${PassWord} << EOF
show databases;
# 查看所有数据库(确认glance存在)
use glance;
# 切换到glance数据库
show tables;
# 查看glance数据库中的表(确认表已创建)
exit
EOF# ---------------------------- 启动Glance服务部分 ----------------------------
# 设置Glance API和Registry服务开机自启
systemctl enable openstack-glance-api openstack-glance-registry# 启动Glance API和Registry服务
systemctl start openstack-glance-api openstack-glance-registry# 等待5秒,确保服务完全启动
sleep 5# 重新加载admin用户环境变量(确保认证生效)
source admin-openrc# ---------------------------- 上传和配置镜像部分 ----------------------------
## 上传cirros镜像到Glance
# 参数说明:--name指定镜像名称,--file指定本地镜像文件路径,--disk-format指定磁盘格式,--container-format指定容器格式,--visibility设置为公共镜像
glance image-create --name "cirros" --file /root/cirros.img --disk-format qcow2 --container-format bare --visibility public## 查看已上传的镜像并配置镜像属性
# 列出所有镜像,通过awk提取cirros镜像的ID(去除空格)
image_id=$(glance image-list | gawk -F '|' '/^\+/ { next } # 跳过分隔线$3 ~ /cirros/ { gsub(/ /, "", $2); print $2 } # 匹配名称包含cirros的行,提取ID列(第2列)并去空格
')# 为cirros镜像设置硬件属性(磁盘总线为ide,虚拟网卡模型为e1000)
openstack image set --property hw_disk_bus=ide --property hw_vif_model=e1000 "${image_id}"
07-控制节点-第五章-5.6-1.sh
#!/bin/bash
# 脚本解释器声明,指定使用bash shell执行本脚本# ```
## 验证内核模块
# ```
# 定义控制节点名称变量
KongZhiJieDianName=kongzhi
# 定义计算节点名称变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关变量
RuanJianBao=KongZhi
# 定义密码变量
PassWord=000000# 检查kvm内核模块是否加载
# lsmod用于列出已加载的内核模块,grep kvm用于筛选出包含kvm的模块信息
# 若kvm模块已加载,会显示相关模块信息,否则无输出
lsmod | grep kvm# ```
# 暂停脚本执行,等待用户输入
# 提示用户确认在当前提示之前的界面是否输出了大于0的整数(即kvm模块加载成功的标志)
# 若成功,按任意键继续;若未成功,提示用户关闭虚拟机并设置CPU属性后重新运行脚本
read -p "在这句提示之前,界面是否输出了一个大于0的整数,如果是,按任意键继续,如果不是,请关闭虚拟机,设置cpu属性后再运行" continue# 再次暂停脚本,提示用户准备制作CentOS 7虚拟机镜像,按任意键继续后续操作
read -p "制作CentOS 7虚拟机镜像,按任意键继续" continue# 安装kvm相关组件
# ```# 使用yum包管理器安装"server with GUI"软件组,该软件组包含图形化界面相关组件
yum group install -y "server with GUI"# 安装完成后,使用如下命令设置默认启动图形界面
# ```
# 设置系统默认启动目标为图形化界面模式
systemctl set-default graphical.target# 安装kvm及相关虚拟化工具
# qemu-kvm:KVM的核心组件,提供硬件虚拟化功能
# libvirt:虚拟化管理工具包,用于管理虚拟机
# virt-install:用于创建和安装虚拟机的命令行工具
# virt-manager:图形化的虚拟机管理工具
# virt-top:用于监控虚拟机资源使用情况的工具
# libguestfs-tools:用于操作虚拟机磁盘镜像的工具集
# mesa-libGLES-devel.x86_64:图形渲染相关库
# mesa-dri-drivers:Direct Rendering Infrastructure驱动,用于硬件加速渲染
# virt-viewer:用于连接和查看虚拟机图形界面的工具
# -y选项表示自动确认安装
yum install qemu-kvm libvirt virt-install virt-manager virt-top libguestfs-tools mesa-libGLES-devel.x86_64 mesa-dri-drivers virt-viewer -y# ```
#### 启动并设置开机启动libvirt服务
# ```
# 设置libvirtd服务开机自启动
systemctl enable libvirtd
# 立即启动libvirtd服务
systemctl start libvirtd# ```
#### 停止networkManager服务
# ```
# 停止NetworkManager服务,NetworkManager是用于管理网络连接的服务,此处暂时停止可能为了后续网络配置
systemctl stop NetworkManager# 向/etc/sysctl.conf文件追加网络相关配置
# net.ipv4.ip_forward = 0:禁用IPv4转发功能
# net.bridge.bridge-nf-call-ip6tables = 0:禁止bridge对IPv6数据包调用iptables规则
# net.bridge.bridge-nf-call-iptables = 0:禁止bridge对IPv4数据包调用iptables规则
# net.bridge.bridge-nf-call-arptables = 0:禁止bridge对ARP数据包调用arptables规则
cat <<EOF>> /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
EOF#### 重启网络服务
# ```
# 重启network服务,使网络配置生效
systemctl restart network
# 重启NetworkManager服务,恢复网络管理服务运行
systemctl restart NetworkManager# ```
# 注释说明:为了方便后续使用,在计算节点上也执行了上述安装操作# ```
# 暂停脚本执行,提示用户按Enter键重启系统,重启后执行下一个脚本
read -p "按Enter键,重启系统,然后执行下一个脚本" continue
# 重启系统
reboot
08-控制节点-第五章-5.6-2.sh
#!/bin/bash
# 定义控制节点名称变量
KongZhiJieDianName=kongzhi
# 定义计算节点名称变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包名称变量
RuanJianBao=KongZhi
# 定义密码变量
PassWord=000000# 提示用户将指定的CentOS 7最小化安装镜像文件放置到/opt目录下,且文件名需与提示一致
# 等待用户按任意键后继续执行脚本
read -p "请把CentOS-7-x86_64-Minimal-2009.iso文件放在/opt目录下,保证文件名字与这里的提示相同 ,完成后按任意键继续" continue# 准备CentOS 7安装镜像相关操作
## 说明:已将CentOS-7-x86_64-Minimal-2009.iso系统安装镜像放置在控制节点的/opt目录下
# ## 切换到/tmp目录,创建一个10GB大小的raw格式磁盘镜像文件,文件名为centos7_mini.img
# 切换工作目录至/tmp
cd /tmp/
# 使用qemu-img工具创建磁盘镜像,-f指定格式为raw,最后指定大小为10G
qemu-img create -f raw centos7_mini.img 10G# 提示用户即将部署虚拟机,按任意键继续
read -p "部署虚拟机,按任意键继续" continue
# 使用virt-install工具部署虚拟机
# --name指定虚拟机名称为centos_mini
# --ram指定虚拟机内存为1024MB
# --vcpus指定虚拟CPU数量为1
# --disk指定磁盘路径为/tmp/centos7_mini.img
# --network指定网络使用default网络,网卡模型为virtio
# --arch指定架构为x86_64
# --os-type指定操作系统类型为linux
# --graphics指定图形显示方式为vnc,端口为5910
# --cdrom指定安装光盘镜像路径为/opt/CentOS-7-x86_64-Minimal-2009.iso
# --boot指定启动方式为从光盘启动
virt-install --name centos_mini --ram 1024 --vcpus=1 --disk path=/tmp/centos7_mini.img --network network:default,model=virtio --arch=x86_64 --os-type=linux --graphics vnc,port=5910 --cdrom /opt/CentOS-7-x86_64-Minimal-2009.iso --boot cdrom
# ```
# 
# 进入图形界面查看:
# 
# 提示用户进入图形界面完成后续安装工作
echo 进入图形界面查看,并完成后续工作
09-控制节点-第五章-5.6-3.sh
#!/bin/bash
# 脚本功能:将raw格式的镜像文件转换为qcow2格式,并上传至OpenStack镜像服务(Glance),
# 同时设置镜像的硬件属性以适配特定虚拟化环境# 使用qemu-img工具进行镜像格式转换
# -f raw:指定源镜像的格式为raw
# -O qcow2:指定目标镜像的格式为qcow2
# /tmp/centos7_mini.img:源镜像文件路径(raw格式)
# /centos7_mini.qcow2:目标镜像文件路径(转换后的qcow2格式)
qemu-img convert -f raw -O qcow2 /tmp/centos7_mini.img /centos7_mini.qcow2# 加载OpenStack管理员环境变量配置文件
# 该文件通常包含认证URL、用户名、密码、项目等信息,用于后续OpenStack命令的身份认证
source /root/admin-openrc# 使用glance命令创建镜像并上传至OpenStack
# --name "centos7.9.2009-minimal":指定镜像的名称
# --file /centos7_mini.qcow2:指定要上传的镜像文件路径(已转换的qcow2格式)
# --disk-format qcow2:指定镜像的磁盘格式为qcow2
# --container-format bare:指定镜像的容器格式为bare(表示无容器封装)
# --visibility public:设置镜像的可见性为公共(所有项目可访问)
glance image-create --name "centos7.9.2009-minimal" --file /centos7_mini.qcow2 --disk-format qcow2 --container-format bare --visibility public# 列出当前OpenStack中的所有镜像,用于确认上传结果
glance image-list# 提取刚创建的centos7.9.2009-minimal镜像的ID
# glance image-list:获取镜像列表信息
# gawk -F '|':使用gawk工具,以竖线|作为字段分隔符处理输出
# /^\+/ { next }:跳过以+开头的分隔线(表格边框线)
# $3 ~ /centos7\.9\.2009-minimal/:匹配Name列(第3个字段)包含centos7.9.2009-minimal的行
# gsub(/ /, "", $2):去除ID列(第2个字段)中的所有空格
# print $2:输出处理后的镜像ID
image_id=$(glance image-list | gawk -F '|' '/^\+/ { next } # 跳过分隔线$3 ~ /centos7\.9\.2009-minimal/ { gsub(/ /, "", $2); print $2 } # $3是Name列,$2是ID列(去空格)
')# 设置镜像的硬件属性,适配虚拟化环境
# --property hw_disk_bus=ide:设置磁盘总线类型为ide
# --property hw_vif_model=e1000:设置虚拟网卡模型为e1000
# "${image_id}":指定要设置属性的镜像ID(通过上面的命令获取)
openstack image set --property hw_disk_bus=ide --property hw_vif_model=e1000 "${image_id}"
10-控制节点-第六章-6.2.sh
#!/bin/bash
# 该脚本用于在OpenStack控制节点上部署和配置Placement组件
# Placement服务用于跟踪资源(如计算节点的CPU、内存等)的使用情况,是OpenStack Nova等服务的重要依赖# 定义变量:控制节点名称
KongZhiJieDianName=kongzhi
# 定义变量:计算节点名称
JiSuanJieDianName=jisuan
# 定义变量:控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包相关名称(此处未直接使用,可能为预留变量)
RuanJianBao=KongZhi
# 定义变量:数据库及服务认证密码
PassWord=000000### 登录MySQL数据库并创建Placement所需数据库及授权
# 使用root用户登录MySQL,执行以下SQL命令(通过Here Document方式传入)
mysql -uroot -p${PassWord} << EOF
# 创建placement数据库
CREATE DATABASE placement;
# 授权placement用户在本地访问placement数据库,密码为定义的PassWord
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'localhost' IDENTIFIED BY '${PassWord}';
# 授权placement用户从控制节点访问placement数据库,密码为定义的PassWord
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
# 授权placement用户从任意主机访问placement数据库,密码为定义的PassWord(生产环境需谨慎使用)
GRANT ALL PRIVILEGES ON placement.* TO 'placement'@'%' IDENTIFIED BY '${PassWord}';
# 刷新权限使配置生效
flush privileges;
# 退出MySQL
exit
EOF## 6.2.2 创建服务凭证和API端点
### 生效admin用户环境变量
# 切换到/root目录
cd /root/
# 加载admin用户的环境变量(包含OpenStack管理员认证信息)
source admin-openrc### 创建服务凭证
# 在OpenStack中创建placement用户,属于default域,密码为定义的PassWord
openstack user create --domain default --password ${PassWord} placement#### 关联角色:给placement用户添加admin角色(关联到service项目)
# 将admin角色赋予service项目下的placement用户,使其具备管理权限
openstack role add --project service --user placement admin#### 创建placement服务实例认证
# 在OpenStack中注册placement服务,名称为placement,描述为"Placement API"
openstack service create --name placement --description "Placement API" placement### 创建API端点
# 创建placement服务的公共端点(public),URL为控制节点的8778端口
openstack endpoint create --region RegionOne placement public http://${KongZhiJieDianName}:8778
# 创建placement服务的内部端点(internal),URL同上(单节点部署通常内外端点一致)
openstack endpoint create --region RegionOne placement internal http://${KongZhiJieDianName}:8778
# 创建placement服务的管理员端点(admin),URL同上
openstack endpoint create --region RegionOne placement admin http://${KongZhiJieDianName}:8778## 6.2.3 安装并配置Placement组件
### 安装Placement组件所需的软件包
# 使用yum安装openstack-placement-api包(Placement服务的API组件)
yum install openstack-placement-api -y### 配置placement所需组件
# 清理placement配置文件:删除所有注释行(以#开头,可能包含空格)和空行,备份原文件为.bak
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/placement/placement.conf# 配置数据库连接:在[placement_database]段落下添加数据库连接信息
# 连接格式为:mysql+pymysql://用户名:密码@控制节点名称/数据库名
sed -i "/\[placement_database\]/a \\
connection=mysql+pymysql://placement:${PassWord}@${KongZhiJieDianName}/placement" /etc/placement/placement.conf# 配置认证策略:在[api]段落下设置认证策略为keystone(使用OpenStack的Keystone服务认证)
sed -i "/\[api\]/a \\
auth_strategy=keystone" /etc/placement/placement.conf# 配置Keystone认证信息:在[keystone_authtoken]段落下添加以下认证参数
# auth_url:Keystone服务的认证URL
# memcached_servers:memcached服务地址(用于缓存认证信息)
# auth_type:认证类型为密码认证
# project_domain_name、user_domain_name:域名称(默认为Default)
# project_name:所属项目(service项目)
# username:认证用户(placement)
# password:认证密码(定义的PassWord)
sed -i "/\[keystone_authtoken\]/a \\
auth_url=http://${KongZhiJieDianName}:5000/v3\\
memcached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=Default\\
user_domain_name=Default\\
project_name=service\\
username=placement\\
password=${PassWord}" /etc/placement/placement.conf# 配置Apache虚拟主机权限:解决Placement API的权限问题
# 在00-placement-api.conf配置文件的<VirtualHost *:8778>段落下添加目录权限配置
# 允许访问/usr/bin目录(放置Placement API相关命令),适配不同Apache版本的权限语法
sed -i.bak "/<VirtualHost \*:8778>/a\\
<Directory \/usr\/bin>\\
<IfVersion >= 2.4>\\
Require all granted\\
<\/IfVersion>\\
<IfVersion < 2.4>\\
Order allow,deny\\
Allow from all\\
<\/IfVersion>\\
<\/Directory>" /etc/httpd/conf.d/00-placement-api.conf ### 同步数据库
# 切换到placement用户执行数据库同步命令,初始化placement数据库表结构
su -s /bin/sh -c "placement-manage db sync" placement# 验证数据库同步结果:使用placement用户登录MySQL
mysql -uplacement -p${PassWord} << EOF
# 查看所有数据库(确认placement数据库存在)
show databases;
# 切换到placement数据库
use placement;
# 查看数据库表(确认表已创建)
show tables;
# 退出MySQL
exit
EOF### 重启httpd服务
# 重启Apache服务使Placement配置生效
systemctl restart httpd## 6.2.4 Placement验证
### 生效admin用户环境变量
# 切换到/root目录
cd /root/
# 重新加载admin用户环境变量(确保认证信息有效)
source admin-openrc### 执行状态检查
# 检查Placement服务的升级状态(验证服务是否正常运行)
placement-status upgrade check
11-控制节点-第六章-6.3.sh
#!/bin/bash
# 声明脚本使用bash shell执行# 定义变量:控制节点名称
KongZhiJieDianName=kongzhi
# 定义变量:计算节点名称
JiSuanJieDianName=jisuan
# 定义变量:控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包相关标识(此处为控制节点标识)
RuanJianBao=KongZhi
# 定义变量:通用密码(用于数据库、用户认证等)
PassWord=000000# 6.3 安装并配置控制节点Nova服务
# Nova是OpenStack中的计算服务,负责实例的生命周期管理## 6.3.1 数据库配置
# 为Nova服务创建所需的数据库并配置权限### 登录MySQL数据库并执行SQL命令
# 使用root用户登录MySQL,密码通过变量PassWord传递
# << EOF 表示此处开始输入多行命令,直到遇到EOF结束
mysql -uroot -p${PassWord} << EOF
# 创建nova_api数据库(存储API相关数据)
CREATE DATABASE nova_api;
# 创建nova数据库(存储主要计算服务数据)
CREATE DATABASE nova;
# 创建nova_cell0数据库(存储cell0单元格数据,cell用于分片管理计算资源)
CREATE DATABASE nova_cell0;# 授予nova用户对nova_api数据库的所有权限
# 允许本地登录(localhost)
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY '${PassWord}';
# 允许控制节点主机名登录
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
# 允许所有IP登录(%表示任意主机)
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY '${PassWord}';# 授予nova用户对nova数据库的所有权限
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY '${PassWord}';# 授予nova用户对nova_cell0数据库的所有权限
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY '${PassWord}';# 退出MySQL
exit
EOF# # 此处为图片占位符,可能用于展示数据库创建结果## 6.3.2 创建服务凭证和API端点
# 在Keystone中创建Nova服务的用户、角色关联,并注册API端点### 生效admin用户环境变量
# 切换到/root目录
cd /root/
# 加载admin用户的环境变量(包含认证信息,如用户名、密码、认证URL等)
source admin-openrc### 创建服务凭证
#### 创建nova用户
# 在default域中创建nova用户,密码使用变量PassWord
openstack user create --domain default --password=${PassWord} nova# 我设置的密码是`${PassWord}`。 # 说明密码设置值#### 进行关联
# 将nova用户添加到service项目,并赋予admin角色(授权管理权限)
openstack role add --project service --user nova admin#### 创建Nova服务实体认证
# 在OpenStack中注册nova服务实体,名称为nova,描述为"OpenStack Compute",类型为compute
openstack service create --name nova --description "OpenStack Compute" compute# # 图片占位符,可能展示服务创建结果### 创建API端点
# API端点是服务的访问入口,OpenStack通常包含public(公共)、internal(内部)、admin(管理员)三种端点#### 创建公共端点
# 为compute服务(nova)创建公共端点,区域为RegionOne,URL为控制节点主机名:8774/v2.1
openstack endpoint create --region RegionOne compute public http://${KongZhiJieDianName}:8774/v2.1#### 创建内部端点
# 创建内部端点,URL与公共端点相同(实际环境可能不同,此处简化)
openstack endpoint create --region RegionOne compute internal http://${KongZhiJieDianName}:8774/v2.1#### 创建管理端点
# 创建管理员端点,URL与公共端点相同(实际环境可能不同,此处简化)
openstack endpoint create --region RegionOne compute admin http://${KongZhiJieDianName}:8774/v2.1# # 图片占位符,可能展示端点创建结果## 6.3.3 安装并配置Nova组件
### 安装Nova组件所需软件包
# 注释掉的命令:卸载已有的nova相关包(如需重新安装时使用)
# yum remove openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler -y
# 安装nova组件:api(提供API服务)、console(控制台服务)、conductor(数据库交互中间件)、novncproxy(VNC代理)、scheduler(调度器)
yum install openstack-nova-api openstack-nova-console openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler -y# # 图片占位符,可能展示安装结果### 配置Nova所需组件
# 清理nova配置文件:删除所有注释行(以#开头,可能包含空格)和空行,备份原文件为.nova.conf.bak
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/nova/nova.conf# 配置[DEFAULT]部分
# 在[DEFAULT]配置块后添加以下内容:
# enable_apis:启用的API,包括osapi_compute(计算API)和metadata(元数据API)
# transport_url:消息队列(RabbitMQ)连接地址,用户为openstack,密码为PassWord,主机为控制节点
# my_ip:控制节点IP地址
# user_neutron:启用Neutron网络服务集成
# firewall_driver:禁用nova自带防火墙(由Neutron管理防火墙)
sed -i "/\[DEFAULT\]/a \\
enable_apis=osapi_compute,metadata\\
transport_url=rabbit://openstack:${PassWord}@${KongZhiJieDianName}\\
my_ip=${KongZhiJieDianIP}\\
user_neutron=True\\
firewall_driver=nova.virt.firewall.NoopFirewallDriver" /etc/nova/nova.conf# 配置[api_database]部分:设置nova_api数据库连接
# 连接方式为mysql+pymysql,用户为nova,密码为PassWord,主机为控制节点,数据库为nova_api
sed -i "/\[api_database\]/a \\
connection=mysql+pymysql://nova:${PassWord}@${KongZhiJieDianName}/nova_api" /etc/nova/nova.conf# 配置[database]部分:设置nova数据库连接
# 连接方式为mysql+pymysql,用户为nova,密码为PassWord,主机为控制节点,数据库为nova
sed -i "/\[database\]/a \\
connection=mysql+pymysql://nova:${PassWord}@${KongZhiJieDianName}/nova" /etc/nova/nova.conf# 配置[api]部分:设置认证策略为keystone
sed -i "/\[api\]/a \\
auth_strategy=keystone" /etc/nova/nova.conf# 配置[keystone_authtoken]部分(Keystone认证相关)
# auth_uri:认证URI
# auth_url:认证URL
# memcached_servers:memcached服务地址(用于缓存认证令牌)
# auth_type:认证类型为密码
# project_domain_name:项目域为Default
# user_domain_name:用户域为Default
# project_name:项目名为service
# username:用户名为nova
# password:密码为PassWord
sed -i "/\[keystone_authtoken\]/a\\
auth_uri=http://${KongZhiJieDianName}:5000/\\
auth_url=http://${KongZhiJieDianName}:5000/\\
memcached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=Default\\
user_domain_name=Default\\
project_name=service\\
username=nova\\
password=${PassWord}" /etc/nova/nova.conf# 配置[vnc]部分(VNC远程控制台相关)
# enable:启用VNC
# vncserver_listen:VNC服务器监听地址(使用前面定义的my_ip变量)
# vncserver_proxyclient_address:VNC代理客户端地址(使用my_ip变量)
sed -i "/\[vnc\]/a\\
enable=True\\
vncserver_listen=\$my_ip\\
vncserver_proxyclient_address=\$my_ip" /etc/nova/nova.conf# 配置[glance]部分:设置Glance镜像服务的API地址
sed -i "/\[glance\]/a\\
api_servers=http://${KongZhiJieDianName}:9292" /etc/nova/nova.conf# 配置[oslo_concurrency]部分:设置锁文件路径
sed -i "/\[oslo_concurrency\]/a\\
lock_path=/var/lib/nova/tmp" /etc/nova/nova.conf# 配置[placement]部分(Placement服务相关,用于资源追踪)
# os_region_name:区域名称为RegionOne
# project_domain_name:项目域为Default
# project_name:项目名为service
# auth_type:认证类型为密码
# user_domain_name:用户域为Default
# auth_url:认证URL(v3版本)
# username:用户名为placement
# password:密码为PassWord
sed -i "/\[placement\]/a\\
os_region_name=RegionOne\\
project_domain_name=Default\\
project_name=service\\
auth_type=password\\
user_domain_name=Default\\
auth_url=http://${KongZhiJieDianName}:5000/v3\\
username=placement\\
password=${PassWord}" /etc/nova/nova.conf### 同步数据库
#### 填充nova_api数据库
# 以nova用户身份执行nova-manage命令,同步api数据库结构
su -s /bin/sh -c "nova-manage api_db sync" nova#### 注册cell0数据库
# 注册cell0单元格(预定义的单元格,用于存放未调度的实例)
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova#### 创建cell1单元格
# 创建名为cell1的单元格(用于存放实际计算节点资源),--verbose显示详细信息
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova#### 填充nova数据库
# 同步nova主数据库结构
su -s /bin/sh -c "nova-manage db sync" nova# # 图片占位符,可能展示数据库同步结果#### 进入nova数据库查看数据表,验证是否同步成功
# 使用nova用户登录MySQL,查看数据库列表、切换到nova数据库并显示表列表
mysql -unova -p${PassWord} << EOF
show databases;
use nova;
show tables;
exit
EOF
# # 图片占位符,可能展示表结构验证结果#### 验证nova cell0和cell1是否正确注册
# 列出所有单元格,验证cell0和cell1是否注册成功
su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova# # 图片占位符,可能展示单元格验证结果### 启动nova服务并设置开机启动
# 启用nova相关服务的开机自启动
systemctl enable openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy openstack-nova-console
# 启动nova相关服务
systemctl start openstack-nova-api openstack-nova-scheduler openstack-nova-conductor openstack-nova-novncproxy openstack-nova-console# # 图片占位符,可能展示服务启动结果
12-计算节点-第六章-6.4.sh
#!/bin/bash
# 脚本文件:12-计算节点-第六章-6.4.sh
# 功能描述:本脚本用于在OpenStack环境中安装并配置计算节点(Compute Node)的相关组件,
# 主要围绕Nova计算服务展开,包括环境验证、软件安装、配置文件修改及服务启动等步骤## 一、验证内核模块(KVM虚拟化支持检查)
# 说明:KVM(Kernel-based Virtual Machine)是Linux内核中的虚拟化模块,计算节点需要启用KVM以支持虚拟机运行
# 命令功能:列出当前加载的内核模块,并筛选出包含"kvm"的模块,验证KVM模块是否已加载
# 预期结果:若输出包含kvm相关模块(如kvm、kvm_intel或kvm_amd),则表示KVM已正常加载;若未输出,则需检查CPU虚拟化支持并启用
echo "## 验证内核模块"
echo "# 执行以下命令检查KVM模块是否加载:"
echo "# lsmod | grep kvm"
lsmod | grep kvm# 交互提示:确认KVM模块加载状态
# 说明:此处提示可能存在笔误("支行"应为"执行"),实际作用是让用户确认KVM模块是否正常加载
# 若未加载(如输出为空),需关闭虚拟机,在虚拟化软件(如VMware、VirtualBox)中开启CPU虚拟化支持(如Intel VT-x或AMD-V)
read -p "在这句提示之前,界面是否输出了kvm相关模块信息,如果是,按任意键继续,如果不是,请关闭虚拟机,设置cpu属性后再执行" continue## 二、定义环境变量(配置基础参数)
# 说明:通过变量统一管理环境参数,便于后续脚本维护和修改
KongZhiJieDianName=kongzhi
# 控制节点主机名
JiSuanJieDianName=jisuan
# 计算节点主机名
KongZhiJieDianIP=192.168.1.100
# 控制节点IP地址
JiSuanJieDianIP=192.168.1.200
# 计算节点IP地址
RuanJianBao=KongZhi
# 软件包相关标识(此处未实际使用,预留参数)
PassWord=000000
# 通用密码(用于RabbitMQ、Keystone等服务认证)## 三、安装并配置Nova组件(计算服务核心组件)
### 3.1 安装nova组件所需软件包
# 说明:Nova是OpenStack的计算服务,负责实例(虚拟机)的生命周期管理
# 步骤1:先卸载已安装的openstack-nova-compute包(若存在),确保环境干净
yum remove openstack-nova-compute -y
# 步骤2:重新安装openstack-nova-compute包,确保获取最新版本或指定版本
yum install openstack-nova-compute -y### 3.2 配置nova所需组件(修改配置文件/etc/nova/nova.conf)
# 预处理:清理配置文件中的注释行和空行,便于后续配置修改
# 命令解释:sed -i.bak 表示备份原文件(后缀为.bak);/^[[:space:]]*#/d 删除注释行(以#开头,允许前导空格);/^[[:space:]]*$/d 删除空行(允许前导空格)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/nova/nova.conf#### 3.2.1 配置[DEFAULT]部分
# 功能:设置Nova的核心参数,包括启用的API、消息队列、网络支持等
# 说明:在[DEFAULT]段落后追加以下配置:
# - enabled_apis:启用计算API和元数据API(osapi_compute用于实例管理,metadata用于实例获取元数据)
# - transport_url:配置RabbitMQ消息队列连接(OpenStack各组件通过消息队列通信,格式为rabbit://用户名:密码@控制节点IP)
# - my_ip:指定计算节点的管理IP地址
# - use_neutron:启用Neutron网络服务(替代Nova网络)
# - firewall_driver:禁用Nova自带防火墙(由Neutron管理网络防火墙)
sed -i "/\[DEFAULT\]/a\\
enabled_apis=osapi_compute,metadata\\
transport_url=rabbit://openstack:${PassWord}@${KongZhiJieDianIP}\\
my_ip=${JiSuanJieDianIP}\\
use_neutron=True\\
firewall_driver=nova.virt.firewall.NoopFirewallDriver" /etc/nova/nova.conf#### 3.2.2 配置[api]部分(身份认证策略)
# 功能:指定Nova API使用Keystone进行身份认证
# 说明:auth_strategy=keystone 表示启用Keystone认证
sed -i "/\[api\]/a\\
auth_strategy=keystone" /etc/nova/nova.conf#### 3.2.3 配置[keystone_authtoken]部分(Keystone认证详细参数)
# 功能:配置与Keystone服务的连接参数,实现身份验证
# 各参数说明:
# - auth_uri:Keystone公共端点(用于非管理员用户认证)
# - auth_url:Keystone管理端点(用于管理员用户认证)
# - memcached_servers:memcached服务地址(Keystone用于缓存令牌,提高性能)
# - auth_type:认证类型(密码认证)
# - project_domain_name/user_domain_name:域名称(默认域为Default)
# - project_name:服务项目名称(OpenStack服务通常属于service项目)
# - username:Nova服务在Keystone中的用户名
# - password:Nova服务用户的密码(与PassWord变量一致)
sed -i "/\[keystone_authtoken\]/a\\
auth_uri=http://${KongZhiJieDianIP}:5000/\\
auth_url=http://${KongZhiJieDianIP}:5000/\\
memcached_servers=${KongZhiJieDianIP}:11211\\
auth_type=password\\
project_domain_name=Default\\
user_domain_name=Default\\
project_name=service\\
username=nova\\
password=${PassWord}" /etc/nova/nova.conf#### 3.2.4 配置[vnc]部分(远程控制台访问)
# 功能:启用并配置VNC远程控制台,允许用户通过网页或VNC客户端访问实例
# 各参数说明:
# - enabled:启用VNC功能
# - vncserver_listen:VNC服务器监听地址(0.0.0.0表示监听所有网络接口)
# - vncserver_proxyclient_address:VNC代理客户端地址(使用计算节点的管理IP,即$my_ip)
# - novncproxy_base_url:NoVNC代理的访问URL(通过控制节点的6080端口访问)
sed -i "/\[vnc\]/a\\
enabled=True\\
vncserver_listen=0.0.0.0\\
vncserver_proxyclient_address=\$my_ip\\
novncproxy_base_url=http://${KongZhiJieDianIP}:6080/vnc_auto.html" /etc/nova/nova.conf#### 3.2.5 配置[glance]部分(镜像服务连接)
# 功能:指定Glance镜像服务的API地址,使Nova能够获取镜像用于创建实例
# 说明:api_servers指向控制节点上Glance服务的9292端口(Glance的API端口)
sed -i "/\[glance\]/a\\
api_servers=http://${KongZhiJieDianIP}:9292" /etc/nova/nova.conf#### 3.2.6 配置[oslo_concurrency]部分(并发控制)
# 功能:配置Nova并发操作时的锁文件路径
# 说明:lock_path指定锁文件存储目录,用于避免并发操作冲突
sed -i "/\[oslo_concurrency\]/a\\
lock_path=/var/lib/nova/tmp" /etc/nova/nova.conf#### 3.2.7 配置[placement]部分(资源Placement服务)
# 功能:配置与Placement服务的连接,Placement服务用于跟踪资源使用情况(如CPU、内存)
# 各参数说明:
# - os_region_name:区域名称(默认区域为RegionOne)
# - project_domain_name/user_domain_name:域名称(默认域为Default)
# - project_name:服务项目名称(service项目)
# - auth_type:认证类型(密码认证)
# - auth_url:Keystone的V3版本认证端点(Placement使用V3 API)
# - username:Placement服务在Keystone中的用户名
# - password:Placement服务用户的密码(与PassWord变量一致)
sed -i "/\[placement\]/a\\
os_region_name=RegionOne\\
project_domain_name=Default\\
project_name=service\\
auth_type=password\\
user_domain_name=Default\\
auth_url=http://${KongZhiJieDianIP}:5000/v3\\
username=placement\\
password=${PassWord}" /etc/nova/nova.conf## 四、检查主机是否支持虚拟机硬件加速
### 4.1 执行命令检查CPU虚拟化支持
# 说明:vmx是Intel CPU的虚拟化技术标识,svm是AMD CPU的虚拟化技术标识
# 命令功能:统计/proc/cpuinfo中包含vmx或svm的行数,若结果大于0,说明CPU支持硬件虚拟化
echo "## 检查主机是否支持虚拟机硬件加速"
echo "# 执行以下命令检查CPU虚拟化支持:"
echo "# egrep -c \"(vmx|svm)\" /proc/cpuinfo"
egrep -c "(vmx|svm)" /proc/cpuinfo# 说明:此处为图片占位符,原文档可能包含命令执行结果的截图示例
#### 4.2 启动Nova服务并设置开机自启动
# 说明:libvirtd是管理KVM虚拟机的服务,openstack-nova-compute是Nova计算服务
# 步骤1:设置服务开机自启动(enable)
systemctl enable libvirtd openstack-nova-compute
# 步骤2:立即启动服务(start)
systemctl start libvirtd openstack-nova-compute
13-控制节点-第六章-6.5、6.6.sh
#!/bin/bash
# 脚本文件:13-控制节点-第六章-6.5、6.6.sh
# 功能描述:该脚本用于OpenStack云平台中控制节点上执行计算节点配置同步及Nova服务验证操作
# 适用场景:OpenStack部署过程中,完成计算节点基础配置后,在控制节点进行的后续配置与验证步骤# ============================== 6.5 计算节点配置同步 ==============================
# 说明:虽然本节标题为"计算节点配置同步",但实际所有操作均在控制节点上执行
# 目的:将计算节点信息注册到控制节点的数据库中,确保控制节点能识别并管理计算节点## 定义环境变量:存储节点名称、IP地址、相关密码等配置信息
# 控制节点主机名
KongZhiJieDianName=kongzhi
# 计算节点主机名
JiSuanJieDianName=jisuan
# 控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 软件包相关标识(此处为自定义变量,可能用于后续软件包操作)
RuanJianBao=KongZhi
# 密码(可能用于节点间认证或服务配置)
PassWord=000000# 切换到/root目录(OpenStack管理员操作通常在此目录执行)
cd /root/
# 加载admin用户的环境变量脚本,获取管理员权限(该脚本包含OpenStack管理员的认证信息,如用户名、密码、项目等)
source admin-openrc# 查看数据库中已注册的计算服务(nova-compute)
# 作用:确认当前控制节点已知的计算节点服务列表,验证计算节点是否已初步注册
openstack compute service list --service nova-compute# 此处为图片占位符,原文档可能通过图片展示上述命令的执行结果
### 发现计算主机并将其添加到单元格(cell)中
# 说明:Nova细胞v2(cell_v2)架构用于将计算节点分组管理,此命令用于发现新的计算节点并注册到数据库
# 执行方式:以nova用户身份运行(su -s /bin/sh -c "命令" nova),确保权限正确
# --verbose:显示详细执行过程,便于排查问题
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova# 此处为图片占位符,原文档可能通过图片展示主机发现命令的执行结果(注:原文档提示此处可能执行失败,需注意排查)
## ============================== 6.6 验证Nova服务 ==============================
# 说明:本节操作均在控制节点执行,目的是验证Nova计算服务与其他组件的连接及整体运行状态## 重新加载admin用户环境变量(确保环境变量生效,避免因环境变量失效导致命令执行失败)
cd /root/
source admin-openrc## 查看所有Nova计算服务状态
# 作用:检查控制节点和计算节点上的Nova相关服务(如nova-api、nova-scheduler、nova-compute等)是否正常运行
# 正常状态应为"up",若为"down"则表示服务异常
openstack compute service list# 此处为图片占位符,原文档可能通过图片展示Nova服务列表的正常状态
### 验证Nova与Keystone身份服务的连接
# 作用:Keystone是OpenStack的身份认证服务,此命令列出所有已注册的服务目录,确认Nova服务已正确注册到Keystone
openstack catalog list# 此处为图片占位符,原文档可能通过图片展示服务目录中Nova相关服务的注册信息
### 验证Nova与Glance镜像服务的连接
# 作用:Glance是OpenStack的镜像服务,此命令列出所有可用镜像,确认Nova能正常访问Glance获取镜像资源
openstack image list# 此处为图片占位符,原文档可能通过图片展示Glance中的镜像列表,验证连接正常
### 整体状态检查
### 编辑placement API的Apache配置文件(已提前完成,此处仅做说明)
# 说明:Placement服务用于跟踪资源使用情况,该配置确保Apache能正确代理placement API请求
# 配置内容:在<virtualhost *:8778>标签内添加目录权限设置,允许访问/usr/bin目录
# 注:原作者已提前完成此配置,故此处注释掉无需重复执行
# <Directory /usr/bin>
# <IfVersion >= 2.4>
# Require all granted
# </IfVersion>
# <IfVersion < 2.4>
# Order allow,deny
# Allow from all
# </IfVersion>
# </Directory>### 重启Apache服务(因配置已提前完成,故无需执行)
# 说明:修改配置文件后需重启httpd服务使配置生效,此处因无需修改配置,故注释掉
# systemctl restart httpd### 检查Nova整体状态及升级先决条件
# 作用:验证单元格(cell)配置、placement API连接、数据库 schema 版本等关键组件是否正常
# 输出结果中"Upgrade Check Results"应为"Success",表示所有检查通过
nova-status upgrade check# 此处为图片占位符,原文档可能通过图片展示状态检查的成功结果
## 操作完成提示:第六章配置与验证步骤已完成
# 注:原文档提到书中存在部分问题,已通过查阅资料解决,确保当前环境配置正确
# 第六章做完了。书中有一点问题,经查找资料,已解决。
14-控制节点-第七章-7.2.sh
#!/bin/bash
# 定义控制节点名称变量
KongZhiJieDianName=kongzhi
# 定义计算节点名称变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关变量(此处可能为自定义标识)
RuanJianBao=KongZhi
# 定义通用密码变量(用于数据库、用户认证等)
PassWord=000000# 7.1 基本概念说明
# Neutron网络服务需要至少配置一个外部网络,同时可以配置一个或多个内部网络# 7.2 安装并配置控制节点(Neutron网络服务)## 7.2.1 数据库配置
### 登录MySQL数据库并执行以下SQL语句
# 1. 创建neutron数据库(用于存储Neutron服务数据)
# 2. 授权neutron用户在本地主机访问neutron数据库,密码为定义的PassWord
# 3. 授权neutron用户在控制节点主机访问neutron数据库,密码为定义的PassWord
# 4. 授权neutron用户在所有主机访问neutron数据库,密码为定义的PassWord
# 5. 刷新权限使配置生效
# 6. 退出数据库
mysql -uroot -p${PassWord} <<EOF
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '${PassWord}';
flush privileges;
exit
EOF## 7.2.2 创建服务凭证和API端点
### 切换到/root目录并加载admin用户环境变量(获取管理员权限)
cd /root/
source admin-openrc### 创建服务凭证
#### 创建名为neutron的用户(属于default域,密码为定义的PassWord)
openstack user create --domain default --password=${PassWord} neutron#### 将neutron用户添加到service项目并赋予admin角色(授权管理员权限)
openstack role add --project service --user neutron admin#### 创建Neutron服务实体(名称为neutron,描述为"OpenStack Networking",类型为network)
openstack service create --name neutron --description "OpenStack Networking" network### 创建API端点(供其他服务访问Neutron服务)
# 创建公共端点(public)
openstack endpoint create --region RegionOne network public http://${KongZhiJieDianName}:9696
# 创建内部端点(internal)
openstack endpoint create --region RegionOne network internal http://${KongZhiJieDianName}:9696
# 创建管理端点(admin)
openstack endpoint create --region RegionOne network admin http://${KongZhiJieDianName}:9696## 7.2.3 安装并配置Neutron组件
### 安装Neutron组件所需的软件包
# openstack-neutron:Neutron核心包
# openstack-neutron-ml2:ML2插件(多图层2插件,负责网络类型管理)
# openstack-neutron-linuxbridge:Linux桥接代理(负责网络桥接)
# ebtables:以太网桥接防火墙工具(用于网络规则管理)
yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge ebtables -y### 配置`/etc/neutron/neutron.conf`文件(Neutron主配置文件)
#### 清理配置文件:删除空行和注释行(.bak为备份文件)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/neutron.conf#### 配置[database]部分:设置数据库连接信息
# 连接格式:mysql+pymysql://用户名:密码@控制节点名称/数据库名
sed -i "/\[database\]/a\\
connection=mysql+pymysql://neutron:${PassWord}@${KongZhiJieDianName}/neutron" /etc/neutron/neutron.conf#### 配置[DEFAULT]部分:设置核心参数
# core_plugin=ml2:指定核心插件为ML2
# service_plugins=router:启用路由器服务插件
# allow_overlapping_ips=True:允许IP地址重叠(不同租户可使用相同IP)
# transport_url:RabbitMQ消息队列连接地址(用户openstack,密码PassWord)
# auth_strategy=keystone:使用Keystone进行身份认证
# notify_nova_on_port_status_changes=True:端口状态变化时通知Nova
# notify_nova_on_port_data_changes=True:端口数据变化时通知Nova
sed -i "/\[DEFAULT\]/a\\
core_plugin=ml2\\
service_plugins=router\\
allow_overlapping_ips=True\\
transport_url = rabbit://openstack:${PassWord}@${KongZhiJieDianName}\\
auth_strategy=keystone\\
notify_nova_on_port_status_changes=True\\
notify_nova_on_port_data_changes=True" /etc/neutron/neutron.conf#### 配置[keystone_authtoken]部分:Keystone认证相关配置
# auth_uri:认证URI(Keystone公共端点)
# auth_url:认证URL(Keystone管理端点)
# memcached_servers:memcached服务地址(用于缓存认证信息)
# auth_type=password:认证类型为密码认证
# project_domain_name/user_domain_name:项目/用户所属域
# project_name=service:所属项目
# username=neutron:认证用户名
# password:认证密码
sed -i "/\[keystone_authtoken\]/a\\
auth_uri=http://${KongZhiJieDianName}:5000\\
auth_url=http://${KongZhiJieDianName}:5000\\
memcached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=default\\
user_domain_name=default\\
project_name=service\\
username=neutron\\
password=${PassWord}" /etc/neutron/neutron.conf#### 追加配置[nova]部分:Neutron与Nova服务交互的认证信息
# 配置Nova服务的认证地址、类型、域、项目、用户和密码等
cat <<EOF>> /etc/neutron/neutron.conf
[nova]
auth_url=http://${KongZhiJieDianName}:5000
auth_type=password
project_domain_name=default
user_domain_name=default
region_name=ReginOne
project_name=service
username=nova
password=${PassWord}
EOF#### 配置[oslo_concurrency]部分:设置锁文件路径
# lock_path:用于存储并发锁文件的目录
sed -i "/\[oslo_concurrency\]/a\\
lock_path=/var/lib/neutron/tmp" /etc/neutron/neutron.conf### 配置ML2插件(/etc/neutron/plugins/ml2/ml2_conf.ini)
# 清理配置文件:删除空行和注释行
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/plugins/ml2/ml2_conf.ini# 追加ML2插件核心配置
cat <<EOF>> /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers=flat,vlan,vxlan
# 支持的网络类型:flat(扁平网络)、vlan、vxlan
tenant_network_types=vxlan
# 租户网络默认类型为vxlan
mechanism_drivers=linuxbridge,l2population
# 机制驱动:linuxbridge和l2population(用于二层网络同步)
extension_drivers=port_security
# 启用端口安全扩展[ml2_type_flat]
flat_networks=provider
# 定义扁平网络名称为provider[ml2_type_vxlan]
vni_ranges=1:1000
# VXLAN网络的VNI范围(1到1000)[securitygroup]
enable_ipset=True
# 启用ipset优化安全组规则
EOF### 配置Linux桥接代理(/etc/neutron/plugins/ml2/linuxbridge_agent.ini)
# 清理配置文件:删除空行和注释行
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/plugins/ml2/linuxbridge_agent.ini# 追加Linux桥接代理配置
cat <<EOF>> /etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings=provider:ens33
# 物理网络与物理网卡的映射(provider网络对应ens33网卡)[vxlan]
enable_vxlan=True
# 启用VXLAN
local_ip=${KongZhiJieDianIP}
# 本地VXLAN端点IP(控制节点IP)
l2_population=True
# 启用L2 population机制(优化VXLAN网络转发)[securitygroup]
enable_security_group=True
# 启用安全组
firewall_driver=neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
# 安全组防火墙驱动
EOF### 配置L3插件(/etc/neutron/l3_agent.ini,L3代理负责路由功能)
# 清理配置文件:删除空行和注释行
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/l3_agent.ini# 配置[DEFAULT]部分:设置接口驱动为linuxbridge
sed -i "/\[DEFAULT\]/a\\
interface_driver=linuxbridge" /etc/neutron/l3_agent.ini### 配置DHCP插件(/etc/neutron/dhcp_agent.ini,DHCP代理负责IP地址分配)
# 清理配置文件:删除空行和注释行
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/dhcp_agent.ini# 配置[DEFAULT]部分:DHCP相关参数
# interface_driver:接口驱动
# dhcp_driver:DHCP驱动(使用dnsmasq)
# enable_isolated_metadata=True:启用隔离元数据(为实例提供元数据服务)
sed -i "/\[DEFAULT\]/a\\
interface_driver=neutron.agent.linux.interface.BridgeInterfaceDriver\\
dhcp_driver=neutron.agent.linux.dhcp.Dnsmasq\\
enable_isolated_metadata=True" /etc/neutron/dhcp_agent.ini### 配置Metadata插件(/etc/neutron/metadata_agent.ini,元数据代理提供实例元数据)
# 清理配置文件:删除空行和注释行
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/metadata_agent.ini# 配置[DEFAULT]部分:元数据服务相关参数
# nova_metadata_host:Nova元数据服务主机(控制节点)
# metadata_proxy_shared_secret:元数据代理共享密钥(与Nova配置一致)
sed -i "/\[DEFAULT\]/a\\
nova_metadata_host=${KongZhiJieDianName}\\
metadata_proxy_shared_secret=${PassWord}" /etc/neutron/metadata_agent.ini### 配置Nova服务使用网络(修改Nova配置文件关联Neutron)
# 清理配置文件:删除空行和注释行
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/nova/nova.conf# 配置[neutron]部分:Nova访问Neutron的参数
# url:Neutron服务地址
# auth_url:认证地址
# 其他参数:认证类型、域、项目、用户和密码等
# service_metadata_proxy=true:启用元数据代理
# metadata_proxy_shared_secret:元数据代理共享密钥(与Neutron配置一致)
sed -i "/\[neutron\]/a\\
url=http://${KongZhiJieDianName}:9696 \\
auth_url=http://${KongZhiJieDianName}:5000\\
auth_type=password\\
project_domain_name=default\\
user_domain_name=default\\
region_name=RegionOne\\
project_name=service\\
username=neutron\\
password=${PassWord}\\
service_metadata_proxy=true\\
metadata_proxy_shared_secret=${PassWord}" /etc/nova/nova.conf### 创建软链接:将ML2配置文件链接为Neutron插件默认配置文件
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini### 同步Neutron数据库(创建数据表结构)
# 使用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### 验证数据库同步结果
# 登录neutron数据库,查看数据库列表和表结构
mysql -uneutron -p${PassWord} << EOF
show databases;
# 显示所有数据库(验证neutron数据库存在)
use neutron;
# 切换到neutron数据库
show tables;
# 显示所有表(验证表已创建)
exit
EOF### 启动Neutron服务并设置开机自启动
# 重启Nova API服务(因配置了与Neutron的关联)
systemctl restart openstack-nova-api# 设置Neutron核心服务开机自启动并启动服务
# neutron-server:Neutron服务端
# neutron-linuxbridge-agent:Linux桥接代理
# neutron-dhcp-agent:DHCP代理
# neutron-metadata-agent:元数据代理
systemctl enable neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent
systemctl start neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent# 设置L3代理开机自启动并启动服务(负责路由功能)
systemctl enable neutron-l3-agent
systemctl start neutron-l3-agent# 查看相关服务状态(验证服务是否正常启动)
systemctl status openstack-nova-api neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent neutron-l3-agent
15-计算节点-第七章-7.3.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义变量:控制节点名称
KongZhiJieDianName=kongzhi
# 定义变量:计算节点名称
JiSuanJieDianName=jisuan
# 定义变量:控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包相关名称(此处为控制节点相关)
RuanJianBao=KongZhi
# 定义变量:通用密码(用于服务认证等)
PassWord=000000# 7.3 安装并配置计算节点
## 安装Neutron组件所需软件包
# 使用yum包管理器安装OpenStack Neutron的linuxbridge代理、ebtables和ipset工具
# openstack-neutron-linuxbridge:Neutron的Linux桥接代理,用于网络虚拟化
# ebtables:以太网桥接防火墙工具,用于网络规则管理
# ipset:IP集合工具,用于高效管理IP地址列表
yum install openstack-neutron-linuxbridge ebtables ipset -y# 此处为图片占位符,可能用于文档说明安装过程中的界面或步骤图示
# # 清理neutron主配置文件中的注释和空行,便于后续编辑
# sed -i.bak:修改文件并创建.bak备份
# "/^[[:space:]]*#/d":删除以任意空格开头的注释行(#开头)
# "/^[[:space:]]*$/d":删除空行(仅含任意空格的行)
# 操作的文件为/etc/neutron/neutron.conf(Neutron服务的主配置文件)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/neutron.conf# 向neutron.conf的[DEFAULT]部分添加配置
# [DEFAULT]是Neutron的默认配置段
# transport_url:配置消息队列(RabbitMQ)的连接地址,格式为rabbit://用户名:密码@控制节点名称
# auth_strategy:设置认证策略为keystone(OpenStack的身份认证服务)
sed -i "/\[DEFAULT\]/a\\
transport_url=rabbit://openstack:${PassWord}@${KongZhiJieDianName}\\
auth_strategy=keystone" /etc/neutron/neutron.conf# 向neutron.conf的[keystone_authtoken]部分添加Keystone认证相关配置
# [keystone_authtoken]是Keystone认证的配置段
# auth_uri:Keystone的公共端点URL
# auth_url:Keystone的管理端点URL
# memcached_servers:memcached服务地址(用于缓存认证令牌)
# auth_type:认证类型为密码认证
# project_domain_name/user_domain_name:项目和用户的域名称(默认域为default)
# project_name:服务项目名称(通常为service)
# username:Neutron服务在Keystone中注册的用户名
# password:Neutron服务用户的密码
sed -i "/\[keystone_authtoken\]/a\\
auth_uri=http://${KongZhiJieDianName}:5000\\
auth_url=http://${KongZhiJieDianName}:5000\\
memcached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=default\\
user_domain_name=default\\
project_name=service\\
username=neutron\\
password=${PassWord}" /etc/neutron/neutron.conf# 向neutron.conf的[oslo_concurrency]部分添加并发控制配置
# [oslo_concurrency]是并发控制相关配置段
# lock_path:指定锁文件的存储路径,用于防止并发操作冲突
sed -i "/\[oslo_concurrency\]/a\\
lock_path=/var/lib/neutron/tmp" /etc/neutron/neutron.conf# 清理Linux Bridge代理配置文件中的注释和空行
# 操作的文件为/etc/neutron/plugins/ml2/linuxbridge_agent.ini(Linux桥接代理的配置文件)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/neutron/plugins/ml2/linuxbridge_agent.ini## 配置Linux Bridge插件
# 编辑`/etc/neutron/plugins/ml2/linuxbridge_agent.ini`文件
### 编辑[linux_bridge]部分,配置虚拟网络映射到物理网络的IP地址(这个部分没有,是自己在文件结尾处加上去的)
# 向linuxbridge_agent.ini文件末尾添加配置段及参数
# [linux_bridge]:Linux桥接相关配置
# physical_interface_mappings:物理网络与物理网卡的映射,格式为"物理网络名称:物理网卡名"(此处provider为物理网络名,ens33为网卡名)
# [vxlan]:VXLAN隧道相关配置(用于跨节点虚拟机通信)
# enable_vxlan:启用VXLAN隧道
# local_ip:当前计算节点的IP地址(用于VXLAN隧道的本地端点)
# l2_population:启用L2种群机制(优化VXLAN网络中的ARP广播)
# [securitygroup]:安全组相关配置
# enable_security_group:启用安全组功能
# firewall_driver:指定安全组的防火墙驱动(使用iptables实现)
sed -i "\$a\\
\[linux_bridge\]\\
physical_interface_mappings=provider:ens33\\
\[vxlan\]\\
enable_vxlan=True\\
local_ip=${JiSuanJieDianIP}\\
l2_population=True\\
\[securitygroup\]\\
enable_security_group=True\\
firewall_driver=neutron.agent.linux.iptables_firewall.IptablesFirewallDriver" /etc/neutron/plugins/ml2/linuxbridge_agent.ini## 配置Nova服务使用网络
# 编辑Nova服务的配置文件(此处为注释说明,下方为具体操作)
# 清理nova.conf中的注释和空行
# 操作的文件为/etc/nova/nova.conf(Nova服务的主配置文件,Nova是OpenStack的计算服务)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/nova/nova.conf# 编辑DEFAULT部分,使用网络错误不致命
# vif_plugging_is_fatal:设置虚拟接口(VIF)插入失败是否致命(False表示不致命)
# vif_plugging_timeout:VIF插入超时时间(0表示不超时)
sed -i "/\[DEFAULT\]/a\\
vif_plugging_is_fatal=False\\
vif_plugging_timeout=0" /etc/nova/nova.conf# 编辑[neutron]部分,配置Nova访问Neutron服务的参数
# [neutron]:Nova中与Neutron交互的配置段
# url:Neutron服务的API端点URL
# auth_url:Keystone的认证URL(用于Nova向Keystone认证以访问Neutron)
# auth_type:认证类型为密码认证
# project_domain_name/user_domain_name:项目和用户的域名称
# region_name:OpenStack区域名称(默认为RegionOne)
# project_name:服务项目名称
# username:Neutron服务在Keystone中的用户名
# password:Neutron服务用户的密码
# service_metadata_proxy:启用服务元数据代理(用于虚拟机获取元数据)
# metadata_proxy_shared_secret:元数据代理的共享密钥(与Neutron配置保持一致)
sed -i "/\[neutron\]/a\\
url = http://controller:9696\\
auth_url=http://${KongZhiJieDianName}:5000\\
auth_type=password\\
project_domain_name=default\\
user_domain_name=default\\
region_name=RegionOne\\
project_name=service\\
username=neutron\\
password=${PassWord}\\
service_metadata_proxy = true\\
metadata_proxy_shared_secret = ${PassWord}" /etc/nova/nova.conf## 启动neutron服务并设置开机自启动
# 重启Nova计算服务(使网络相关配置生效)
systemctl restart openstack-nova-compute
# 设置Neutron Linux桥接代理开机自启动
systemctl enable neutron-linuxbridge-agent
# 启动Neutron Linux桥接代理
systemctl start neutron-linuxbridge-agent
# 查看Nova计算服务和Neutron Linux桥接代理的运行状态(验证服务是否正常启动)
systemctl status openstack-nova-compute neutron-linuxbridge-agent
16-控制节点-第七章-7.4.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义控制节点的名称变量,此处设置为"kongzhi"
KongZhiJieDianName=kongzhi
# 定义计算节点的名称变量,此处设置为"jisuan"
JiSuanJieDianName=jisuan
# 定义控制节点的IP地址变量,此处设置为192.168.1.100
KongZhiJieDianIP=192.168.1.100
# 定义计算节点的IP地址变量,此处设置为192.168.1.200
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关的变量,此处设置为"KongZhi"(可能用于后续软件包操作)
RuanJianBao=KongZhi
# 定义密码变量,此处设置为"000000"(可能用于后续认证等操作)
PassWord=000000# 切换当前工作目录到/root/目录下
cd /root/
# 加载admin-openrc文件中的环境变量,通常该文件包含OpenStack管理员用户的认证信息(如用户名、密码、项目等),用于后续OpenStack命令的身份验证
source admin-openrc## 查看neutron服务相关的网络代理列表
# 执行openstack network agent list命令,该命令用于列出OpenStack Neutron网络服务的所有代理,包括代理的ID、名称、类型、主机、状态等信息,可用于检查网络代理的运行状态
openstack network agent list
17-计算节点-第八章-8.1.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义控制节点的名称变量,值为"kongzhi"
KongZhiJieDianName=kongzhi
# 定义计算节点的名称变量,值为"jisuan"
JiSuanJieDianName=jisuan
# 定义控制节点的IP地址变量,值为"192.168.1.100"
KongZhiJieDianIP=192.168.1.100
# 定义计算节点的IP地址变量,值为"192.168.1.200"
JiSuanJieDianIP=192.168.1.200
# 定义软件包名称变量,值为"KongZhi"
RuanJianBao=KongZhi
# 定义密码变量,值为"000000"
PassWord=000000# 使用yum包管理器卸载NetworkManager服务,-y选项表示自动确认卸载操作,无需手动输入yes
yum remove NetworkManager -y
18-控制节点-第八章-8.1.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义控制节点名称变量
KongZhiJieDianName=kongzhi
# 定义计算节点名称变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关变量(此处命名为KongZhi,可能与控制节点软件包相关)
RuanJianBao=KongZhi
# 定义密码变量(此处为示例密码000000)
PassWord=000000# 卸载NetworkManager服务(NetworkManager可能与OpenStack网络配置冲突,故移除)
# -y选项表示自动确认卸载操作,无需手动输入yes
yum remove NetworkManager -y# 切换到/root目录
cd /root/# 加载OpenStack管理员环境变量脚本
# 该脚本通常包含管理员认证信息(如用户名、密码、项目等),加载后可执行OpenStack命令
source admin-openrc# 创建OpenStack外部网络(provider网络)
# --share:允许该网络被多个项目共享
# --external:标记为外部网络(通常用于连接物理网络)
# --provider-physical-network provider:指定关联的物理网络名称为provider
# --provider-network-type flat:指定网络类型为flat(扁平网络,无VLAN标签)
# 最后的provider为网络名称
openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider# 在provider网络上创建子网
# --network provider:指定关联的网络为provider
# --allocation-pool start=192.168.1.110,end=192.168.1.20:指定IP地址分配范围
# --dns-nameserver 8.8.8.8:指定DNS服务器为8.8.8.8(Google公共DNS)
# --gateway 192.168.1.2:指定子网网关地址
# --subnet-range 192.168.1.0/24:指定子网网段
# 最后的provider为子网名称
openstack subnet create --network provider --allocation-pool start=192.168.1.110,end=192.168.1.120 --dns-nameserver 8.8.8.8 --gateway 192.168.1.2 --subnet-range 192.168.1.0/24 provider# 使用neutron命令创建自服务网络(selfservice网络,供租户内部使用)
# 该网络通常为私有网络,不直接连接物理网络
neutron net-create selfservice# 在selfservice网络上创建子网
# --name selfservice:指定子网名称为selfservice
# --dns-nameserver 8.8.8.8:指定DNS服务器
# --gateway 10.0.0.1:指定子网网关
# selfservice:关联的网络名称
# 10.0.0.0/24:子网网段
neutron subnet-create --name selfservice --dns-nameserver 8.8.8.8 --gateway 10.0.0.1 selfservice 10.0.0.0/24# 创建路由器(用于连接自服务网络和外部网络)
neutron router-create router# 将自服务子网添加到路由器接口(实现路由器与自服务网络的连接)
neutron router-interface-add router selfservice# 设置路由器的网关为provider外部网络(实现自服务网络通过路由器访问外部网络)
neutron router-gateway-set router provider# 查看当前系统中的网络命名空间(OpenStack网络组件会使用命名空间隔离网络)
ip netns# 列出路由器的端口信息(查看路由器的网络接口配置,包括IP地址等)
neutron router-port-list router
19-控制节点-第八章-8.2.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义变量:控制节点名称
KongZhiJieDianName=kongzhi
# 定义变量:计算节点名称
JiSuanJieDianName=jisuan
# 定义变量:控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包名称
RuanJianBao=KongZhi
# 定义变量:密码(此处为示例密码,实际使用中建议修改)
PassWord=000000# 切换到/root目录
cd /root/
# 加载OpenStack管理员环境变量配置文件,用于获取管理员权限操作OpenStack
source admin-openrc# 生成SSH密钥对,-q表示安静模式(不输出冗余信息),-N ""表示空密码
# <<EOF 是Here Document语法,用于向命令传递输入
# 这里指定密钥文件路径为/root/.ssh/id_rsa
ssh-keygen -q -N "" <<EOF
/root/.ssh/id_rsa
EOF# 在OpenStack中创建名为mykey的密钥对,使用本地生成的公钥
openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
# 列出所有OpenStack密钥对,验证创建结果
openstack keypair list# 为默认安全组添加ICMP协议规则(允许ping)
openstack security group rule create --proto icmp default
# 为默认安全组添加TCP协议22端口规则(允许SSH连接)
openstack security group rule create --proto tcp --dst-port 22 default# 创建名为m1.tiny的云主机规格(flavor),配置为1vCPU、256MB内存、1GB磁盘
openstack flavor create --vcpus 1 --ram 256 --disk 1 m1.tiny# 列出所有云主机规格,验证创建结果
openstack flavor list
# 列出所有镜像,确认可用镜像
openstack image list
# 列出所有网络,确认可用网络
openstack network list# 提取selfservice网络的ID
# openstack network list输出表格形式的网络信息,通过管道传递给gawk处理
# gawk -F '|' 表示以|作为字段分隔符
# /^\+/ { next } 表示跳过以+开头的分隔线行
# $3 ~ /selfservice/ 表示匹配第3列(Name列)包含selfservice的行
# gsub(/ /, "", $2) 表示去除第2列(ID列)中的所有空格
# print $2 表示输出处理后的网络ID,并赋值给network_id变量
network_id=$(openstack network list | gawk -F '|' '/^\+/ { next } # 跳过分隔线$3 ~ /selfservice/ { gsub(/ /, "", $2); print $2 } # $3是Name列,$2是ID列(去空格)
')# 列出所有安全组,确认默认安全组存在
openstack security group list# 创建云主机实例
# --flavor m1.tiny:指定使用m1.tiny规格
# --image cirros:指定使用cirros镜像
# --nic net-id="${network_id}":指定连接到selfservice网络
# --security-group default:应用默认安全组
# --key-name mykey:关联mykey密钥对
# instance:云主机实例名称
openstack server create --flavor m1.tiny --image cirros --nic net-id="${network_id}" --security-group default --key-name mykey instance# 列出所有云主机实例,查看创建状态
openstack server list# 在provider网络中创建一个浮动IP
openstack floating ip create provider# 提取刚创建的浮动IP地址
# openstack floating ip create provider输出浮动IP信息,通过管道传递给gawk处理
# /^\+/ { next } 表示跳过以+开头的分隔线行
# $2 ~ /floating_ip_address/ 表示匹配第2列(Field列)为floating_ip_address的行
# gsub(/ /, "", $3) 表示去除第3列(Value列)中的所有空格
# print $3 表示输出处理后的浮动IP地址,并赋值给FloatingIP变量
FloatingIP=$(openstack floating ip create provider | gawk -F '|' '/^\+/ { next } # 跳过分隔线$2 ~ /floating_ip_address/ { gsub(/ /, "", $3); print $3 } # $3是value列,$2是Field列(去空格)
')# 将浮动IP绑定到名为instance的云主机实例
openstack server add floating ip instance "${FloatingIP}"# 提示等待30秒,等待浮动IP绑定生效
echo 等待大约30秒钟
# 暂停脚本执行30秒
sleep 30# 再次列出云主机实例,查看浮动IP绑定结果
openstack server list# 提示用户:如果Networks部分只有一个IP地址,需要多次执行openstack server list命令,直到出现两个IP地址(私有IP和浮动IP)
echo "如果Networks部分只有一个IP地址,请多次使用openstack server list命令查看,直到出现两IP地址"
20-控制节点-10.2.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义变量:控制节点名称
KongZhiJieDianName=kongzhi
# 定义变量:计算节点名称
JiSuanJieDianName=jisuan
# 定义变量:控制节点IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包相关名称(此处可能为自定义标识)
RuanJianBao=KongZhi
# 定义变量:密码(用于数据库、OpenStack用户等认证)
PassWord=000000# 使用mysql命令登录数据库(root用户,密码为变量PassWord),并执行后续EOF之间的SQL语句
mysql -uroot -p${PassWord} <<EOF
# 创建cinder数据库(用于OpenStack块存储服务)
CREATE DATABASE cinder;
# 授权cinder用户在本地主机访问cinder数据库,密码为PassWord
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY '${PassWord}';
# 授权cinder用户从控制节点主机访问cinder数据库,密码为PassWord
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'${KongZhiJieDianName}' IDENTIFIED BY '${PassWord}';
# 授权cinder用户从任意主机访问cinder数据库,密码为PassWord
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY '${PassWord}';
# 刷新权限使授权生效
flush privileges;
# 退出数据库
exit
EOF# 切换到/root目录
cd /root/
# 加载admin-openrc环境变量文件(用于获取OpenStack管理员权限)
source admin-openrc# 在OpenStack中创建cinder用户(属于default域,密码为PassWord)
openstack user create --domain default --password=${PassWord} cinder
# 为cinder用户添加admin角色(关联到service项目)
openstack role add --project service --user cinder admin
# 创建cinderv2服务实体(名称为cinderv2,描述为OpenStack块存储服务,类型为volumev2)
openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
# 创建cinderv3服务实体(名称为cinderv3,描述为OpenStack块存储服务,类型为volumev3)
openstack service create --name cinderv3 --description "OpenStack Block Storage" volumev3### 创建API端点(用于OpenStack服务发现和访问)
# 为volumev2服务创建public类型端点(区域为RegionOne,URL指向控制节点的8776端口v2版本)
openstack endpoint create --region RegionOne volumev2 public http://${KongZhiJieDianName}:8776/v2/%\(project_id\)s
# 为volumev2服务创建internal类型端点(区域为RegionOne,URL同上)
openstack endpoint create --region RegionOne volumev2 internal http://${KongZhiJieDianName}:8776/v2/%\(project_id\)s
# 为volumev2服务创建admin类型端点(区域为RegionOne,URL同上)
openstack endpoint create --region RegionOne volumev2 admin http://${KongZhiJieDianName}:8776/v2/%\(project_id\)s# 为volumev3服务创建public类型端点(区域为RegionOne,URL指向控制节点的8776端口v3版本)
openstack endpoint create --region RegionOne volumev3 public http://${KongZhiJieDianName}:8776/v3/%\(project_id\)s
# 为volumev3服务创建internal类型端点(区域为RegionOne,URL同上)
openstack endpoint create --region RegionOne volumev3 internal http://${KongZhiJieDianName}:8776/v3/%\(project_id\)s
# 为volumev3服务创建admin类型端点(区域为RegionOne,URL同上)
openstack endpoint create --region RegionOne volumev3 admin http://${KongZhiJieDianName}:8776/v3/%\(project_id\)s## 7.2.3 安装并配置cinder组件
### 安装cinder组件所需软件包
# 使用yum安装openstack-cinder包(-y表示自动确认安装)
yum install openstack-cinder -y# 此处为注释的图片引用,不影响脚本执行
# ### 配置`/etc/cinder/cinder.conf`文件
#### 配置[database]部分,配置数据库连接
# 清理cinder.conf文件:删除所有注释行(以#开头,可能包含前导空格)和空行(可能包含前导空格),并备份原文件为.cinder.conf.bak
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/cinder/cinder.conf
# 在[database]配置段后添加数据库连接信息(使用cinder用户、PassWord密码、控制节点名称连接cinder数据库)
sed -i "/\[database\]/a\\
connection=mysql+pymysql://cinder:${PassWord}@${KongZhiJieDianName}/cinder" /etc/cinder/cinder.conf
# 在[DEFAULT]配置段后添加多项默认配置:
# - transport_url:RabbitMQ消息队列连接地址(使用openstack用户、PassWord密码、控制节点名称)
# - auth_strategy:认证策略为keystone
# - my_ip:控制节点IP地址
sed -i "/\[DEFAULT\]/a\\
transport_url = rabbit://openstack:${PassWord}@${KongZhiJieDianName}\\
auth_strategy=keystone\\
my_ip=${KongZhiJieDianIP}" /etc/cinder/cinder.conf
# 在[keystone_authtoken]配置段后添加keystone认证相关配置:
# - auth_uri和auth_url:keystone认证地址
# - memcached_servers:memcached服务地址
# - auth_type:认证类型为密码
# - 域、项目、用户信息(关联到cinder用户)
# - password:cinder用户密码
sed -i "/\[keystone_authtoken\]/a\\
auth_uri=http://${KongZhiJieDianName}:5000\\
auth_url=http://${KongZhiJieDianName}:5000\\
memcached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=default\\
user_domain_name=default\\
project_name=service\\
username=cinder\\
password=${PassWord}" /etc/cinder/cinder.conf
# 在[oslo_concurrency]配置段后添加锁文件路径
sed -i "/\[oslo_concurrency\]/a\\
lock_path=/var/lib/cinder/tmp" /etc/cinder/cinder.conf# 以cinder用户身份执行cinder数据库同步(初始化数据库表结构)
su -s /bin/sh -c "cinder-manage db sync" cinder# 登录mysql数据库,查看数据库和表结构(验证数据库同步结果)
mysql -uroot -p${PassWord} << EOF
# 显示所有数据库
show databases;
# 切换到cinder数据库
use cinder;
# 显示cinder数据库中的所有表
show tables;
# 退出数据库
exit
EOF# 以下为注释掉的配置nova.conf文件的操作(暂不执行)
# sed -i "/\[cinder\]/a\\
# os_region_name=RegionOne" /etc/nova/nova.conf# 重启openstack-nova-api服务(使相关配置生效)
systemctl restart openstack-nova-api
# 设置openstack-cinder-api和openstack-cinder-scheduler服务开机自启
systemctl enable openstack-cinder-api openstack-cinder-scheduler
# 启动openstack-cinder-api和openstack-cinder-scheduler服务
systemctl start openstack-cinder-api openstack-cinder-scheduler
# 查看openstack-cinder-api、openstack-cinder-scheduler和openstack-nova-api服务的运行状态
systemctl status openstack-cinder-api openstack-cinder-scheduler openstack-nova-api# 休眠5秒(等待服务启动完成)
sleep 5
# 列出OpenStack块存储服务的运行状态(验证服务是否正常启动)
openstack volume service list
21-计算节点-10.3.sh
#!/bin/bash
# 定义控制节点名称变量
KongZhiJieDianName=kongzhi
# 定义计算节点名称变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包名称变量
RuanJianBao=KongZhi
# 定义密码变量
PassWord=000000# 安装LVM相关工具包,lvm2用于逻辑卷管理,device-mapper-persistent-data提供设备映射持久化数据支持
yum install lvm2 device-mapper-persistent-data -y
# 设置lvm2-lvmetad服务开机自启动
systemctl enable lvm2-lvmetad
# 启动lvm2-lvmetad服务(LVM元数据缓存服务)
systemctl start lvm2-lvmetad# 初始化物理卷/dev/sdb,将其准备为LVM使用的物理卷
pvcreate /dev/sdb
# 创建卷组cinder-volumes,使用物理卷/dev/sdb
vgcreate cinder-volumes /dev/sdb# 处理/etc/lvm/lvm.conf文件:删除所有注释行(以#开头,可能有前导空格)和空行(可能有前导空格),并备份原文件为.lvm.conf.bak
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/lvm/lvm.conf
# 在/etc/lvm/lvm.conf文件的"devices {"行后面添加LVM过滤规则:仅接受/dev/sdb,拒绝所有其他设备
sed -i "/devices {/a\\
filter=\[\"a/sdb/\",\"r\/\.\*\/\"\]" /etc/lvm/lvm.conf# 安装OpenStack Cinder相关组件(块存储服务)、targetcli(iSCSI目标管理工具)和python-keystone(Keystone客户端库)
yum install openstack-cinder targetcli python-keystone -y# 处理/etc/cinder/cinder.conf文件:删除所有注释行和空行,备份原文件为.cinder.conf.bak
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/cinder/cinder.conf
# 在[cinder]配置文件的[database]部分添加数据库连接配置:使用mysql+pymysql驱动,连接控制节点上的cinder数据库,用户为cinder,密码为定义的PassWord
sed -i "/\[database\]/a\\
connection=mysql+pymysql://cinder:${PassWord}@${KongZhiJieDianName}/cinder" /etc/cinder/cinder.conf
# 在[DEFAULT]部分添加默认配置:
# transport_url:指定消息队列(RabbitMQ)连接地址,使用openstack用户和定义的密码连接控制节点
# auth_strategy:设置认证策略为Keystone
# my_ip:指定当前计算节点的IP地址
# enabled_backends:启用lvm作为后端存储
# glance_api_servers:指定Glance镜像服务的地址(控制节点的9292端口)
sed -i "/\[DEFAULT\]/a\\
transport_url = rabbit://openstack:${PassWord}@${KongZhiJieDianName}\\
auth_strategy=keystone\\
my_ip=${JiSuanJieDianIP}\\
enabled_backends=lvm\\
glance_api_servers=http://${KongZhiJieDianName}:9292" /etc/cinder/cinder.conf
# 在[keystone_authtoken]部分添加Keystone认证相关配置:
# auth_uri和auth_url:指定Keystone认证服务地址(控制节点的5000端口)
# memcached_servers:指定memcached服务地址(控制节点的11211端口)
# auth_type:认证类型为密码认证
# project_domain_name、user_domain_name:指定域为default
# project_name:指定项目为service
# username:认证用户为cinder
# password:认证密码为定义的PassWord
sed -i "/\[keystone_authtoken\]/a\\
auth_uri=http://${KongZhiJieDianName}:5000\\
auth_url=http://${KongZhiJieDianName}:5000\\
memcached_servers=${KongZhiJieDianName}:11211\\
auth_type=password\\
project_domain_name=default\\
user_domain_name=default\\
project_name=service\\
username=cinder\\
password=${PassWord}" /etc/cinder/cinder.conf
# 在配置文件末尾添加[lvm]部分配置LVM后端存储:
# volume_driver:指定LVM卷驱动
# volume_group:指定使用的卷组为cinder-volumes
# iscsi_protocol:指定iSCSI协议
# iscsi_helper:指定iSCSI助手为lioadm
sed -i "\$a\\
\[lvm\]\\
volume_driver=cinder.volume.drivers.lvm.LVMVolumeDriver\\
volume_group=cinder-volumes\\
iscsi_protocol=iscsi\\
iscsi_helper=lioadm" /etc/cinder/cinder.conf
# 在[oslo_concurrency]部分添加锁文件路径配置
sed -i "/\[oslo_concurrency\]/a\\
lock_path=/var/lib/cinder/tmp" /etc/cinder/cinder.conf
# 创建iSCSI目标配置目录
mkdir -p /etc/tgt/conf.d/
# 创建cinder的iSCSI配置文件
touch /etc/tgt/conf.d/cinder.conf
# 向iSCSI配置文件中添加内容,包含Cinder卷的配置路径
cat <<EOF>> /etc/tgt/conf.d/cinder.conf
include /var/lib/cinder/volumes/*
EOF# 安装scsi-target-utils工具包(iSCSI目标服务相关工具)
yum install scsi-target-utils -y# 设置OpenStack Cinder卷服务和iSCSI目标服务开机自启动
systemctl enable openstack-cinder-volume tgtd
# 启动OpenStack Cinder卷服务和iSCSI目标服务
systemctl start openstack-cinder-volume tgtd
# 查看OpenStack Cinder卷服务和iSCSI目标服务的运行状态
systemctl status openstack-cinder-volume tgtd
22-控制节点-10.4.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义控制节点的名称变量,值为"kongzhi"
KongZhiJieDianName=kongzhi
# 定义计算节点的名称变量,值为"jisuan"
JiSuanJieDianName=jisuan
# 定义控制节点的IP地址变量,值为"192.168.1.100"
KongZhiJieDianIP=192.168.1.100
# 定义计算节点的IP地址变量,值为"192.168.1.200"
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关的变量,值为"KongZhi"
RuanJianBao=KongZhi
# 定义密码变量,值为"000000"
PassWord=000000# 切换当前工作目录到/root/目录下
cd /root/
# 加载admin-openrc文件中的环境变量(通常包含OpenStack管理员认证信息等)
source admin-openrc# 执行OpenStack命令,列出所有卷服务的状态信息
openstack volume service list
23-控制节点-第十一章.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义控制节点名称变量
KongZhiJieDianName=kongzhi
# 定义计算节点名称变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包相关变量(此处名称为"KongZhi",可能用于后续标识或路径)
RuanJianBao=KongZhi
# 定义密码变量(此处为"000000",可能用于后续认证相关操作)
PassWord=000000# 使用yum包管理器安装OpenStack仪表板(dashboard)组件,-y参数表示自动确认安装
yum install openstack-dashboard -y# 处理OpenStack仪表板的配置文件local_settings:
# 1. 使用sed命令删除文件中所有以任意空白字符开头的注释行(^[[:space:]]*#)
# 2. 删除所有空白行(^[[:space:]]*$)
# 3. -i.bak表示修改文件前创建备份文件(备份文件后缀为.bak)
sed -i.bak "/^[[:space:]]*#/d;/^[[:space:]]*$/d" /etc/openstack-dashboard/local_settings# 修改local_settings文件中OPENSTACK_HOST配置项:
# 将以OPENSTACK_HOST开头的行替换为OPENSTACK_HOST="控制节点名称"(使用变量KongZhiJieDianName的值)
sed -i "/^OPENSTACK_HOST/c OPENSTACK_HOST=\"${KongZhiJieDianName}\"" /etc/openstack-dashboard/local_settings# 修改local_settings文件中ALLOWED_HOSTS配置项:
# 将以ALLOWED_HOSTS开头的行替换为ALLOWED_HOSTS=['*',],表示允许所有主机访问仪表板
sed -i "/^ALLOWED_HOSTS/c ALLOWED_HOSTS=\['*',\]" /etc/openstack-dashboard/local_settings# 修改local_settings文件中TIME_ZONE配置项:
# 将以TIME_ZONE开头的行替换为TIME_ZONE="Asia/Shanghai",设置时区为亚洲/上海
sed -i "/^TIME_ZONE/c TIME_ZONE=\"Asia/Shanghai\"" /etc/openstack-dashboard/local_settings# 向local_settings文件末尾追加一系列OpenStack仪表板的配置项:
# 1. SESSION_ENGINE:设置会话存储引擎为memcached缓存
# 2. CACHES:配置缓存后端为memcached,指定缓存服务器地址为控制节点名称:11211(memcached默认端口)
# 3. OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT:启用Keystone多域支持
# 4. OPENSTACK_API_VERSIONS:指定各OpenStack服务的API版本(身份服务v3、镜像服务v2、卷服务v3)
# 5. OPENSTACK_KEYSTONE_DEFAULT_DOMAIN:设置默认域为"Default"
# 6. OPENSTACK_KEYSTONE_DEFAULT_ROLE:设置默认角色为"user"
# 7. WEBROOT:设置仪表板的Web根路径为"/dashboard/"
sed -i "\$a\\
SESSION_ENGINE='django.contrib.sessions.backends.cache'\\
CACHES=\{\\'default':\{\\'BACKEND':'django.core.cache.backends.memcached.MemcachedCache',\\'LOCATION':'${KongZhiJieDianName}:11211',\\\}\\
\}\\
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT=True\\
OPENSTACK_API_VERSIONS=\{\\\"identity\":3,\\\"image\":2,\\\"volume\":3,\\
\}\\
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN=\"Default\"\\
OPENSTACK_KEYSTONE_DEFAULT_ROLE=\"user\"\\
WEBROOT=\'\/dashboard\/\'" /etc/openstack-dashboard/local_settings# 向Apache的OpenStack仪表板配置文件末尾追加WSGI应用组配置:
# WSGIApplicationGroup %{GLOBAL}用于解决某些Python模块在多进程环境下的兼容性问题
sed -i "\$a\\
WSGIApplicationGroup %{GLOBAL}" /etc/httpd/conf.d/openstack-dashboard.conf# 重启Apache服务(httpd,用于提供Web服务)和memcached服务(用于缓存会话数据)
# 使上述配置修改生效
systemctl restart httpd memcached
24-控制节点-制作离线软件包.sh
#!/bin/bash
# 脚本功能:制作OpenStack控制节点的离线RPM软件包,用于离线环境中安装相关组件
# 脚本适用场景:在无法连接外部网络的环境中,预先制作包含所需RPM包的离线仓库,便于后续部署# 二、制作离线rpm包(整体流程标识,说明当前脚本所处的操作阶段)# 1. 安装createrepo工具
# 说明:createrepo是用于创建RPM包仓库元数据的工具,后续生成仓库时需要用到
# 定义变量RuanJianBao,值为"KongZhi",用于标识是控制节点的软件包("KongZhi"为"控制"的拼音)
RuanJianBao=KongZhi
# 使用yum命令安装createrepo,-y选项表示自动确认安装,无需手动输入y
yum install createrepo -y# 2. 生成repodata文件(repodata是yum仓库的元数据目录,包含包的索引信息等,yum通过它识别仓库中的包)# 切换到/root目录,作为后续操作的基准目录
cd /root/# 复制comps.xml文件到目标目录
# 说明:comps.xml用于定义RPM包的组信息(如哪些包属于同一组,安装组时会自动安装组内所有包)
# 源路径:/root/OpenStack${RuanJianBao}RPMS-Train/yum/os/gen/comps.xml(生成的组信息文件)
# 目标路径:/root/OpenStack${RuanJianBao}RPMS-Train/(离线仓库的根目录)
cp /root/OpenStack${RuanJianBao}RPMS-Train/yum/os/gen/comps.xml /root/OpenStack${RuanJianBao}RPMS-Train/# 生成包含组信息的仓库元数据
# -g comps.xml:指定组信息文件为comps.xml,使仓库包含包组定义
# 目标目录:/root/OpenStack${RuanJianBao}RPMS-Train/(对该目录执行createrepo,生成repodata)
createrepo -g comps.xml /root/OpenStack${RuanJianBao}RPMS-Train# 再次对仓库目录执行createrepo(可能用于刷新元数据或确保生成完整,具体视场景而定)
# 目标目录:OpenStack${RuanJianBao}RPMS-Train(当前在/root目录下,故为相对路径,与上面的绝对路径指向同一目录)
createrepo OpenStack${RuanJianBao}RPMS-Train# 检查是否已存在同名的压缩包,若存在则删除,避免覆盖时出现问题
# -f选项:判断OpenStack${RuanJianBao}RPMS-Train.tar.gz是否为普通文件
if [ -f OpenStack${RuanJianBao}RPMS-Train.tar.gz ]; then# 若存在则删除该压缩包rm OpenStack${RuanJianBao}RPMS-Train.tar.gz
fi# 将离线仓库目录打包为tar.gz压缩包,便于传输和备份
# -z:使用gzip压缩
# -c:创建新的压缩包
# -v:显示压缩过程中的详细信息
# -f:指定压缩包文件名
tar -zcvf OpenStack${RuanJianBao}RPMS-Train.tar.gz OpenStack${RuanJianBao}RPMS-Train
25-计算节点-制作离线软件包.sh
#!/bin/bash
# 脚本功能:用于制作OpenStack计算节点相关的离线RPM软件包,包含安装必要工具、生成仓库数据、打包等步骤
# 二、制作离线rpm包(整体步骤标识)# 1. 安装createrepo工具
# createrepo是用于创建YUM仓库元数据的工具,后续生成repodata目录需依赖此工具
# 定义变量RuanJianBao,用于标识软件包相关的命名(此处为"JiSuan",可能代表"计算"节点)
RuanJianBao=JiSuan
# 使用yum命令自动安装createrepo,-y选项表示所有提示均默认同意
yum install createrepo -y# 2. 生成repodata文件(repodata是YUM仓库的元数据目录,包含软件包索引等信息)# 切换到/root目录,作为后续操作的基准目录
cd /root/# 生成仓库元数据
# 目标目录:当前目录下的OpenStack${RuanJianBao}RPMS-Train(即/root/OpenStackJiSuanRPMS-Train)
createrepo OpenStack${RuanJianBao}RPMS-Train# 检查是否已存在同名的压缩包,若存在则删除,避免覆盖旧文件时出现冲突
# -f选项:检查文件是否存在
if [ -f OpenStack${RuanJianBao}RPMS-Train.tar.gz ]; then# 删除已存在的压缩包rm OpenStack${RuanJianBao}RPMS-Train.tar.gz
fi# 将整个仓库目录打包为tar.gz格式的压缩包,方便离线传输和部署
# -z:使用gzip压缩
# -c:创建新的压缩包
# -v:显示打包过程中的详细信息
# -f:指定压缩包文件名
tar -zcvf OpenStack${RuanJianBao}RPMS-Train.tar.gz OpenStack${RuanJianBao}RPMS-Train
离线环境安装
执行完24和25脚本之后,会分别在控制节点和计算节点的/root/下生成OpenStackKongZhiRPMS-Train.tar.gz、OpenStackJiSuanRPMS-Train.tar.gz两个压缩包。把这两个压缩包分别放到离线环境下控制节点和计算节点的/root/目录下,然后在控制节点用脚本26代替脚本01,计算节点用脚本27代替脚本02,再按上面的顺序执行脚本,就可以完成离线环境下的部署了。
26-控制节点-基础系统设置及软件源配置-完成.sh
#!/bin/bash
# 脚本功能:配置控制节点的基础系统设置及软件源,适用于OpenStack Train版本环境搭建# 定义控制节点主机名变量
KongZhiJieDianName=kongzhi
# 定义计算节点主机名变量
JiSuanJieDianName=jisuan
# 定义控制节点IP地址变量
KongZhiJieDianIP=192.168.1.100
# 定义计算节点IP地址变量
JiSuanJieDianIP=192.168.1.200
# 定义软件包类型变量(此处为控制节点相关包)
RuanJianBao=KongZhi# 解压OpenStack控制节点相关的RPM包压缩文件
# 压缩文件路径为/root/OpenStack${RuanJianBao}RPMS-Train.tar.gz,解压到当前目录
tar -zxvf /root/OpenStack${RuanJianBao}RPMS-Train.tar.gz # 创建yum源配置文件的备份目录,用于保存原有repo文件
mkdir /etc/yum.repos.d/backup# 将/etc/yum.repos.d/目录下所有.repo文件移动到备份目录(-f强制覆盖已有文件)
mv -f /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup# 创建本地yum源配置文件localhost-yum.repo
# 通过here document(EOF)向文件中写入配置内容
cat <<EOF>> /etc/yum.repos.d/localhost-yum.repo
[localhost-OpenStack]
# 仓库标识,唯一
name=localhost-base
# 仓库名称,用于显示
baseurl=file:///root/OpenStack${RuanJianBao}RPMS-Train
# 本地仓库路径
gpgcheck=0
# 不验证软件包的GPG签名
enabled=1
# 启用该仓库
EOF# 清理yum缓存
yum clean all# 生成新的yum缓存
yum makecache# 安装createrepo工具(用于创建yum仓库元数据)
yum install createrepo -y# 基于指定的comps.xml文件创建仓库元数据,增强仓库功能(如分组安装)
# 元数据生成到/root/OpenStack${RuanJianBao}RPMS-Train目录
createrepo -g /root/OpenStack${RuanJianBao}RPMS-Train/comps.xml /root/OpenStack${RuanJianBao}RPMS-Train# 再次清理yum缓存,确保使用新生成的元数据
yum clean all# 重新生成yum缓存
yum makecache# 列出当前可用的yum仓库,验证配置是否生效
yum repolist# 设置控制节点的主机名
hostnamectl set-hostname $KongZhiJieDianName# 停止firewalld防火墙服务
systemctl stop firewalld# 禁用firewalld防火墙服务(开机不自动启动)
systemctl disable firewalld# 永久关闭SELinux:替换配置文件中SELINUX=enforcing为SELINUX=disabled
# -i.bak表示修改时创建原文件的备份(备份文件后缀为.bak)
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 备份/etc/hosts文件到/etc/hosts.bak
cp /etc/hosts /etc/hosts.bak# 向/etc/hosts文件添加主机名与IP的映射关系
cat <<EOF>> /etc/hosts
$KongZhiJieDianIP $KongZhiJieDianName
# 控制节点IP与主机名映射
$JiSuanJieDianIP $JiSuanJieDianName
# 计算节点IP与主机名映射
EOF# 升级系统所有软件包(-y自动确认)
yum upgrade -y# 将可能存在的CentOS官方repo文件移动到备份目录(防止冲突)
mv -f /etc/yum.repos.d/CentOS*.repo /etc/yum.repos.d/backup# 卸载vim、net-tools、wget工具(可能用于清理原有版本)
yum remove vim net-tools wget -y# 重新安装vim(文本编辑器)、net-tools(网络工具集)、wget(下载工具)
yum install -y vim net-tools wget# 重启系统,使各项配置(如主机名、SELinux)生效
reboot
27-计算节点-基础系统设置及软件源配置-完成.sh
#!/bin/bash
# 声明脚本使用bash shell解释器执行# 定义变量:控制节点的主机名
KongZhiJieDianName=kongzhi
# 定义变量:计算节点的主机名
JiSuanJieDianName=jisuan
# 定义变量:控制节点的IP地址
KongZhiJieDianIP=192.168.1.100
# 定义变量:计算节点的IP地址
JiSuanJieDianIP=192.168.1.200
# 定义变量:软件包类型(此处为计算节点相关)
RuanJianBao=JiSuan# 解压OpenStack计算节点相关的RPM包压缩文件
# -z:使用gzip压缩算法
# -x:解压文件
# -v:显示解压过程
# -f:指定要解压的文件
tar -zxvf /root/OpenStack${RuanJianBao}RPMS-Train.tar.gz # 创建yum源配置文件的备份目录,用于存放系统默认的repo文件
mkdir /etc/yum.repos.d/backup# 将/etc/yum.repos.d/目录下所有的.repo文件移动到备份目录
# -f:强制移动,若目标文件存在则覆盖
mv -f /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup# 通过here document方式创建本地yum源配置文件
# EOF是分隔符,中间的内容会被写入到指定文件中
cat <<EOF>> /etc/yum.repos.d/localhost-yum.repo
[localhost-OpenStack]
# yum源的唯一标识,不能重复
name=localhost-base
# yum源的名称描述
baseurl=file:///root/OpenStack${RuanJianBao}RPMS-Train
# 本地yum源的路径
gpgcheck=0
# 不验证软件包的GPG签名(0为关闭,1为开启)
enabled=1
# 启用该yum源(1为启用,0为禁用)
EOF# 清理yum缓存,移除所有缓存的包和元数据
yum clean all
# 重新生成yum缓存,将yum源中的软件包信息缓存到本地
yum makecache# 安装createrepo工具,用于创建yum仓库
# -y:自动回答yes,无需手动确认
yum install createrepo -y# 使用createrepo创建yum仓库
# -g:指定comps.xml文件,用于定义软件包组信息
# 后面两个路径分别为comps.xml文件所在路径和仓库根目录
createrepo -g /root/OpenStack${RuanJianBao}RPMS-Train/comps.xml /root/OpenStack${RuanJianBao}RPMS-Train# 再次清理yum缓存,确保缓存信息准确
yum clean all
# 再次生成yum缓存,加载新创建的仓库信息
yum makecache# 列出当前启用的yum仓库,验证仓库配置是否成功
yum repolist# 设置计算节点的主机名,使用之前定义的变量
hostnamectl set-hostname $JiSuanJieDianName# 停止firewalld防火墙服务
systemctl stop firewalld
# 禁用firewalld防火墙服务,使其开机不自动启动
systemctl disable firewalld# 修改SELINUX配置文件,禁用SELinux
# -i.bak:修改文件时创建备份文件(.bak后缀)
# 将SELINUX=enforcing替换为SELINUX=disabled
sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 备份/etc/hosts文件到/etc/hosts.bak
cp /etc/hosts /etc/hosts.bak# 向/etc/hosts文件添加主机名与IP地址的映射关系
cat <<EOF>> /etc/hosts
$KongZhiJieDianIP $KongZhiJieDianName
# 控制节点IP与主机名映射
$JiSuanJieDianIP $JiSuanJieDianName
# 计算节点IP与主机名映射
EOF# 升级系统中所有可更新的软件包
# -y:自动回答yes,无需手动确认
yum upgrade -y# 将/etc/yum.repos.d/目录下所有以CentOS开头的.repo文件移动到备份目录
# -f:强制移动,若目标文件存在则覆盖
mv -f /etc/yum.repos.d/CentOS*.repo /etc/yum.repos.d/backup# 卸载vim、net-tools、wget软件包
# -y:自动回答yes,无需手动确认
yum remove vim net-tools wget -y# 重新安装vim、net-tools、wget软件包
# -y:自动回答yes,无需手动确认
yum install -y vim net-tools wget# 重启系统,使所有配置生效
reboot