packstack --allinone:一条命令装完整个 OpenStack;但"装完"和"能用"之间,隔着一份 10 步验证清单
一、部署概述
| 项目 | 值 |
|---|---|
| 部署方式 | Packstack All-in-One(单机同时扮演 controller + compute + network + storage 四个角色) |
| 安装包 | openstack-packstack-15.1.0-1.el7(Train) |
| 耗时 | 约 20~60 分钟(取决于机器性能和磁盘速度) |
| 部署产物 | /root/keystonerc_admin(admin 凭据)、Dashboard 入口、部署日志 |
上篇回顾:(二)单机环境准备与系统基线------主机名、防火墙、时间、内网源六块地基已打好,6 个坑也埋好了伏笔。
本篇是单机部署的主菜。核心内容三块:应答文件怎么改(尤其是装哪些组件)、部署为什么要丢后台跑、装完怎么证明"真的能用"。
二、All-in-One 是什么,适合谁
一台服务器同时扮演 controller + compute + network + storage 四个角色,用 Packstack 一键部署。
适合:组件认知、Dashboard 操作、创建云主机的入门体验;不适合生产(单点、无高可用、资源争抢)。它与多节点部署的区别只在于应答文件里几行 Host 参数------第(七)(八)篇会验证这一点。
三、安装 Packstack 并生成应答文件
bash
|---|----------------------------------------------------------|
| | yum install -y openstack-packstack |
| | rpm -q openstack-packstack # 确认版本:15.1.0-1.el7 |
| | packstack --gen-answer-file=/root/packstack-answer.txt |
应该看到 :
/root/packstack-answer.txt生成成功,约 1200 行。
这 1200 行就是 Packstack 的全部秘密:所谓"一键部署",本质是生成一份参数清单交给 Puppet 执行。看懂关键参数,比背部署命令有用得多。
四、应答文件关键参数(实测值)
4.1 拓扑参数:单机 = 四个角色全指向本机
ini
|---|---------------------------------------|
| | CONFIG_CONTROLLER_HOST=10.10.10.160 |
| | CONFIG_COMPUTE_HOSTS=10.10.10.160 |
| | CONFIG_NETWORK_HOSTS=10.10.10.160 |
| | CONFIG_STORAGE_HOST=10.10.10.160 |
用 sed 一把改(把 IP 换成你自己的):
bash
|---|-----------------------------------------------------------------------------------|
| | ANS=/root/packstack-answer.txt |
| | sed -i 's|^CONFIG_CONTROLLER_HOST=.*|CONFIG_CONTROLLER_HOST=10.10.10.160|' $ANS |
| | sed -i 's|^CONFIG_COMPUTE_HOSTS=.*|CONFIG_COMPUTE_HOSTS=10.10.10.160|' $ANS |
| | sed -i 's|^CONFIG_NETWORK_HOSTS=.*|CONFIG_NETWORK_HOSTS=10.10.10.160|' $ANS |
| | sed -i 's|^CONFIG_STORAGE_HOST=.*|CONFIG_STORAGE_HOST=10.10.10.160|' $ANS |
记住这四行,第(七)篇多节点部署只需要把 COMPUTE 换成别的机器 IP------单机和多节点的区别,就这么大。
4.2 密码与组件取舍
bash
|---|------------------------------------------------------------------------------------|
| | # 管理员密码:留空会随机生成,新手建议自己指定,方便登录 Dashboard |
| | sed -i 's|^CONFIG_KEYSTONE_ADMIN_PW=.*|CONFIG_KEYSTONE_ADMIN_PW=Admin@123|' $ANS |
| | |
| | # 组件取舍:核心 + 监控装,其余关 |
| | sed -i 's|^CONFIG_MARIADB_INSTALL=.*|CONFIG_MARIADB_INSTALL=y|' $ANS # 数据库 |
| | sed -i 's|^CONFIG_GLANCE_INSTALL=.*|CONFIG_GLANCE_INSTALL=y|' $ANS # 镜像 |
| | sed -i 's|^CONFIG_CINDER_INSTALL=.*|CONFIG_CINDER_INSTALL=y|' $ANS # 块存储 |
| | sed -i 's|^CONFIG_NOVA_INSTALL=.*|CONFIG_NOVA_INSTALL=y|' $ANS # 计算 |
| | sed -i 's|^CONFIG_NEUTRON_INSTALL=.*|CONFIG_NEUTRON_INSTALL=y|' $ANS # 网络 |
| | sed -i 's|^CONFIG_HORIZON_INSTALL=.*|CONFIG_HORIZON_INSTALL=y|' $ANS # 仪表盘 |
| | sed -i 's|^CONFIG_SWIFT_INSTALL=.*|CONFIG_SWIFT_INSTALL=y|' $ANS # 对象存储 |
| | sed -i 's|^CONFIG_CEILOMETER_INSTALL=.*|CONFIG_CEILOMETER_INSTALL=y|' $ANS # 计量 |
| | sed -i 's|^CONFIG_AODH_INSTALL=.*|CONFIG_AODH_INSTALL=y|' $ANS # 告警 |
| | # 以下可选组件全部关掉 |
| | for c in MANILA PANKO SAHARA HEAT MAGNUM TROVE IRONIC; do |
| | sed -i "s|^CONFIG_${c}_INSTALL=.*|CONFIG_${c}_INSTALL=n|" $ANS |
| | done |
组件装多了对单机体验意义不大,反而拖慢部署并加大排障面------每多一个组件就多一组数据库表、多一条 MQ 通道、多一份日志。体验环境建议只留核心 + 监控。
4.3 镜像下载地址(预防 273 字节坑)
应答文件里有一行 CONFIG_PROVISION_IMAGE_URL,控制 Packstack 自动下载的测试镜像:
bash
|---|----------------------------------------------------------------------------|
| | grep '^CONFIG_PROVISION_IMAGE_URL' $ANS |
| | # CONFIG_PROVISION_IMAGE_URL=https://download.cirros-cloud.net/0.3.5/... |
这个 URL 若返回 302 重定向且下载器不跟随,就会把 302 页面当镜像注册------第(五)篇的主角。 可以提前改成内网直达地址规避,或者装完手动验证 size。
五、执行部署(务必丢后台)
bash
|---|---------------------------------------------------------------------------------------------|
| | nohup packstack --answer-file=/root/packstack-answer.txt > /root/packstack-run.log 2>&1 & |
| | tail -f /root/packstack-run.log |
为什么一定要 nohup + 日志文件:部署动辄 20~40 分钟,SSH 会话断线(笔记本休眠、网络抖动)不会中断后台部署,重连后 tail -f 日志接着看。如果前台跑,断线即前功尽弃。
过程解读:
- Puppet 输出一大屏绿字/黄字属正常,只要不出现红色 ERROR
- 部署中会要求输入各节点 root 密码(单机就是本机)
- 失败可直接重跑:packstack 支持续装,同一命令再执行一遍即可
- 多次重跑会生成
packstack-run.log、run2、run3...,排障时可对比
应该看到(最后一行):
**** Installation completed successfully ******同时生成
/root/keystonerc_admin凭据文件。
六、部署后的环境快照(实测值)
| 项目 | 值 |
|---|---|
| 磁盘占用 | 根分区约 3.7G used |
| 内存占用 | 约 7G used |
| 服务列表 | keystone / glance / nova / neutron / cinder / swift(openstack service list 可见) |
| 网络后端 | ML2 + OVN,public=flat、private=geneve |
| 外部网关 | br-ex 上 172.24.4.1 |
| Dashboard | http://10.10.10.160/dashboard/(302 跳登录页 = 正常) |
| 默认 flavor | m1.tiny(1 vCPU / 512MB / 1GB 盘) |
七、安装后 10 步验证清单
每次登录后第一件事(记住坑 4:CLI 报 401 十有八九是没 source):
bash
|---|--------------------------------------------------------------|
| | source /root/keystonerc_admin |
| | cat /root/keystonerc_admin # 看看里面是什么:OS_AUTH_URL、用户名、密码、项目 |
| 步 | 验证内容 | 命令 | 通过标准 |
|---|---|---|---|
| 1 | CLI 可用 | openstack token issue |
能输出 id |
| 2 | Keystone | openstack project list / user list |
有 admin 项目和用户 |
| 3 | Glance | openstack image list |
cirros 存在(★须验 size,见下) |
| 4 | 网络 | openstack network list --long |
public=flat/External=True,private=geneve |
| 5 | 计算 | openstack compute service list |
nova 三服务均 up |
| 6 | 资源池 | openstack hypervisor list |
1 台,vcpus=4,memory_mb=15360 |
| 7 | Dashboard | curl -s -o /dev/null -w '%{http_code}' http://localhost/dashboard/ |
302 |
| 8 | 安全组 | openstack security group rule create --proto icmp default |
规则可见 |
| 9 | 实例 | openstack server create ... --wait |
ACTIVE 且 console.log 有内核输出 |
| 10 | 巡检 | 跑第(六)篇健康检查脚本 | 九大项无 down |
第 3 步的镜像要特别强调------验证 size,不能只看 status:
bash
|---|----------------------------------------------------------|
| | openstack image show cirros -c size -c status -f value |
| | # 正常:13M~20M 量级;若输出 273 → 302 坑,去第(五)篇领解药 |
第 9 步的完整实操(网络、路由、浮动 IP、登录)在第(四)篇展开。
七点五、三个典型部署失败案例(附定位过程)
部署失败不丢人,关键是会读日志。三个真实场景:
案例 1:卡在 RabbitMQ 模块
text
Error: Could not start Service[rabbitmq-server]
定位:systemctl status rabbitmq-server 发现主机名解析失败。RabbitMQ 强依赖主机名(节点名就是 rabbit@主机名)。处置:回头补 hosts 解析,重跑。
案例 2:Keystone 模块报数据库连接拒绝
text
Error: Can't connect to MySQL server (MariaDB::Server connection error)
定位:MariaDB 起来了但 Keystone 拿不到密码------多见于重复部署后旧库残留。处置:mysql -e 'drop database keystone;' 后重跑(仅限实验环境)。
案例 3:最后阶段实例镜像下载失败
text
Error: Provision image download failed
定位:CONFIG_PROVISION_IMAGE_URL 外网不可达或返回 302。处置:改成内网可达地址,或直接置空后手动上传镜像(推荐后者,顺便避坑)。
三个案例的共同点:报错模块名就是排查起点,不需要全网搜报错字符串。 Packstack 的报错格式 Could not start Service[xxx] 里的 xxx 就是 systemd 服务名,直接 systemctl status 它。
八、Packstack 背后发生了什么(Puppet 原理一页通)
看懂执行过程,报错时才知道去哪看:
- manifest :Puppet 的"剧本",描述每个节点上应该有什么包、什么配置文件、什么服务状态,留档在
/var/tmp/packstack/ - 执行顺序有讲究 :基础依赖先行------MariaDB 先起,再 RabbitMQ,然后 Keystone(它要写库),其余服务最后;所以部署中途失败时,看日志停在哪一步就知道是哪个基础组件出的问题
- 幂等性:Puppet 是声明式的("最终状态应该是 X"),所以失败后直接重跑是安全的,已完成的步骤会被跳过
排障技巧:/var/tmp/packstack/<运行ID>/manifest/ 下按节点分目录存放了每个组件的 puppet 片段,部署卡住时 grep -r ERROR 这个目录比看屏幕滚动的输出有效得多。
九、应答文件常用参数速查(超出基本部署的部分)
| 参数 | 作用 | 建议 |
|---|---|---|
| CONFIG_NEUTRON_ML2_TYPE_DRIVERS | 网络类型 | 默认 geneve,flat 即可 |
| CONFIG_CINDER_VOLUMES_SIZE | Cinder 卷组大小 | 默认 20G,按磁盘余量调 |
| CONFIG_PROVISION_DEMO | 是否装演示镜像/网络 | y 方便验证;n 环境更干净 |
| CONFIG_HEAT_INSTALL | 编排服务 | 体验阶段 n |
| CONFIG_SSL_ENABLE | HTTPS | 实验不开 |
完整参数含义可用 grep -v '^#' /root/packstack-answer.txt 先看生效值,grep '^#CONFIG_' 文件 看带注释的默认值。
十、部署日志怎么读
text
|---|-----------------------------------------------------------------------------------------|
| | Notice: /Stage[main]/Nova::Db::Sync/Exec[nova-db-sync]/returns: executed successfully |
| | ↑ 正常:某模块某步骤完成 |
| | |
| | Warning: Scope(Class[Neutron::Server]): received deprecated parameter |
| | ↑ 警告:不影响部署,可忽略 |
| | |
| | Error: Could not start Service[rabbitmq-server] |
| | ↑ 失败:错误发生在哪个 Service,就去看哪个服务的日志 |
把日志按 Notice/Warning/Error 三类过筛,一屏刷过去只需眼睛盯着 Error。
十一、交付物清单
| 内容 | 位置 / 说明 |
|---|---|
| 应答文件 | /root/packstack-answer.txt(多节点的拓扑也改它) |
| 部署日志 | /root/packstack-run.log(重跑会生成 run2/run3,可对比) |
| CLI 凭据 | /root/keystonerc_admin(admin) |
| 可用镜像 | /root/cirros-0.3.5-x86_64-disk.img(13MB,实测可引导) |
| Dashboard | http://10.10.10.160/dashboard/ |
教学场景提示:本机无 KVM 硬件加速,实例引导要几分钟。讲师演示前先预热一台实例,避免现场干等。
下篇预告:(四)创建第一台云主机------网络、子网、路由、安全组、实例、浮动 IP,从 CLI 完整走一遍云主机诞生流程。