OpenStack云第三天
部署OpenStack Identity服务。
继OpenStack云第二天,本文翻译自OpenStack安装与部署指南第五章内容,内容主要是安装OpenStack Identity Service(身份认证服务) 。OpenStack Identity服务负责管理用户与客户,项目以及提供为其他OpenStack组件提供通用身份认证系统。
目录:
一、基本概念
二、安装与配置Identity服务
三、验证
一、基本概念
身份认证服务包括两个主要功能:
用户管理:时时跟踪用户以及用户被赋予了什么权限。
服务编录:提供一份可用服务的目录并可以定位这些服务的API。
1.1 用户管理
Identity用户管理包括三个主要概念:
用户表示拥有用户名,密码,邮箱等帐号信息的自然人。这里给出创建用户名为"alice”的用户:
$ keystone user-create --name=alice --pass=mypassword123 [email protected]
租户可以被理解为一个项目,团队或组织。你必须指定一个相应的租户(tenant)才可以申请OpenStack服务,例如你指定以某租户申请Compute服务来查询当前运行的实例列表,则你将收到的是该租户的运行实例列表。这里是创建一个名为"acme”租户的例子:
$ keystone tenant-create --name=acme
注意事项:由于在早期的版本中使用项目术语来表示租户,所以有些命令行工具使用--project_id替代--tenant_id给客户分配一个ID号。
角色代表特定的租户中的用户用户操作权限,可以使用如下命令创建角色:
$ keystone role-create --name=compute-user
译者批注:你可以理解租户为那些使用你云环境的客户,这些客户可以是一个项目组、工作组、公司,这些客户中会建立不同的帐号(用户)及其对应的权限(角色).
Identity服务将用户与租户及角色结合在一起,继续刚才的例子,我们也许希望在acme租户中为alice用户分配compute-user角色。
$ keystone user-list
$ keystone role-list
$ keystone tenant-list
$ keystone user-role-add \
--user=96a6ebba0d4c441887aceaeced892585 \
--role=f8dd5a2e4dc64a41b96add562d9a764e \
--tenant_id=2395953419144b67955ac4bab96b8fd2
一个用户可以在不同的租户中被分配不同的角色,例如Alice也可以在Cyberdyne租户中用户admin角色。一个用户也可以在同一个租户中分配多个角色。
/etc/[服务代码名称]/policy.json控制着哪些用户可以拥有什么样的服务,如:/etc/nova/policy.json定义了Compute服务的访问策略,/etc/glance/policy.json定义Image服务的访问策略,以及/etc/keystone/policy.json定义Identity服务的访问策略。
Compute,Identity,Image服务的默认policy.json文件仅识别admin角色:所有的操作无需admin角色即可被租户中拥有任何角色的用户均可以访问。
如果你希望限制用户在Compute服务中所执行的操作,你需要在Identity服务中创建一个角色并修改/etc/nova/policy.json,实现仅提供该角色才可以执行Compute操作。
实例,以下在/etc/nova/policy.json中的配置设定卷创建的操作对用户无任何限制,在租户中的用户用户任何角色均可以创建卷。
"volume:create": [],
如果你需要仅拥有compute-user角色的用户才可以创建卷,你就需要添加一行”role:compute-user”,具体配置如下:
"volume:create": ["role:compute-user"],
如我们需要对所有Compute服务的请求均需要指定的角色,你的配置文件应该作类似于如下这样的配置:
1.2 服务管理
服务管理有两个主要的概念:
服务
终端
Identity服务同时维护着一份与各个服务相同的用户(如:Compute服务有一个对应的用户名nova),以及一个名为service的特殊服务租户。
二、安装与配置Identity服务
2.1.安装Identity服务
你可以安装Identity服务在任何能被其他服务主机访问的服务器上,以root身份运行如下命令:
# yum install openstack-utils openstack-keystone
备注:原文档仅提供安装命令,但该安装方式需要设置yum源,以下为个人补充的添加yum源方法,方法来源于Fedora项目。$ sudo rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
安装后,你需要删除sqlite数据库并修改配置文件将其指向MySQL数据库。这样的配置更容易部署多个Keystone前段指向相同的后端数据库服务器。
删除/var/lib/keystone目录下的keystone.db文件。
备注:据译者亲身实验,使用以上的yum源安装时该文件并不会产生,省去了删除文件的步骤。
配置生产环境的数据库存储来取代默认的目录功能以备份服务及终端数据,这里以MySQL为例。
安装MySQL(需要root权限):
# yum install mysql mysql-server
安装过程中会提示为mysql的root帐号设置密码,根据提示设置密码。
设置Mysql为开机启动进程:
# chkconfig --level 2345 mysqld on
# service mysqld start
以下系列命令将创建一个名为"keystone”的数据库,以及一个名为"keystone”的mysql用户名,该用户拥有访问keystone数据库的所有权限。默认,密码与用户名同名。
在Fedora,RHEL,CentOS系统上,你可以通过openstack-db命令创建Keystone数据库。
$ duso openstack-db --init --service keystone
也可以通过手动的方式创建数据库。
$ mysql -u root -p
根据提示:需要输入mysql root的密码,创建keystone数据库。
mysql> CREATE DATABASE keystone;
接着再创建一个对新建keystone数据库具有完全权限的mysql账户,注意为用户选择安全的密码,方法参考以下命令。
mysql> GRANT ALL ON keystone.* TO 'keystone’@'%’ IDENTIFIED BY ‘你的密码’;
退出MySQL数据库: mysql> quit
回想以下,我们在OpenStack第二天文档中对云环境的构思中建设云控制节点的IP为192.168.106.130。
现在一个Keystone已经安装完成,你可以通过主配置文件修改配置(/etc/keystone/keystone.conf),以及通过命令行初始化数据。默认Keystone的数据保存在sqlite中,在/etc/keystone/keystone.conf修改如下一行connection定义来改变数据存储位置:
connection = mysql://keystone:[密码]@192.168.206.130/keystone
备注:据译者亲身实验,现在的keystone版本默认就将数据库指向了本机的MySQL数据库。
同时,要确保keystone.conf文件中配置了合适的服务标识符,你可以使用自己的随机字串,像下面这样:
admin_token = 012345SECRET99TOKEN012345
或者通过命令行设置随机字串:
$ export ADMIN_TOKEN=$(openssl rand -hex 10)
$ sudo openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token $ADMIN_TOKEN
译者备注:export ADMIN_TOKEN=$(openssl rand -hex 10)是调用openssl命令产生10位随机字串,并将结果赋予ADMIN_TOKEN全局变量;再通过openstack-config命令修改keystone.conf配置文件就admin_token参数的取值为刚刚定义的全局变量ADMIN_TOKEN的值(10位随机字串)。
下一步,重启keystone服务,并设置为开机启动项。
$ sudo service keystone restart && sudo chkconfig keystone on
译者备注:在新的版本中keystone的启动脚本不是keystone,而是openstack-keystone,所以实际工作中你需要将以上命令修改为sudo service openstack-keystone restart && sudo chkconfig openstack-keystone on
最后初始化新的keystone数据库,需要root权限:
# keystone-manage db_sync
2.2.配置Identity服务
设置租户,用户与角色,你最少需要定义一个租户、用户、角色以通过Identity服务的身份验证与授权获得其他服务。
脚本配置:
在Fedora,RHEL或CentOS系统上,你可以通过运行脚本更新数据。
$ sudo ADMIN_PASSWORD=$OS_PASSWORD SERVICE_PASSWORD=servicepass openstack-keystone-sample-data
Keystone项目提供了一份部署客户、用户、角色的bash脚本,样本数据在https://github.com/openstack/keystone/blob/master/tools/sample_data.sh。
译者注:系统命令openstack-keystone-sample-data运行的就是位于/usr/share/openstack-keystone目录下的sample_data.sh脚本。
此外,任何用户pyton工具的分布,都可以通过keystone客户端的API运行keystone-init脚本完成初始化动作。
$ git clone https://github.com/nimbis/keystone-init.git
这个初始化脚本需要使用PyYAML,通过https://github.com/nimbis/keystone-init/blob/master/keystone-init.py页面,你可以看到脚本做了哪些工作。
为你的服务器编辑config.yaml文件中的IP地址,你可以在config.yaml目录下运行以下命令快速替换:
$ sed -i.bak s/192.168.206.130/172.16.150.12/g config.yaml
译者备注:sed将把config.yaml文件中所有的192.168.206.130替换为172.16.150.12,生成一份新的config.yaml,老的文件自动备份为config.yaml.bak。
使用root身份运行脚本:
# ./keystone-init.py config.yaml
手动配置
这里我们可以无需脚本、手动配置这些步骤。首先我们创建一个默认tenant(租户),名字叫openstackDemo。
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
tenant-create \
--name openstackDemo \
--description "Default Tenant" \
--enabled true
创建名为adminUser的默认用户:
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-create \
--tenant_id b5815b046cfe47bb891a7b64119e7f80 \
--name adminUser \
--pass secretword --enabled true
译者备注:英文原文此处有误,命令创建的是adminUser,结果显示name的值为admin。
创建默认角色,admin与memberRole
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
role-create \
--name admin
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
role-create \
--name memberRole
通过uesr-role-add命令选项,在openstackDemo租户中为adminUser用户赋予admin的角色。
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-role-add \
--user a4c2d43f80a549a19864c89d759bb3fe \
--tenant_id b5815b046cfe47bb891a7b64119e7f80 \
--role e3d9d157cc95410ea45d23bbbc2e5c10
这条命令没有输出。
创建一个服务租户,这个租户中包括我们已知的所有服务的服务目录。
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
tenant-create \
--name service \
--description "Service Tenant" \
--enabled true
在Service租户中创建Glance Service用户,我们将在Keystone服务目录中为所有的服务都添加这样的用户。
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-create \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--name glance \
--pass glance \
--enabled true
在service租户中为用户glance分配admin的角色。
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-role-add \
--user 46b2667a7807483d983e0b4037a1623b \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--role e3d9d157cc95410ea45d23bbbc2e5c10
这个命令没有输出。
在Service租户中创建一个Nova Service用户:
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-create \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--name nova \
--pass nova \
--enabled true
在service租户中为nova用户分配admin的角色。
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-role-add \
--user 54b3776a8707834d983e0b4037b1345c \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--role e3d9d157cc95410ea45d23bbbc2e5c10
这条命令没有输出。
在Service租户中创建EC2 Service用户:
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-create \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--name ec2 \
--pass ec2 \
--enabled true
在service租户中为ec2用户分配admin的角色:
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-role-add \
--user 32e7668b8707834d983e0b4037b1345c \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--role e3d9d157cc95410ea45d23bbbc2e5c10
这条命令没有输出。
在Service租户中创建Object Storage服务用户:
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-create \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--name swift \
--pass swiftpass \
--enabled true
在service租户中为swift用户分配admin的角色:
$keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0 \
user-role-add \
--user 4346677b8909823e389f0b4037b1246e \
--tenant_id eb7e0c10a99446cfa14c244374549e9d \
--role e3d9d157cc95410ea45d23bbbc2e5c10
这条命令没有输出。
后面我们还需要创建服务的定义。
为了使Keystone内置的S3 API与Swift兼容,请确保在keystone.conf文件中定义一个新的过滤器并启用:
定义过滤:
[filter:s3_extension]
paste.filter_factory = keystone.contrib.s3:S3Extension.factory
更新admin_api管道:
将
[pipeline:admin_api]
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension crud_extension admin_service
更改为:
[pipeline:admin_api]
pipeline = token_auth admin_token_auth xml_body json_body debug ec2_extension s3_extension crud_extension admin_service
2.3.定义服务
Keystone还担任着服务编录的角色,为其他的OpenStack系统指定哪里有相关的API终端位置。尤其是OpenStack的控制面板(Dashborad)更需要这个编录的服务。
译者备注:Keystone的服务编录类似于注册表,在这里我们把OpenStack所有服务的endpoint(终端)写入服务编录中,服务之间的调用需要经过Keystone的验证,并通过这个服务编录找到目标服务的终端(endpoint)位置。
使用keystone定义服务的方式有两种:
使用模版文件的方式因为其比较简单,但除非是像DevStack这样的开发环境否则我们并不推荐使用这种模式。使用模版文件不支持通过keystone命令对服务编录执行CRUD操作,但不妨碍你使用service-list命令。而后端数据库则是一种更可靠的、高可用、提供数据冗余的方式。这节我们将描述如何使用后端数据库架构服务编录,你需要将/etc/keystone/keystone.conf文件中的[catalog]选项修改为如下这种配置:
[catalog]
driver = keystone.catalog.backends.sql.Catalog
Keystone服务编录条目的要素
对于目录中的每个服务条目,你都需要执行两个keystone操作:
1).使用keystone service-create命令为服务创建数据库条目,命令选项如下:
--name 服务名称(如:nova,ec2,glance,keystone)
--type 服务类型(如:compute,ec2,image,idnetity)
--description 服务描述(如:"Nova Compute Servece”)
2).使用keystone endpoint-create命令创建数据库条目,描述客户端如果连接不同类型的服务,即指定各个服务的终端位置,命令选项如下:
--region 你为OpenStack云取的区域名称(如:RegionOne)
--service_id 通过keystone service-create命令返回的服务ID(如:935fd37b6fa74b2f9fba6d907fa95825)
--publicurl 服务终端(endpoint)对公网提供的URL(如:http://192.168.206.130:9292/v1或http://192.168.202.130:8774/v2%(tenat_id)s)
--internalurl 服务终端对内提供的URL(典型案例是使用与publicurl相同的值)
--adminurl 提供服务管理界面的URL
Keystone允许URL使用变量,这些变量在运行期间会自动替换为正确的,例如使用类似于tenant_id这样的变量。你可以使用%(变量名)或$(变量名)标识正在使用变量。
创建keystone服务与服务终端(service endpoints)
这里我们会定义服务及其终端。
定义Identity服务:
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=keystone \
--type=identity \
--description="Keystone Identity Service"
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=15c11a23667e427e91bc31335b45f4bd \
--publicurl=http://192.168.206.130:5000/v2.0 \
--internalurl=http://192.168.206.130:5000/v2.0 \
--adminurl=http://192.168.206.130:35357/v2.0
定义Compute服务,需要为不同的租户(tenant)需要独立的endpoint,这里我们使用上节创建的service租户(tenant)。
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=nova \
--type=compute \
--description="Nova Compute Service"
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=abc0f03c02904c24abdcc3b7910e2eed \
--publicurl='http://192.168.206.130:8774/v2/%(tenant_id)s' \
--internalurl='http://192.168.206.130:8774/v2/%(tenant_id)s' \
--adminurl='http://192.168.206.130:8774/v2/%(tenant_id)s'
定义卷(Volume)服务,不同的tenant需要独立的endpoint:
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=volume \
--type=volume \
--description="Nova Volume Service"
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=1ff4ece13c3e48d8a6461faebd9cd38f \
--publicurl='http://192.168.206.130:8776/v1/%(tenant_id)s' \
--internalurl='http://192.168.206.130:8776/v1/%(tenant_id)s' \
--adminurl='http://192.168.206.130:8776/v1/%(tenant_id)s'
定义镜像服务(Image service):
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=glance \
--type=image \
--description="Glance Image Service"
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=7d5258c490144c8c92505267785327c1 \
--publicurl=http://192.168.206.130:9292/v1 \
--internalurl=http://192.168.206.130:9292/v1 \
--adminurl=http://192.168.206.130:9292/v1
定义EC2兼容服务:
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=ec2 \
--type=ec2 \
--description="EC2 Compatibility Layer"
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=181cdad1d1264387bcc411e1c6a6a5fd \
--publicurl=http://192.168.206.130:8773/services/Cloud \
--internalurl=http://192.168.206.130:8773/services/Cloud \
--adminurl=http://192.168.206.130:8773/services/Admin
定义Object Storage服务:
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
service-create \
--name=swift \
--type=object-store \
--description="Object Storage Service"
$ keystone --token 012345SECRET99TOKEN012345 \
--endpoint http://192.168.206.130:35357/v2.0/ \
endpoint-create \
--region RegionOne \
--service_id=272efad2d1234376cbb911c1e5a5a6ed \
--publicurl 'http://127.0.0.1:8080/v1/AUTH_%(tenant_id)s' \
--adminurl 'http://127.0.0.1:8080/' \
--internalurl 'http://127.0.0.1:8080/v1/AUTH_%(tenant_id)s'
Keystone的日志文件为/var/log/keystone.log,如果需要排除可以查看该文件。
三、验证
安装curl,一个运行REST API请求的命令行工具,同时还需要安装openssl,通过yum安装可以解决依赖包问题:
# yum install curl openssl
你可以运行如下命令,确保你的Identity服务可以正常工作:
curl -d '{"auth": {"tenantName": "adminTenant", "passwordCredentials":{"username": "adminUser", "password": "secretword"}}}' \
-H "Content-type:application/json" http://192.168.206.130:35357/v2.0/tokens | python -mjson.tool
作为adminUser用户,你将收到如下响应:
{
"access": {
"serviceCatalog": {},
"token": {
"expires": "2012-04-12T00:40:12Z",
"id": "cec68088d08747639c682ee5228106d1"
},
"user": {
"id": "6b0141904f09480d810a5949d79ea0f3",
"name": "adminUser",
"roles": [],
"roles_links": [],
"username": "adminUser"
}
}
}
或者你可以运行以下命令:
curl -d '{"auth": {"tenantName": "openstackDemo", "passwordCredentials":{"username": "adminUser", "password": "secretword"}}}' \
-H "Content-type:application/json" http://192.168.206.130:35357/v2.0/tokens | python -mjson.tool
你会收到类似于如下的信息:
{
"access": {
"serviceCatalog": {},
"token": {
"expires": "2012-04-12T00:41:21Z",
"id": "a220bfdf313b404fa5e063fcc7cc1f3e",
"tenant": {
"description": "Default Tenant",
"enabled": true,
"id": "50af8cc655c24ada96f73010c96b70a2",
"name": "openstackDemo"
}
},
"user": {
"id": "6b0141904f09480d810a5949d79ea0f3",
"name": "adminUser",
"roles": [],
"roles_links": [],
"username": "adminUser"
}
}
}
这里另外还有一种快速的方法判断Keystone是否工作正常。首先,需要设置如下环境变量:
export ADMIN_TOKEN=012345SECRET99TOKEN012345
export OS_USERNAME=adminUser
export OS_PASSWORD=secretword
export OS_TENANT_NAME=openstackDemo
export OS_AUTH_URL=http://127.0.0.1:5000/v2.0/
通过输入keystone user-list命令,你可以看到用户列表。
$ keystone user-list
未完待续… …
转载时请务必以超链接形式标明出处,丁丁历险博客:http://manual.blog.51cto.com/3300438/973921