OpenStack组件安装之Keystone安装与配置
任务一:环境配置
步骤1:配置 YUM 源
- 备份原有源文件:
cp /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak
- 使用
cat重定向创建华为云 openEuler 源:
cat > /etc/yum.repos.d/openEuler.repo << 'EOF'
[OS]
name=OS
baseurl=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/OS/$basearch/
enabled=1
gpgcheck=0
gpgkey=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler
[everything]
name=everything
baseurl=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/everything/$basearch/
enabled=1
gpgcheck=0
gpgkey=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/everything/$basearch/RPM-GPG-KEY-openEuler
[EPOL]
name=EPOL
baseurl=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/EPOL/main/$basearch/
enabled=1
gpgcheck=0
gpgkey=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler
[debuginfo]
name=debuginfo
baseurl=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/debuginfo/$basearch/
enabled=0
gpgcheck=0
gpgkey=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/debuginfo/$basearch/RPM-GPG-KEY-openEuler
[source]
name=source
baseurl=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/source/
enabled=0
gpgcheck=0
gpgkey=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/source/RPM-GPG-KEY-openEuler
[update]
name=update
baseurl=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/update/$basearch/
enabled=1
gpgcheck=0
gpgkey=http://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS/OS/$basearch/RPM-GPG-KEY-openEuler
EOF
- 使用
cat重定向创建 OpenStack Wallaby 源:
cat > /etc/yum.repos.d/openstack-wallaby.repo << 'EOF'
[OpenStack_Wallaby]
name=OpenStack Wallaby
baseurl=https://dl-cdn.openeuler.openatom.cn/openEuler-22.03-LTS/EPOL/multi_version/OpenStack/Wallaby/$basearch/
enabled=1
gpgcheck=0
priority=1
EOF
- 清除缓存并重新生成:
yum clean all
rm -rf /var/cache/yum/*
yum makecache
步骤 2:设置主机名与 hosts 映射
将 X.X.X.X 替换为当前主机的 IP 地址。
vi /etc/hosts
添加以下内容:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
X.X.X.X controller
hostnamectl set-hostname controller
login
重新登录:
controller login: root
Password:
[root@controller ~]#
任务二:安装 SQL Database
步骤1:安装 MariaDB
OpenStack 使用 MariaDB 数据库作为 Keystone 认证鉴权的数据库,为了后续的实验需要,此处需要先安装 MariaDB。安装时暂时跳过 OpenStack_Wallaby 源,避免因网络超时导致安装失败。
yum -y install mariadb mariadb-server python3-PyMySQL --disablerepo=OpenStack_Wallaby
步骤2:修改数据库配置文件
在启动 MariaDB 之前,对这个数据库的配置文件进行自定义修改,修改内容如下:
vi /etc/my.cnf.d/openstack.cnf
文件内容:
[mysqld]
bind-address = X.X.X.X
default-storage-engine = innodb
innodb_file_per_table = on
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
修改参数说明:
bind-address:需要将该参数后的值修改为本主机的 IP 地址。- 其他参数保持默认即可。
步骤3:启动数据库服务,并将其设置为开机自启动
刚刚已经完成了数据库的安装以及配置文件修改,现在需要手动启动数据库服务,并设置为开机自启动。
systemctl enable mariadb.service # 设置为开机自启动
systemctl start mariadb.service # 启动 MariaDB 服务
启动完成后,可以查看服务的启动状态:
systemctl status mariadb
输出示例:
● mariadb.service - MariaDB 10.5.15 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2022-07-12 17:00:59 CST; 33s ago
Docs: man:mariadbd(8)
https://mariadb.com/kb/en/library/systemd/
Process: 32092 ExecStartPre=/usr/libexec/mariadb-check-socket (code=exited, status=0/SUCCESS)
Process: 32114 ExecStartPre=/usr/libexec/mariadb-prepare-db-dir mariadb.service (code=exited, status=0/SUCCESS)
Process: 32215 ExecStartPost=/usr/libexec/mariadb-check-upgrade (code=exited, status=0/SUCCESS)
Main PID: 32198 (mariadbd)
Status: "Taking your SQL requests now..."
Tasks: 14 (limit: 47393)
Memory: 74.9M
CGroup: /system.slice/mariadb.service
└─32198 /usr/libexec/mariadbd --basedir=/var/lib/mysql/
当查看到 Active: 后的状态为 active (running) 时,代表服务正常启动。
步骤4:配置数据库的默认密码
在后面的操作中,需要登录到数据库中进行操作,在此之前,需要配置数据库的默认密码。
mysql_secure_installation
交互过程:
Enter current password for root (enter for none): Huawei@123 # 此处设置登录数据库的 root 用户的密码
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] n # 此处可输入 n
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] n # 此处可输入 n
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] Y # 此处输入 Y
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] Y # 此处输入 Y
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] Y # 此处输入 Y
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] Y # 此处输入 Y
配置完成后,使用刚配置的密码进行登录:
mysql -u root -p
Enter password: # 此处密码输入为刚刚配置的 root 密码
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.5.16-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
任务三:安装 RabbitMQ
步骤1:安装并启动 RabbitMQ
使用 wget 命令下载 RabbitMQ 的安装包,此处不使用 yum 进行安装,因为 RabbitMQ 是采用 Erlang 语言开发的,所以系统环境中必须提供 Erlang 的环境,使用 yum 的安装方式可能会导致 Erlang 的版本与 RabbitMQ 的版本不匹配,所以此处需要手动下载 RabbitMQ 的安装包(若网络无法连接至 GitHub,可用离线方式导入)。
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.20/rabbitmq-server-3.9.20-1.el8.noarch.rpm
安装 RabbitMQ 依赖环境 Erlang:
yum -y install erlang
使用 RPM 的方式安装 RabbitMQ,如果出现报错,需要删除安装包,然后重新执行第一步进行 wget 下载,再进行安装:
rpm -Uvh rabbitmq-server-3.9.20-1.el8.noarch.rpm
启动 RabbitMQ 并设置为开机启动:
systemctl enable rabbitmq-server.service
systemctl start rabbitmq-server.service
查看 RabbitMQ 的服务状态,如果 RabbitMQ 启动失败,可将虚拟机重启之后再进行查看:
systemctl status rabbitmq-server
输出示例:
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-08-03 20:02:23 CST; 17s ago
Main PID: 5988 (beam.smp)
Tasks: 24 (limit: 47386)
Memory: 72.4M
CGroup: /system.slice/rabbitmq-server.service
├─5988 /usr/lib64/erlang/erts-11.2.2.8/bin/beam.smp -W w -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 3>
├─5999 erl_child_setup 32768
├─6021 /usr/lib64/erlang/erts-11.2.2.8/bin/epmd -daemon
├─6044 inet_gethost 4
└─6045 inet_gethost 4
步骤2:配置 RabbitMQ
在 RabbitMQ 中配置 OpenStack 用户:
rabbitmqctl add_user openstack RABBIT_PASS
通过该命令,将在 RabbitMQ 中创建一个 OpenStack 用户,并为之设置密码,RABBIT_PASS 修改为用户自定义的密码。
配置完用户后,还需要对用户赋予对资源的操作权限,配置权限的方式如下:
rabbitmqctl set_permissions openstack ".*" ".*" ".*"
以上命令表示赋予 OpenStack 用户配置、写、读 RabbitMQ 中所有资源的权限。
除了资源权限以外,还可以设置用户分配操作权限,设置 OpenStack 用户为管理员用户:
rabbitmqctl set_user_tags openstack management
用户级别说明:
| 级别 | 说明 |
|---|---|
| administrator | 可以登录控制台、查看所有信息、可以对 RabbitMQ 进行管理 |
| monitoring | 监控者,登录控制台,查看所有信息 |
| policymaker | 策略制定者,登录控制台,指定策略 |
| management | 普通管理员,登录控制台 |
步骤3:登录 RabbitMQ
配置完用户后,可以使用 openstack 用户登录 RabbitMQ 的 Web 界面进行查看,在登录 Web 界面之前,需要开启 RabbitMQ 的插件功能并关闭防火墙。
rabbitmq-plugins enable rabbitmq_management
systemctl stop firewalld
在浏览器中输入 http://虚拟机IP:15672/ 进行登录,用户名为 openstack,密码为刚刚配置的用户密码。
登录完成后的显示页面如下:

任务四:安装 Memcached
使用 yum 命令来安装 Memcached 及相关依赖:
yum -y install memcached python3-memcached
安装完成后,修改 Memcached 的配置文件:
vi /etc/sysconfig/memcached
文件内容:
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1,controller" # 在 option 中添加自己的主机名
此配置文件需要修改 OPTIONS 冒号中的参数,在 ::1 后面输入 ,controller,此处的 controller 为之前通过 hostname 命令配置的主机名。
启动 Memcached 并设置为开机自启动:
systemctl enable memcached.service
systemctl start memcached.service
查看 Memcached 的启动状态:
systemctl status memcached.service
输出示例:
● memcached.service - memcached daemon
Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2022-08-03 21:23:46 CST; 34s ago
Main PID: 10793 (memcached)
Tasks: 10 (limit: 47386)
Memory: 3.2M
CGroup: /system.slice/memcached.service
└─10793 /usr/bin/memcached -p 11211 -u memcached -m 64 -c 1024 -l 127.0.0.1,::1,controller
Aug 03 21:23:46 controller systemd[1]: Started memcached daemon.
显示为 Active: active (running) 表示服务启动正常。
任务五:安装 Keystone
步骤1:创建 keystone 数据库
在之前的步骤中,安装了 MariaDB 数据库。在安装 Keystone 之前,需要先在数据库中创建 Keystone 所使用的数据库。
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.5.16-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
执行 SQL 语句:
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'Huawei@123';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'Huawei@123';
\q
数据库操作命令介绍如下:
| 命令内容 | 命令解释 |
|---|---|
CREATE DATABASE keystone; | 创建一个数据库,名称为 Keystone |
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'Huawei@123'; | 赋予 Keystone 用户通过 “Huawei@123” 的密码认证,以本地访问来控制 Keystone 数据库中的所有资源(KEYSTONE_DBPASS 替换为用户自定义密码) |
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'Huawei@123'; | 赋予 Keystone 用户通过 “Huawei@123” 的密码认证,以任意的远程访问方式来控制 Keystone 数据库中的所有资源(KEYSTONE_DBPASS 替换为用户自定义密码) |
\q | 退出数据库 |
步骤 2:安装并配置 Keystone
1. 安装 Keystone 及相关依赖软件
yum -y install openstack-keystone httpd mod_wsgi
2. 设置数据库连接(注意密码 @ 已编码为 %40)
sed -i '/^\[database\]/,/^\[/ s|^#\?connection[[:space:]]*=.*|connection = mysql+pymysql://keystone:Huawei%40123@controller/keystone|' /etc/keystone/keystone.conf
3. 设置 Token 驱动为 fernet
sed -i '/^\[token\]/,/^\[/ s|^#\?provider[[:space:]]*=.*|provider = fernet|' /etc/keystone/keystone.conf
4. 修复文件权限
chown root:keystone /etc/keystone/keystone.conf
chmod 640 /etc/keystone/keystone.conf
5. 同步数据库
su -s /bin/bash keystone -c "keystone-manage db_sync"
使用 /bin/bash 或 /bin/sh 均可,确保以 keystone 用户执行,避免日志权限问题。
6. 创建 Fernet 密钥和 Credential 密钥
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
步骤3:初始化 OpenStack 环境
使用 keystone-manage bootstrap 命令来初始化 OpenStack 环境。注意:该命令必须写成完整的一行,不能换行执行,否则后续参数会被 bash 当作独立命令执行,导致 command not found 错误。
keystone-manage bootstrap --bootstrap-password Huawei@123 --bootstrap-admin-url http://controller:5000/v3/ --bootstrap-internal-url http://controller:5000/v3/ --bootstrap-public-url http://controller:5000/v3/ --bootstrap-region-id RegionOne
提示:如果命令过长,终端显示会自动换行,但实际输入时不需要在行尾加反斜杠
\,也不能手动按回车换行。请确保从keystone-manage到RegionOne全部作为一行输入。
此步骤用于初始化 OpenStack,会把 OpenStack 的 admin 用户的信息写入到 Keystone 的 user 表中,URL 信息写入到 Keystone 的 endpoint 表中,Region 信息写入到 region 表中。
配置 Apache HTTP 服务,Keystone 需要借助 HTTP 服务对外提供服务,首先需要编辑 HTTP 服务的配置文件 /etc/httpd/httpd.conf:
vi /etc/httpd/conf/httpd.conf
修改:
#ServerName www.example.com:80
ServerName controller
在文件中添加一行内容,ServerName controller,用于告知 Apache,在服务器开启时,需要针对 controller 主机名对应的地址进行监听,默认监听 80 端口。
配置链接文件,在 openstack-wallaby 版本中,keystone 依赖于 apache 服务启动,所以需要将之前安装好的 wsgi 的 keystone 配置文件链接到 apache 的配置文件目录下:
ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/
使用 cat 命令查看一下 wsgi 的配置文件,配置文件中设置了 keystone 的侦听端口为 5000:
cat /usr/share/keystone/wsgi-keystone.conf
输出内容:
Listen 5000
<VirtualHost *:5000>
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
LimitRequestBody 114688
<IfVersion >= 2.4>
ErrorLogFormat "%{cu}t %M"
</IfVersion>
ErrorLog /var/log/httpd/keystone.log
CustomLog /var/log/httpd/keystone_access.log combined
<Directory /usr/bin>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
</VirtualHost>
Alias /identity /usr/bin/keystone-wsgi-public
<Location /identity>
SetHandler wsgi-script
Options +ExecCGI
WSGIProcessGroup keystone-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
</Location>
配置完成后,需要启动 apache 服务并设置为开机自启动,在启动之前,需要先关闭 selinux,避免启动失败:
setenforce 0
systemctl enable httpd.service
systemctl start httpd.service
查看启动后的 httpd 服务状态:
systemctl status httpd.service
输出示例:
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2022-08-04 00:43:14 CST; 29s ago
Docs: man:httpd.service(8)
Main PID: 20048 (httpd)
Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec: 0 B/sec"
Tasks: 197 (limit: 47386)
Memory: 54.0M
CGroup: /system.slice/httpd.service
├─20048 /usr/sbin/httpd -DFOREGROUND
├─20049 /usr/sbin/httpd -DFOREGROUND
├─20050 "(wsgi:keystone-" -DFOREGROUND
├─20051 "(wsgi:keystone-" -DFOREGROUND
├─20052 "(wsgi:keystone-" -DFOREGROUND
├─20053 "(wsgi:keystone-" -DFOREGROUND
├─20054 "(wsgi:keystone-" -DFOREGROUND
├─20055 /usr/sbin/httpd -DFOREGROUND
├─20056 /usr/sbin/httpd -DFOREGROUND
└─20057 /usr/sbin/httpd -DFOREGROUND
Aug 04 00:43:14 controller systemd[1]: Starting The Apache HTTP Server...
Aug 04 00:43:14 controller systemd[1]: Started The Apache HTTP Server.
在 CGroup 中可以看到 wsgi:keystone 作为 apache 的子进程也成功启动。
创建环境变量,在后续的实验中,需要使用 openstack 命令行来进行操作,在操作时,需要验证操作人的身份,所以需要提前创建环境变量,提供操作所需的信息:
cat << EOF >> ~/.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=Huawei@123
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
EOF
此处需要保持 OS_PASSWORD 与步骤三第一步配置的密码保持一致,其余内容保持一样。
任务六:keystone 基础命令实验
步骤1:安装 OpenStack 命令行并导入环境变量
使用 yum 命令安装 OpenStack 命令行:
yum -y install python3-openstackclient
使用 source 命令导入环境变量:
source ~/.admin-openrc
使用 env 命令验证环境变量导入是否成功:
env
输出示例:
OS_AUTH_URL=http://controller:5000/v3
OS_PROJECT_DOMAIN_NAME=Default
MOTD_SHOWN=pam
HOME=/root
LANG=en_US.UTF-8
SSH_CONNECTION=192.168.56.1 60975 192.168.56.109 22
OS_USERNAME=admin
SELINUX_USE_CURRENT_RANGE=
SHLVL=1
OS_USER_DOMAIN_NAME=Default
SSH_CLIENT=192.168.56.1 60975 22
OS_PROJECT_NAME=admin
OS_PASSWORD=Huawei@123
通过命令回显,可以看到环境变量导入成功。
步骤2:创建、删除、查看、修改域
在之前的实验中已经安装了 OpenStack 命令行并导入了环境变量,现在可以直接进行域的创建:
openstack domain create Huawei
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| enabled | True |
| id | ada4dd8130b34442a7c5e3c80c1062dc |
| name | Huawei |
| options | {} |
| tags | [] |
+-------------+----------------------------------+
在 OpenStack 中,每个资源都有其独一无二的 ID,OpenStack 是通过 ID 而非 name 去唯一标识一个资源。
创建完成后,可以查看当前总共有哪些域:
openstack domain list
输出示例:
+----------------------------------+---------+---------+--------------------+
| ID | Name | Enabled | Description |
+----------------------------------+---------+---------+--------------------+
| ada4dd8130b34442a7c5e3c80c1062dc | Huawei | True | |
| default | Default | True | The default domain |
+----------------------------------+---------+---------+--------------------+
可以看到,除了刚刚手动创建的域以外,还有一个默认的域,除了查看总共有哪些域以外,还可以单独查看某一个域的详细信息:
openstack domain show Huawei
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| enabled | True |
| id | ada4dd8130b34442a7c5e3c80c1062dc |
| name | Huawei |
| options | {} |
| tags | [] |
+-------------+----------------------------------+
可以使用 openstack domain show 命令来查看一个域的详细信息,包括描述、是否开启、ID 以及名称等。
修改域信息,可以通过 openstack domain set 命令来修改域的信息,修改的内容包括但不限于重命名该域,停用该域等:
openstack domain set --name Huawei.com --disable Huawei
修改完成后,查看使用新的域名称查看域的信息:
openstack domain show Huawei.com
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| enabled | False |
| id | ada4dd8130b34442a7c5e3c80c1062dc |
| name | Huawei.com |
| options | {} |
| tags | [] |
+-------------+----------------------------------+
结果验证成功,状态改为停用。
最后,可以使用 openstack domain delete 来删除域:
openstack domain delete Huawei.com
删除完毕后,使用 openstack domain list 查看域列表,确认删除结果:
openstack domain list
输出示例:
+---------+---------+---------+--------------------+
| ID | Name | Enabled | Description |
+---------+---------+---------+--------------------+
| default | Default | True | The default domain |
+---------+---------+---------+--------------------+
确认删除成功,只有默认的域还存在。
步骤3:创建、查看、修改、删除项目
使用 openstack project 命令创建一个自定义项目,并将之与一个域进行关联,在前面的实验中学习了如何创建一个域,在这里先重新创建一个域,再创建一个项目与之关联:
openstack domain create Huawei
openstack project create --domain Huawei lab
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | True |
| id | 4164d6b4f71d471a9a12557df6f6d3a8 |
| is_domain | False |
| name | lab |
| options | {} |
| parent_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| tags | [] |
+-------------+----------------------------------+
通过 openstack project create 命令创建了一个名为 lab 的项目,属于 Huawei 域。
创建完成后,可以查看当前总共有哪些项目:
openstack project list
输出示例:
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| 4164d6b4f71d471a9a12557df6f6d3a8 | lab |
| cfacc41f83e84ec0a3ce70f915934862 | admin |
+----------------------------------+-------+
可以使用 openstack project show 命令来查看一个项目的详细信息,包括描述、是否开启、ID 以及名称等:
openstack project show lab
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | True |
| id | 4164d6b4f71d471a9a12557df6f6d3a8 |
| is_domain | False |
| name | lab |
| options | {} |
| parent_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| tags | [] |
+-------------+----------------------------------+
修改项目信息,可以通过 openstack project set 命令来修改项目的信息,修改的内容包括但不限于重命名该项目、停用该项目、修改项目所属域等:
openstack project set --domain Huawei --disable lab
openstack project show lab
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | False |
| id | 4164d6b4f71d471a9a12557df6f6d3a8 |
| is_domain | False |
| name | lab |
| options | {} |
| parent_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| tags | [] |
+-------------+----------------------------------+
设置项目状态为 False。在修改一个项目的属性时,如果使用项目名称作为参数,则需要指定该项目的域名称,因为在不同的域下可以有相同的项目名。如果使用项目 ID 作为参数,则无需指定项目域,因为项目 ID 是全局唯一的。
最后,可以使用 openstack project delete 来删除项目:
openstack project delete --domain Huawei lab
删除完成后,查看项目列表,确认删除成功:
openstack project list
输出示例:
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| cfacc41f83e84ec0a3ce70f915934862 | admin |
+----------------------------------+-------+
步骤4:创建、查看、修改、删除用户
使用 openstack user create 命令来创建用户,创建用户时需要指定用户所属的域以及用户密码:
openstack user create --domain Huawei --password Huawei@123 huawei
输出示例:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | True |
| id | 05af80fdbcaa4f06a393e4fe2f32114d |
| name | huawei |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
查看当前系统已有用户列表:
openstack user list
输出示例:
+----------------------------------+--------+
| ID | Name |
+----------------------------------+--------+
| b18d589ca88b44efbde3da970f86e972 | admin |
| 05af80fdbcaa4f06a393e4fe2f32114d | huawei |
+----------------------------------+--------+
查看用户详细信息:
openstack user show --domain Huawei huawei
输出示例:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | True |
| id | 05af80fdbcaa4f06a393e4fe2f32114d |
| name | huawei |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
用户和项目一样,都是属于域内名称唯一,域间名称可重复,所以在查看用户时,带上用户所属的域名去查询会比较准确且不会报错。
修改用户属性 openstack user set,在修改属性操作中可以设置用户所属的项目,在上个实验中学习了如何创建项目,在这里复习一下并创建一个新的项目:
openstack project create --domain Huawei lab
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | True |
| id | 09d125ce3d4f4837896ecc81437b9fca |
| is_domain | False |
| name | lab |
| options | {} |
| parent_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| tags | [] |
+-------------+----------------------------------+
openstack user set --domain Huawei --description test_user --project lab huawei
配置完成后,使用 openstack user show 命令进行验证,修改结果成功:
openstack user show --domain Huawei huawei
输出示例:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| default_project_id | 09d125ce3d4f4837896ecc81437b9fca |
| description | test_user |
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | True |
| id | 05af80fdbcaa4f06a393e4fe2f32114d |
| name | huawei |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
使用 openstack user delete 删除用户:
openstack user delete --domain Huawei huawei
删除完成后使用 openstack user list 进行验证,成功删除用户:
openstack user list
输出示例:
+----------------------------------+-------+
| ID | Name |
+----------------------------------+-------+
| b18d589ca88b44efbde3da970f86e972 | admin |
+----------------------------------+-------+
步骤5:创建、查看、修改、删除角色
创建角色 openstack role create:
openstack role create guest
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | None |
| domain_id | None |
| id | 193fac8f20ea4be8a32da0e761455aed |
| name | guest |
| options | {} |
+-------------+----------------------------------+
查看角色列表 openstack role list:
openstack role list
输出示例:
+----------------------------------+--------+
| ID | Name |
+----------------------------------+--------+
| 193fac8f20ea4be8a32da0e761455aed | guest |
| 2876c2f09cfd44028d641e243bc3026b | member |
| 6c2ec905e99c42e3ac07f15ab77d7c05 | reader |
| d1212bdd36b743119ea3b57cd183f537 | admin |
+----------------------------------+--------+
查看角色详细信息 openstack role show 角色名:
openstack role show admin
输出示例:
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | None |
| domain_id | None |
| id | d1212bdd36b743119ea3b57cd183f537 |
| name | admin |
| options | {'immutable': True} |
+-------------+----------------------------------+
将角色与用户及项目关联起来,openstack role add:
openstack user create --domain Huawei --password Huawei@123 huawei
输出示例:
+---------------------+----------------------------------+
| Field | Value |
+---------------------+----------------------------------+
| domain_id | b0adf6c21e174d54a4dcc17dbf6f0ecb |
| enabled | True |
| id | 3e38e9c989a8425a87ae1218ab547c36 |
| name | huawei |
| options | {} |
| password_expires_at | None |
+---------------------+----------------------------------+
openstack role add --project lab --user huawei guest
关联完成后,使用 openstack role assignment list 命令来查看:
openstack role assignment list
输出示例:
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| Role | User | Group | Project | Domain | System | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| 193fac8f20ea4be8a32da0e761455aed | 3e38e9c989a8425a87ae1218ab547c36 | | 09d125ce3d4f4837896ecc81437b9fca | | | False |
| d1212bdd36b743119ea3b57cd183f537 | b18d589ca88b44efbde3da970f86e972 | | cfacc41f83e84ec0a3ce70f915934862 | | | False |
| d1212bdd36b743119ea3b57cd183f537 | b18d589ca88b44efbde3da970f86e972 | | | | all | False |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
通过 ID 的比较,确认 guest 角色与 huawei 用户成功关联。
解关联角色 openstack role remove:
openstack role remove --project lab --user huawei guest
解关联后,使用 openstack role assignment list 命令来查看:
openstack role assignment list
输出示例:
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| Role | User | Group | Project | Domain | System | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
| d1212bdd36b743119ea3b57cd183f537 | b18d589ca88b44efbde3da970f86e972 | | cfacc41f83e84ec0a3ce70f915934862 | | | False |
| d1212bdd36b743119ea3b57cd183f537 | b18d589ca88b44efbde3da970f86e972 | | | | all | False |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+--------+-----------+
验证后发现角色和用户已经成功解关联。
删除角色 openstack role delete:
openstack role delete guest
openstack role list
输出示例:
+----------------------------------+--------+
| ID | Name |
+----------------------------------+--------+
| 2876c2f09cfd44028d641e243bc3026b | member |
| 6c2ec905e99c42e3ac07f15ab77d7c05 | reader |
| d1212bdd36b743119ea3b57cd183f537 | admin |
+----------------------------------+--------+
任务七:综合实验
步骤 1:创建项目、用户、角色并绑定
1.1 创建项目
openstack project create --domain default myproject
1.2 创建用户(推荐非交互方式,避免密码输入错误)
openstack user create --domain default --password 'Huawei@123' myuser
若必须交互式,可使用 --password-prompt,但需确保两次输入一致。
1.3 创建角色
openstack role create myrole
1.4 将角色绑定到项目和用户
openstack role add --project myproject --user myuser myrole
1.5 验证绑定
openstack role assignment list --user myuser --project myproject --names
应看到 myrole 出现在输出中。
步骤2:修改 Keystone 策略文件(使 myrole 拥有 admin 权限)
重要提示:直接修改源码文件属于临时方案,生产环境建议通过
policy.yaml覆盖。此处按实验要求修改base.py,但必须谨慎操作,避免语法错误。
2.1 进入策略目录并备份原文件
cd /usr/lib/python3.9/site-packages/keystone/common/policies
cp base.py base.py.bak
2.2 使用 sed 精确替换,避免手动编辑出错
sed -i "s/check_str='role:admin or is_admin:1'/check_str='role:admin or is_admin:1 or role:myrole'/" base.py
2.3 验证文件语法(关键!)
cd /root
python3 -c "import ast; ast.parse(open('/usr/lib/python3.9/site-packages/keystone/common/policies/base.py').read()); print('语法正确')"
2.4 清理 Python 缓存并重启 httpd
find /usr/lib/python3.9/site-packages/keystone -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null
systemctl restart httpd
步骤3:配置 myuser 的环境变量文件
3.1 复制 admin 环境变量文件(如果已有)
cd ~
cp .admin-openrc .myuser-openrc
3.2 赋予文件适当权限(可选)
chmod 600 ~/.myuser-openrc
步骤4:使用 myuser 验证权限
4.1 导入环境变量
source ~/.myuser-openrc
4.2 重启 httpd(使策略文件生效)
systemctl restart httpd
4.3 验证用户列表权限
openstack user list
若成功返回用户列表,说明 myrole 已具备 admin_required 权限。
4.4 进一步验证创建/删除用户权限
# 创建一个测试用户
openstack user create --domain default --password 'Test@123' testuser
# 查看用户列表确认
openstack user list
# 删除测试用户
openstack user delete testuser
# 查看用户列表确认(是否删除)
openstack user list
实验完成后,建议将 base.py 恢复为官方原版,避免影响后续升级或其他功能(务必操作,否则影响后续实验!)
cd /usr/lib/python3.9/site-packages/keystone/common/policies
cp base.py.bak base.py
cd /root
python3 -c "import ast; ast.parse(open('/usr/lib/python3.9/site-packages/keystone/common/policies/base.py').read()); print('语法正确')"
find /usr/lib/python3.9/site-packages/keystone -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null
systemctl restart httpd
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)