OpenStack 界面管理:网页点得动,命令行却提示「找不到项目」,差的是那 11 行环境变量 装完 packstack 之后浏览器能打开 Dashboard、能点出虚拟机一换到命令行就卡住——openstack project list报认证失败或者干脆报Missing value auth-url required。这篇把「网页登录」和「命令行登录」两条入口并到一张图上讲它们其实是同一套 Keystone 认证只是网页把令牌存在 Cookie 里命令行把令牌存在环境变量里。文中全部操作对着一套192.168.108.10的 Victoria 环境走命令可直接照抄。本文概要项目内容文章主题Dashboard 登录后的界面层级、改密码与建用户的最小闭环、命令行登录的两种写法自建 openrc 与导出 RC 文件所属类别云计算 → 私有云平台 → OpenStack 运维入口知识关键字Horizon·Dashboard·keystonerc_admin·openrc.sh·OS_AUTH_URL·OS_IDENTITY_API_VERSION·_member_对应实验界面管理Dashboard 与命令行两段主线的因果很简单认证在 Keystone入口在 Horizon 和 openstack 客户端。所以先看网页怎么把身份带起来再看命令行怎么把身份带起来最后回答「为什么那个提示符写着 keystone_user1」这种容易看懵的细节。一、页面地址与登录一个 IP一个 5000 端口浏览器里输入http://192.168.108.10填用户名和密码点「登入」。这个地址是 Horizon 的反向代理入口默认走 80它背后真正的认证请求发往 Keystone 的5000端口http://192.168.108.10:5000/v3。登录成功后默认落在admin项目的「项目概况」页。这里有个容易忽略的点OpenStack 的登录是「用户名 密码 项目project」三件事网页把项目做成了「当前上下文」——同一个账号切到不同项目看到的东西就不同。左下角/左上角的项目下拉框不是装饰它决定后续所有请求带的是哪个 project 的 scope。二、登录后先认清三层导航Dashboard 的左侧导航不是平铺的它按「作用域」分三层认错层就会找不到菜单层入口里面有什么作用域项目层「项目」计算实例、镜像、规格、密钥对、卷、网络、对象存储、编排只看当前项目内的资源管理员层「管理员」→「概览」系统使用情况摘要、全局的计算/卷/网络/系统视图跨项目需要 admin 角色身份层「身份管理」项目、用户、组、角色、应用程序凭证认证与授权本身**「管理员 → 概览」**是一张汇总页多少台虚拟机、多少核、多少内存、多少卷在用全局视角。**「身份管理 → 项目」**能看到项目列表同级的「用户 / 组 / 角色 / 应用程序凭证」也在这一栏下面。普通成员角色看不到「管理员」这一整栏这是判断权限是否生效的最快办法第五节展开。三、改密码一条能自证「认证真的生效」的小闭环这条流程短但它是验证 Keystone 认证链路是否健康最省事的办法步操作1右上角点admin→ 弹出框里选「设置」2选「修改密码」→ 输入原密码 自定义新密码→ 点「修改」3退出回到登录页4用admin新密码登录能登进去说明密码已经写进 Keystone 的数据库登不进去而旧密码还能用说明请求没落库多半是 Dashboard 会话过期或后端 500去看/var/log/keystone/keystone.log。做完这一步记得把密码改回原密码否则后面所有keystonerc_admin里的明文密码全部失效命令行会集体报认证失败——这是这套实验里最容易连锁翻车的一步。四、建一个「业务员」主项目 角色两项都是必填在admin项目下建一个普通用户是这套实验里唯一一个「把授权关系走完整」的动作步操作关键点1「身份管理」→「用户」先点左上角项目名切到admin否则菜单是灰的2右上角「创建用户」弹出对话框3用户名user1、自定义密码密码要记下来后面要用它登录4主项目选admin这是默认项目primary project登录后默认落到这里5角色选_member_勾了角色用户才有权限只建用户不勾角色进去一片空白6点「创建用户」右上角提示成功7右上角admin→ 「退出」—8用user1 刚才的密码登录落在admin项目下角色_member__member_是 OpenStack 传统的项目成员角色新版社区改用member老环境里仍是带下划线的写法。它代表「这个项目的普通使用者」能建自己的实例、卷、网络但改不了项目成员也看不到管理员视图。五、_member_与admin的界面差在哪为什么同一项目下换两个角色登录肉眼可见的差异只有两处但这两处恰好把 OpenStack 的授权模型讲完了位置_member_登录admin登录左侧导航没有「管理员」整栏有「管理员 → 概览 / 计算 / 卷 / 网络 / 系统」身份管理内只有项目、用户等少数几项多出域、组、角色原因是 OpenStack 的权限判断不在界面里而在每个服务的policy.json里菜单是否展示、API 是否放行都要先过policy.json的规则规则再拿 Token 里的角色去比对。admin角色通常被写成「放行一切」admin_required: role:admin_member_只命中「项目内常规操作」那几条。所以差异不是界面写死的是后端拒了、前端就不渲染。这也顺带解释了一个常见困惑用户能看到某些菜单不代表能操作反过来菜单不显示基本等于没权限因为它是按 policy 过滤后的结果。六、命令行入口环境变量就是「你是谁」6.1 两条命令进管理员视图用 MobaXterm 之类工具 SSH 到 controller192.168.108.10root 登录后# 导入管理员身份packstack 安装完会在 /root 下生成这个文件sourcekeystonerc_admin# 验证能列出项目就说明认证通了openstack project listkeystonerc_admin不是系统文件是 packstack 生成的一份shell 脚本里面全是export OS_*语句。source的作用是让这些变量进到当前 shell 会话之后每条openstack命令都会读它们、拿它们去 Keystone 换 Token。openstack project list是验证登录是否成功最便宜的探针它只需要identity服务可用不牵扯 Nova/Neutron能返回列表说明「地址对、版本对、用户名密码对、项目对」四件事都成立。如果这一步报认证失败不要先去怀疑网络先去翻keystonerc_admin本身里面的OS_PASSWORD是不是被第五节那个「改密码」改掉了OS_AUTH_URL是不是写成了v2.0。6.2 换用户登录自己写一份 openrc.shkeystonerc_admin是 admin 专用的要换成普通用户就得复制一份改内容。以user1为例文件长这样这 11 行值得逐行看因为每一行都对应一个「命令行为什么认不出我」的原因unsetOS_SERVICE_TOKENexportOS_USERNAMEuser1exportOS_PASSWORDhuaweiexportOS_REGION_NAMERegionOneexportOS_AUTH_URLhttp://192.168.108.10:5000/v3exportPS1[\u\h \W(keystone_user1)]\$ exportOS_PROJECT_NAMEadminexportOS_USER_DOMAIN_NAMEDefaultexportOS_PROJECT_DOMAIN_NAMEDefaultexportOS_IDENTITY_API_VERSION3逐行对应关系变量作用漏了会怎样unset OS_SERVICE_TOKEN清掉 v2 时代残留的服务令牌旧令牌优先级更高v3 认证被绕过报权限古怪OS_USERNAME/OS_PASSWORD身份凭据报Missing value auth-url required或 401OS_AUTH_URL/v3认证地址与 API 版本写成 v2.0 时openstack客户端可能直接报版本不支持OS_IDENTITY_API_VERSION3强制走 v3与上一行必须配套一个写 v3 一个留 v2 会自相矛盾OS_PROJECT_NAME当前项目作用域不写则查不到资源或报You are not authorizedOS_USER_DOMAIN_NAME/OS_PROJECT_DOMAIN_NAME域v3 必填v3 里用户名可以重名靠「域 用户名」才能唯一定位OS_REGION_NAME区域多区域环境下查不到 endpointPS1只改提示符不影响功能只影响你「以为自己在哪」存盘后sourceopenrc.sh# 或任意文件名如 keystonerc_user1openstack project list# 验证这一步的结果和角色直接相关user1只有admin项目下的_member_所以openstack project list只列得出admin一个项目换成admin角色再看所有项目都能列出来。这不是命令不同是同一个 API 按角色过滤结果。6.3 另一条路从 Dashboard 导出 RC 文件不想手写那 11 行Dashboard 自带导出功能步操作1用目标用户登录 Dashboard2鼠标放到右上角用户名 → 下拉里点「OpenStack RC 文件」→ 下载3用 MobaXterm 把文件拖到 controller 的/root下4source它会提示输入该用户的密码脚本里密码位是空的5openstack project list验证两条路的区别值得记一句手写版密码是明文写死在文件里导出版每次执行都要输密码。前者省事但有毒keystonerc_admin就是明文后者更安全。生产上还有第三种做法——用clouds.yaml配合--os-cloud但那已经超出这套实验范围。七、提示符里的keystone_user1不是主机名执行完openrc.sh提示符会变成[rootcontroller ~(keystone_user1)]#容易误读成「主机名被改了」。其实它来自文件里那一行exportPS1[\u\h \W(keystone_user1)]\$ \u是用户名、\h是主机名、\W是当前目录后面的(keystone_user1)是人写死的一段普通文字。它唯一的作用是提醒你「当前这个 shell 用的是哪个身份」——因为在同一个终端里反复source不同 openrc 文件时光看提示符根本分不清现在是 admin 还是 user1误操作就是这么来的。想改回去重新source keystonerc_admin即可那份文件里的PS1会覆盖它。八、易错与排错现象原因处理openstack project list报认证失败keystonerc_admin里的密码被改过把密码改回或改文件里的OS_PASSWORD报Missing value auth-url required没source任何 openrc 文件先source再执行命令报You are not authorizedOS_PROJECT_NAME指向了一个你没角色的项目改OS_PROJECT_NAME或给该用户在该项目加角色只列出一个项目角色是_member_正常现象换成admin角色验证提示符没变执行的是./openrc.sh而非source子 shell 里 export 不会回到父 shellDashboard 打不开firewalld 没关、httpd没起先systemctl status httpd再查防火墙改完密码后命令行全线 401就是第三节那步没改回来统一改回或批量改keystonerc_*九、验收清单做完这一段应当能稳定复现下面五件事缺一条就说明某处身份没对上浏览器http://192.168.108.10能用admin登录且默认落在admin 项目的概况页「管理员 → 概览」能看到全局摘要「身份管理」能看到项目/用户/组/角色用user1_member_登录后「管理员」整栏消失身份管理里少了域/组/角色source keystonerc_admin后openstack project list有输出source openrc.sh后提示符出现(keystone_user1)且openstack project list只剩 admin 一个项目。收尾动作关机拍快照快照名建议带「界面管理」字样。这套环境后面还要接着做认证管理把干净的登录态存下来能省一次重装。 参考资料官方文档 · 中英双语英文原版Keystone 官方文档身份服务的概念、令牌与 APIHorizon 官方文档Dashboard 的部署与界面说明python-openstackclient 命令参考openstack子命令与全局参数中文版OpenStack 中文文档官方文档的中文入口概念章节可对照看其余手册在服务器上直接查不用联网openstackhelpproject list# 子命令自带帮助参数比文档还全openstack--help# 全局参数--os-auth-url 等man1curl# 手工调 Keystone 接口时用附命令英文全称速查表命令 / 缩写英文全称 / 原意作用source—在当前 shell 里执行脚本export的变量留在本会话export—把变量导出成环境变量子进程每条openstack命令可见unsetun-set删除变量用来清掉 v2 时代残留的OS_SERVICE_TOKENopenstackOpenStack 统一 CLIpython-openstackclient读环境变量里的身份调各服务的 REST APIOS_AUTH_URLOpenStackauthenticationURL认证地址走 v3 必须写到/v3OS_IDENTITY_API_VERSIONOpenStackidentity API version指定 API 版本与上一行配套OS_USERNAME/OS_PASSWORDuser name / password身份凭据OS_PROJECT_NAMEOpenStackproject name当前项目作用域scopeOS_USER_DOMAIN_NAMEOpenStackuser domain name用户所属域v3 必填OS_PROJECT_DOMAIN_NAMEOpenStackproject domain name项目所属域OS_REGION_NAMEOpenStackregion name区域名多区域环境靠它定位 endpointPS1PromptString 1主提示符改它只影响显示不影响功能keystonerc_adminkeystonercrun commandspackstack 生成的管理员认证脚本openrc.shopenrc自建或从 Dashboard 导出的同款脚本Horizon—OpenStack 官方 Web 控制台Dashboard 的实现Keystone—身份认证服务默认监听 5000_member_member成员项目成员角色能操作本项目资源policy.jsonpolicy策略各服务的权限规则文件角色在其中被引用--help—打印子命令用法openstack --help看全局参数401HTTPUnauthorized未认证 / 令牌无效RCrun commands一类「启动时先跑一遍」的环境脚本叫法总结网页登录和命令行登录不是两套认证而是同一套 Keystone 的两个入口——网页把 Token 放 Cookie命令行把 Token 放环境变量。搞清楚那 11 个OS_*变量各自管什么「认证失败」与Missing value auth-url required这两类报错就能一次定位。同系列 · 云计算与私有云平台其余篇目见博客主页blog.csdn.net/nbsxl上一篇《packstack 装 OpenStack 为什么卡 40 分钟CentOS Stream 8 双节点部署全过程》下一篇《OpenStack 认证管理角色、用户、组、项目、配额五样东西到底谁绑谁》 你的命令行是卡在source没生效还是OS_AUTH_URL少写了/v3评论区贴报错一起看。