keystone的安装过程费了我好几天时间,主要是卡在了数据库同步上面,各种报错。
1. 准备工作
操作1.1:以root身份进入SQL数据库,进入后创建keystone数据库:CREATE DATABASE keystone
操作1.2:依旧在数据库内,进行keystone用户创建与授权,命令直接截取官网说明,如下所示
注意修改KEYSTONE_DBPASS为自己所要设置的密码
操作1.3:退出数据库,回到命令行界面,执行 openssl rand -hex 10,得到一串字符,将会用作临时的admin token,在后续安装
中起左右,一定要记录下来。
2. 安装与配置keystone
操作2.1:安装命令 apt-get install keystone apache2 libapache2-mod-wsgi
操作2.2:编辑 /etc/keystone/keystone.conf,需要改动的地方如下所示,本处的配置与Liberty版本差异较大
2.2.1:在[DEFAULT]下,写入 ,这就是刚才操作1.3所生成的token
2.2.2:在[database]下,写入,其
中KEYSTONE_DBPASS就是在操作1.2中设置的密码
2.2.3:在[token]下,写入
操作2.3:同步数据库命令 su -s /bin/sh -c "keystone-manage db_sync" keystone,在执行本命令时,先后出现了2个错误
错误一:无法连接数据库,解决方案时在环境准备时(见上一篇文章),在hosts文件中写入 127.0.0.1 controller
错误二:在修正了错误一后,执行同步命令,结果出现 specified key was too long; max key length is 767 bytes。仔细
研究了一下,是SQL数据库的编码设置出了问题。openstack采用的数据库默认编码是utf8,我们可以看到在
上一篇文章环境准备中,安装完MariaDB后,配置openstack.conf文件时,写入的默认编码是utf8,如下图:
可是当我们进入数据库后,输入命令 show variables like "%char%"时,显示的编码方式多数都是utf8mb4
(原谅我没有截图)。utf8mb4是utf8的超集,在utf8mb4编码下一个字符4个字节,而在utf8编码下一个字符3个
字节。也就是说,在max key length 是767字节的情况下,如果使用的是utf8mb4编码,则在创建表格时,表
格中定义的变量长度不能超过191个字符。可是在同步keystone的表格操作过程中,会出现变量长度达到250
的情况,这样就出现了上述的错误。
解决方案是:将/etc/mysql/mariadb.conf.d目录下的所有.cnf文件中出现uft8mb4的地方都修改成uft8,然后重
启数据库。重启完之后我们再进入数据库,输入命令 show variables like "%char%"后,出现表格内容如下:
此后,再执行keystone的同步操作,顺利执行。
操作2.4:执行命令 keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
操作2.5:执行命令 echo "manual" > /etc/init/keystone.override;这步骤在官网安装说明中是放到keystone安装与配置的第一步
的,其作用是将keystone服务设置为开机不自动启动,理由是keystone服务在Liberty和Mitaka版本中唯一的作用就是数
据库同步,而不再用作keystone模块的管理。我在若干次的openstack安装过程中,在keystone同步前发生了机器重启
的情况,keystone服务没有启动起来,结果同步命令出错。所以,将这步骤放到同步完成之后,最为保险。
3. 配置Apache HTTP服务
Apache2已经安装过了,见前面的步骤,此处仅仅需要进行一些配置工作。
操作3.1:编辑 /etc/apache2/apache2.conf,在任意位置处写上 ServerName controller
操作3.2:创建文件 /etc/apache2/sites-available/wsgi-keystone.conf,将下面内容拷贝进去即可,可直接去官网
http://docs.openstack.org/mitaka/install-guide-ubuntu/keystone-install.html 处拷贝文件内容:
操作3.3:执行 ln -s /etc/apache2/sites-available/wsgi-keystone.conf /etc/apache2/sites-enabled
操作3.4:执行 service apache2 restart
操作3.5:扫尾工作 rm -f /var/lib/keystone/keystone.db
至此,身份认证模块keystone就已经安装配置完毕了。
4. 创建服务实体与API end point
openstack中每个服务都需要创建服务实体,相当于在keystone进行注册,之后对这些注册服务的任何访问都需要通过keystone 来进行认证。对于keystone来说,openstack上所有安装的服务都是它的用户。这里,需要理解keystone中很多术语的概念,例如domain、project、group、user、role、region等,以及它们之间的关系。在下一篇文章中,我会详细给出我对这些概念和关系的理解,在此处只给出命令,不做具体解释。所执行命令与官网完全一致,命令执行结果没有截图,因为当初还没想着写blog。
操作4.1:创建环境变量
export OS_TOKEN=ADMIN_TOKEN (ADMIN_TOKEN 是之前创建的临时token,不能写错)
export OS_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
操作4.2:创建服务实体与API URL,注意任何服务都要创建3个API URL,给不同权限的实体(用户、其他服务等)使用
openstack service create --name keystone --description "OpenStack Identity" identity
openstack endpoint create --region RegionOne identity public http://controller:5000/v3
openstack endpoint create --region RegionOne identity internal http://controller:5000/v3
openstack endpoint create --region RegionOne identity admin http://controller:35357/v3
5. 创建domain、project、user、role等
操作5.1:创建default domain:openstack domain create --description "Default Domain" default
操作5.2:创建admin project: openstack project create --domain default --description "Admin Project" admin
操作5.3:创建admin user:openstack user create --domain default --password-prompt admin
操作5.4:创建admin role:openstack role create admin
操作5.5:将admin角色赋予admin项目与admin用户,意思是admin用户对admin项目中的所有资源拥有admin权限:
openstack role add --project admin --user admin admin
操作5.6:创建service project:openstack project create --domain default --description "Service Project" service
操作5.7:创建demo project:openstack project create --domain default --description "Demo Project" demo
操作5.8:创建demo user: openstack user create --domain default --password-prompt demo
操作5.9:创建user role:openstack role create user
操作5.10:将user角色赋予demo项目的demo用户,意思是demo用户对demo项目中的所有资源拥有user权限:
openstack role add --project demo --user demo user
6.验证操作
大家可以看到,之前步骤4-5的各种创建命令,都是比较短的,而实际上openstack命令是很长的,包含很多变量值的输入,之所以可以用短命令,是因为我们在操作4.1中设置了环境变量,这样openstack命令在执行时会检查一些必要的参数有没有值,如果没有的话就去环境变量里面找。我们之前在环境变量中写入了admin_token,这是非常不安全的。
官网上的验证操作中第一步就是设置禁用临时token认证的方式,如下所示(懒得翻译了)
第二步取消我们在操作4.1中设置的环境变量:unset OS_TOKEN OS_URL
第三步,输入一个完整的命令来获取admin用户的token,其实就是对admin用户进行身份验证,然后返回一个token,命令如下:
openstack --os-auth-url http://controller:35357/v3 \
--os-project-domain-name default --os-user-domain-name default \
--os-project-name admin --os-username admin token issue
第四步则是对demo用户进行身份验证
在官网说明最后有这样一个步骤-Create OpenStack client environment scripts (see http://docs.openstack.org/mitaka/install-guide-ubuntu/keystone-openrc.html),它的作用其实就是写了一个脚本,执行环境变量的创建,简化openstack命令长度。
至此,keystone 身份认证模块安装配置完毕。