最近一直在搭载OpenStack的Identify组件——keystone
我所使用的系统是:Ubuntu Service 14.04,搭载的是OpenStack版本是:Juno
Identify Keystone是OpenStack的认证部分,它负责身份验证、服务规则和服务令牌的功能, 它实现了OpenStack的Identity API。Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。
一、需要认识OpenStack的Identify认证的部分名词:
1. User(用户):一个广泛的名词,代表使用了OpenStack服务的人、系统、服务器等等;
2. Credentials(证书):用来认证用户的数据,例如用户名和密码、用户名和API的key、或者由认证机构提供的token等;
3. Authentication(认证):认证用户的过程,OpenStack确保每一个请求都是由用户根据有效凭证进行发送的;
4. Token(令牌):其实是由一串字符或数字组成的字符串,在有效期间token能够参与认证,充当证书,但是token随时能够被撤销从而无效;
5. Tenant(租户):各个服务中的一些可以访问的资源集合。例如,在Nova中一个tenant可以是一些机器,在Swift和Glance中一个tenant可以是一些镜像存储等;
6. Service(服务):OpenStack对应的服务,也就是各个组件,例如Nova、Swift、Glance等;
7. Endpoint(端点):一个网络可达的地址,通常是URL,如果你想访问一个服务,你必须知道他的endpoint,也就是它的地址;
8. Role(角色):通过定义的权限和特权来执行操作;
二、关于网络部分:
如果自己搭载所处的环境能够提供多台主机或者一台主机有多个网卡,则可以为每一台主机/网卡静态分配IP,再绑定对应的hosts;
# computel
10.0.0.31computel
#controller
10.0.0.11controller
我们先尝试在自己的虚拟机上搭载keystone,所以在hosts 上绑定:
# controller
127.0.0.1controller
三、安装
1. 安装keystone:通过Ubuntu的apt-get进行安装即可:命令行前的#表示使用root用户执行,$则表示使用任意用户
# apt-get install keystone python-keystone python-keystoneclient
2. 创建数据库和数据库用户:
安装mysql数据库,安装过程中会让你输入root用户的密码。
# apt-get install mysql-server mysql-client python-mysqldb
进入mysql并创建keystone数据库:
# mysql -u root -p
[sql] view plaincopy
> create database keystone;
> grant all privileges on keystone.* to keystoneUser@localhost identified by 'KEYSTONE_DB_PWD';
> grant all privileges on keystone.* to keystoneUser@'%' identified by 'KEYSTONE_DB_PWD';
访问数据库的keystoneUser为用户名,其中需要设置数据库keystone的密码KEYSTONE_DB_PWD;(SQL语句末尾必须加上分号' ; ')
3. 修改数据库keystone的配置文件:/ect/keystone/keystone.conf
# vim /etc/keystone/keystone.conf
修改 [database] 下的connection
connection = mysql://keystoneUser:KEYSTONE_DB_PWD@controller/keystone
其中KEYSTONE_DB_PWD为以上数据库keystone所设置的密码;
修改 [token] 下的driver和provider:
provider = keystone.token.providers.uuid.Provider
driver = keystone.token.backends.sql.Token
官方文档中该driver值设置为:driver = keystone.token.persistence.backends.sql.Token,但是按照官方的文档来的话,会导致keystone服务一直处于stop状态,导致后面无法连接上数据库或找不到实例instance。(这里踩过坑)
修改[revoke]下的driver:
driver = keystone.contrib.revoke.backends.sql.Revoke
修改[DEFAULT]下的verbose:
verbose = True
4.退出mysql,重启keystone服务:
# service keystone restart
5.同步keystone数据库:
# keystone-manage db_sync
如果出现no module named mysqldb,则表示没有apt-get install python-mysqldb。此时可以进入数据库查看我们的表:
# mysql -u root -p
[sql] view plaincopy
> use keystone;
> show tables;
进入keystone的数据库,可以看到有user,token,role,domain,endpoint等表格;
6. 修改 /etc/keystone/keystone.conf中的admin_token:
执行以下语句获得ADMIN_TOKEN:
# openssl rand -hex 10
修改keystone.conf
# vim /etc/keystone/keystone.conf
修改 [DEFAULT]下的 admin_token=ADMIN_TOKEN
重启keystone服务:
# service keystone restart
7. 设置环境变量:
# export OS_SERVICE_TOKEN="ADMIN_TOKEN"
# export OS_SERVIDE_ENDPOINT="http://controller:35357/v2.0"
然后我们可以通过执行以下语句,通过查询数据库查看我们的用户列表:
# keystone user-list
因为此时没有添加任何用户,所以将会显示空行。如果出现stop:unknow instanc的问题,就参考以上第4小点;
8. 添加admin的租户、角色、用户:
# keystone tenant-create --name=admin --description="Admin Tenant"
# keystone role-create --name=admin
# keystone user-create --name=admin --pass=ADMIN_PASS--email=xx@mail.com
# keystone user-role-add --user=admin --tenant=admin --role=admin
其中的ADMIN_PASS表示管理员账号的密码,xx@mail.com填写本人的邮箱地址,执行后的显示如下:其中最后一条语句没有输出任何信息
可以创建demo的tenant和用户,这里就不演示了,可以参考官方文档。
9. 创建Service tenant:
# keystone tenant-create --name=service --description="Service Tenant"
10. 创建认证服务:
# keystone service-create --name=keystone --type=identity --description="KeyStone Identity Service"
11. 创建服务端点:其中服务端点包括publicurl、internalurl、adminurl
# keystone endpoint-create --service-id=SERVICE_ID_ADOVE --publicurl=http://controller:5000/v2.0 \
--internalurl=http://controller:5000/v2.0 --adminurl=http://controller:35357/v2.0
其中SERVICE_ID_ADOVE表示上一小点(第10小点)执行结果中输出的id,如上图就是:15c11a23667e427e91bc3135b45f4bd,如果出现找不到该service的问题,则可能是因为id填写错误。输出结果如下:
四、验证
1. 取消环境变量
# unset OS_SERVICE_TOKEN OS_SERVIDE_ENDPOINT
2.以admin tenant和user,请求我们的信息:其中ADMIN_PASS为 三-8 中设置的管理员密码:
获得token:
# keystone --os-tenant-name=admin --os-username=admin --os-password=ADMIN_PASS --os-auth-url=http://controller:35357/v2.0 token-get
获得tenant列表:
# keystone --os-tenant-name=admin --os-username=admin --os-password=ADMIN_PASS --os-auth-url=http://controller:35357/v2.0 tenant-list
获得用户列表:
# keystone --os-tenant-name=admin --os-username=admin --os-password=ADMIN_PASS --os-auth-url=http://controller:35357/v2.0 user-list
获得服务列表:
# keystone --os-tenant-name=admin --os-username=admin --os-password=ADMIN_PASS --os-auth-url=http://controller:35357/v2.0 service-list
如果以上均能获得对应的列表信息,则表示我们搭载的服务是成功的,能够顺利访问到数据库。
五、创建客户端环境脚本:
1. 创建脚本:
# vim admin-openrc.sh
在admin-openrc.sh中添加以下内容:
export OS_TENANT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_AUTH_URL=http://controller:35357/v2.0
这里对于端口使用35357和5000进行一下说明:35357主要用于管理员使用,而5000端口供普通用户使用,所以通过访问端口的不同来区分不同的用户;
2. 生效:
$ source admin-openrc.sh
以上就是整一个搭载的过程,如有纰漏,将及时改正。