今天上午刚把Keystone装利索了,做了几个简单实验,因为实验室虚拟机紧张,也没拿别的机器去做测试,然后跑虚拟机的服务器又是个Windows Server,用起来不爽,自己机器和虚拟机不是一个网段的,ping都ping不同所以只能放弃别的实验了。
安装Keystone基本上很正常,按着官方的 OpenStack Installation Guide for Red Hat Enterprise Linux, CentOS, and Fedora – havana 在 CentOS6.5 上装没有遇到什么问题,唯一的问题就是设置了hostname为controller后,有几个设置操作涉及到这个controller,比如:
openstack-config --set /etc/keystone/keystone.conf \
sql connection mysql://keystone:KEYSTONE_DBPASS@controller/keystone
还有:
export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0
请各位看官们注意,如果你没有设置hosts的话,这里是必然会有问题的,我开始不知道怎么图样图森破居然丧心病狂的以为OpenStack是不是如此牛X,居然能用hostname直接访问,就像loaclhost?后来才想起来localhost也是在hostname里定义的……所以不要忘了在hosts文件里加这么一行:
192.168.0.1 controller
这样后面的操作才能正常啊。当然,你也可以在操作时都用127.0.0.1,不过用controller显然更加赏心悦目啊。
然后,每跑完命令都可以在MySQL里看一看,正常的来说,走完Manual的整个keystone部分后 table status 应该是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<
font
face
=
"Courier"
>
+
--
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
--
--
--
--
-
+
--
--
--
--
--
--
+
--
--
--
+
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
+
--
--
--
--
--
--
--
--
+
--
--
--
--
-
+
|
Name
|
Engine
|
Version
|
Row_format
|
Rows
|
Avg_row_length
|
Data_length
|
Max_data_length
|
Index_length
|
Data_free
|
Auto_increment
|
Create_time
|
Update_time
|
Check_time
|
Collation
|
Checksum
|
Create_options
|
Comment
|
+
--
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
--
--
--
--
-
+
--
--
--
--
--
--
+
--
--
--
+
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
+
--
--
--
--
--
--
--
--
+
--
--
--
--
-
+
|
credential
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
0
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
domain
|
InnoDB
|
10
|
Compact
|
1
|
16384
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
28
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
endpoint
|
InnoDB
|
10
|
Compact
|
3
|
5461
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
28
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
group
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
28
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
group_domain_metadata
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
28
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
group_project_metadata
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
28
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
migrate_version
|
MyISAM
|
10
|
Dynamic
|
1
|
104
|
104
|
281474976710655
|
4096
|
0
|
NULL
|
2014
-
01
-
13
21
:
11
:
26
|
2014
-
01
-
13
21
:
11
:
30
|
NULL
|
latin1_swedish_ci
|
NULL
|
|
|
|
policy
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
0
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
28
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
project
|
InnoDB
|
10
|
Compact
|
2
|
8192
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
28
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
role
|
InnoDB
|
10
|
Compact
|
2
|
8192
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
service
|
InnoDB
|
10
|
Compact
|
1
|
16384
|
16384
|
0
|
0
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
token
|
InnoDB
|
10
|
Compact
|
13
|
8822
|
114688
|
0
|
32768
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
trust
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
0
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
trust_role
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
0
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
user
|
InnoDB
|
10
|
Compact
|
1
|
16384
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
30
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
user_domain_metadata
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
user_group_membership
|
InnoDB
|
10
|
Compact
|
0
|
0
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
|
user_project_metadata
|
InnoDB
|
10
|
Compact
|
1
|
16384
|
16384
|
0
|
16384
|
11534336
|
NULL
|
2014
-
01
-
13
21
:
11
:
29
|
NULL
|
NULL
|
utf8_general_ci
|
NULL
|
|
|
+
--
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
--
--
--
--
-
+
--
--
--
--
--
--
+
--
--
--
+
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
+
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
+
--
--
--
--
--
--
--
--
+
--
--
--
--
-
+
<
/
font
>
|
你可以把表里面的值都翻出来看一看,与 kestone user-list 、 keystone tenant-list 什么的做个对比,可以看到 keystone 确实就是一直在搞数据库。然后假设你退出了(Verify 那一页的两个 unset),再登陆可以这样:keystone --os-username=admin --os-password=ADMIN_PASS \
--os-auth-url=http://controller:35357/v2.0 token-get
或者:keystone --os-username=admin --os-password=ADMIN_PASS \
--os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 token-get
不过最简单的:建立一个keystonerc,里面设置好:export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_TENANT_NAME=admin
export OS_AUTH_URL=http://controller:35357/v2.0
这样再登入只需要 source keystonerc 即可。
这时候可以说keystone已经装好了,我们可以拿keystone做些实验了,这里用curl调用API做些例子。
主要参考 http://docs.openstack.org/developer/keystone/api_curl_examples.html 。
比如看下API版本信息什么的:curl http://controller:5000/ | python -mjson.tool
这里5000是业务端口号(默认),把结果传给 python -mjson.tool 因为返回结果是个json,用mjson.tool处理下可以让结果更好看。比如我的刚装完的机器返回结果是这样的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
<
font
face
=
"Courier"
>
{
"versions"
:
{
"values"
:
[
{
"id"
:
"v3.0"
,
"links"
:
[
{
"href"
:
"http://localhost:5000/v3/"
,
"rel"
:
"self"
}
]
,
"media-types"
:
[
{
"base"
:
"application/json"
,
"type"
:
"application/vnd.openstack.identity-v3+json"
}
,
{
"base"
:
"application/xml"
,
"type"
:
"application/vnd.openstack.identity-v3+xml"
}
]
,
"status"
:
"stable"
,
"updated"
:
"2013-03-06T00:00:00Z"
}
,
{
"id"
:
"v2.0"
,
"links"
:
[
{
"href"
:
"http://localhost:5000/v2.0/"
,
"rel"
:
"self"
}
,
{
"href"
:
"http://docs.openstack.org/api/openstack-identity-service/2.0/content/"
,
"rel"
:
"describedby"
,
"type"
:
"text/html"
}
,
{
"href"
:
"http://docs.openstack.org/api/openstack-identity-service/2.0/identity-dev-guide-2.0.pdf"
,
"rel"
:
"describedby"
,
"type"
:
"application/pdf"
}
]
,
"media-types"
:
[
{
"base"
:
"application/json"
,
"type"
:
"application/vnd.openstack.identity-v2.0+json"
}
,
{
"base"
:
"application/xml"
,
"type"
:
"application/vnd.openstack.identity-v2.0+xml"
}
]
,
"status"
:
"stable"
,
"updated"
:
"2013-03-06T00:00:00Z"
}
]
}
}
<
/
font
>
|
再比如我们可以看看API扩展:curl http://controller:5000/v2.0/extensions | python -mjson.tool,结果很长,大家可以自己试试看。
之前的操作都不需要登陆,很简单,下面试个复杂的,需要传入数据的,比如登陆:
curl -d '{"auth":{"passwordCredentials":{"username": "admin", "password": "ADMIN_PASS"}}}' -H "Content-type: application/json" http://controller:35357/v2.0/tokens | python -mjson.tool
可以将上面的admin换成你想要登录的用户名,ADMIN_PASS换成登陆需要的密码。
返回结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<
font
face
=
"Courier"
>
{
"access"
:
{
"metadata"
:
{
"is_admin"
:
0
,
"roles"
:
[
]
}
,
"serviceCatalog"
:
[
]
,
"token"
:
{
"expires"
:
"2014-01-15T08:11:31Z"
,
"id"
:
"MIIC8QYJKoZIhvcNAQcCoIIC4jCCAt4CAQExCTAHBgUrDgMCGjCCAUcGCSqGSIb3DQEHAaCCATgEggE0eyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wMS0xNFQwNjoyNzoyMi41NzgyODUiLCAiZXhwaXJlcyI6ICIyMDE0LTAxLTE1VDA2OjI3OjIyWiIsICJpZCI6ICJwbGFjZWhvbGRlciJ9LCAic2VydmljZUNhdGFsb2ciOiBbXSwgInVzZXIiOiB7InVzZXJuYW1lIjogImFkbWluIiwgInJvbGVzX2xpbmtzIjogW10sICJpZCI6ICI5MzY4ZTUzMWZmZTA0YzNiOWYxNmYyNGE3MmFkMDdkYiIsICJyb2xlcyI6IFtdLCAibmFtZSI6ICJhZG1pbiJ9LCAibWV0YWRhdGEiOiB7ImlzX2FkbWluIjogMCwgInJvbGVzIjogW119fX0xggGBMIIBfQIBATBcMFcxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVVbnNldDEOMAwGA1UEBwwFVW5zZXQxDjAMBgNVBAoMBVVuc2V0MRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20CAQEwBwYFKw4DAhowDQYJKoZIhvcNAQEBBQAEggEAMbsOOnEEgJmfaImH1M1e2l2LQwtGZAccgrFhYqbjLFJw+s71nR5PMWvs8PcKkNnFHWmzjblwLU9ZJCiDUK+3+buGkvfjicUTXAGs0NTLzAXi2Aed5Ns62n8ifENX5j1aCASrng8fkUqrAkpWDm2aY569mHfrViI017kf1UWEyBCQxdm2pPZxcMBsiuePgOOYx3jpOkRb+CCV0XJ1NrADLyv6DNuFal9wu1NxfQUo0rTNwEuoZwhQ-FBF8XVHCxJQuEbYbliP8jYGpDox31C47tk-G+GTMerm4XLKol9884W8BqSzzUFBMUzXL5KtPjM0N3JevQ9flPPxbGu0f0CEfw=="
,
"issued_at"
:
"2014-01-14T08:11:31.804872"
}
,
"user"
:
{
"id"
:
"9368e531ffe04c3b9f16f24a72ad07db"
,
"name"
:
"admin"
,
"roles"
:
[
]
,
"roles_links"
:
[
]
,
"username"
:
"admin"
}
}
}
<
/
font
>
|
官方的文档生成的Token都很短用的是 UUID,很短,我们出来的这么长。是不是有问题?做个试验就知道了,下面的命令可以用来测试Token是否有效:
curl -H "X-Auth-Token:6c294e19cf461ffd5d0e" http://controller:35357/v2.0/tokens/MIIC8QYJKoZIhvcNAQcCoIIC4jCCAt4CAQExCTAHBgUrDgMCGjCCAUcGCSqGSIb3DQEHAaCCATgEggE0eyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wMS0xNFQwNzowOTowNi41Mjc4NzMiLCAiZXhwaXJlcyI6ICIyMDE0LTAxLTE1VDA3OjA5OjA2WiIsICJpZCI6ICJwbGFjZWhvbGRlciJ9LCAic2VydmljZUNhdGFsb2ciOiBbXSwgInVzZXIiOiB7InVzZXJuYW1lIjogImFkbWluIiwgInJvbGVzX2xpbmtzIjogW10sICJpZCI6ICI5MzY4ZTUzMWZmZTA0YzNiOWYxNmYyNGE3MmFkMDdkYiIsICJyb2xlcyI6IFtdLCAibmFtZSI6ICJhZG1pbiJ9LCAibWV0YWRhdGEiOiB7ImlzX2FkbWluIjogMCwgInJvbGVzIjogW119fX0xggGBMIIBfQIBATBcMFcxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVVbnNldDEOMAwGA1UEBwwFVW5zZXQxDjAMBgNVBAoMBVVuc2V0MRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20CAQEwBwYFKw4DAhowDQYJKoZIhvcNAQEBBQAEggEAkKi2MGtOXFkn15RxRCb6keWBkvluTWSNNl0C5wrmdLMRU2t3VOLgQOONXvq2iRrASmkBB7P5t5fBC--efg2wGX4xGOwbzVSniPI2rhmbDp+DVOjBI2MIfmFSZMIMDHE8FizH9yW6seFl+yTgz0S0TOWlQ9USqKH+9+pQFrsNPyDCQAj+QzbYric4wPRA8E-agfIPduPQc8xODBgIZU80B0Vs7CoTxfw8pKY+u8iPEgWYwpr1y2mokB7EinVHdxTDM377FVRcUtFWC2FXykY8FxuoiK0uwMehEl45GUlD71kLng3-tpVFgXv-mBw5ByoaZYx1oYNQfBDZftGjeep7eA== | python -mjson.tool
这里有同学可能已经懵了,后边那个是刚才取出来的token,那前边的6c294e19cf461ffd5d0e是神马?官方文档里为什么是个999888777666?我已开始也有这个疑问,就Google了下,在StackOverFlow上也有这个问题,问这是个神马Magic Number?回复非常好,其实这个是之前我们用openssl随机生成的(如果你完全按文档走的话),记得在3.2节里运行过一句 ADMIN_TOKEN=$(openssl rand -hex 10) 么?就是这个ADMIN_TOKEN,你可以在 /etc/keystone/keystone.conf 里看到这个数值:
1
2
|
[
DEFAULT
]
admin_token
=
6c294e19cf461ffd5d0e
|
如果token是有效的话应该可以返回这个:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<
font
face
=
"Courier"
>
{
"access"
:
{
"metadata"
:
{
"is_admin"
:
0
,
"roles"
:
[
]
}
,
"serviceCatalog"
:
[
]
,
"token"
:
{
"expires"
:
"2014-01-15T07:09:06Z"
,
"id"
:
"MIIC8QYJKoZIhvcNAQcCoIIC4jCCAt4CAQExCTAHBgUrDgMCGjCCAUcGCSqGSIb3DQEHAaCCATgEggE0eyJhY2Nlc3MiOiB7InRva2VuIjogeyJpc3N1ZWRfYXQiOiAiMjAxNC0wMS0xNFQwNzowOTowNi41Mjc4NzMiLCAiZXhwaXJlcyI6ICIyMDE0LTAxLTE1VDA3OjA5OjA2WiIsICJpZCI6ICJwbGFjZWhvbGRlciJ9LCAic2VydmljZUNhdGFsb2ciOiBbXSwgInVzZXIiOiB7InVzZXJuYW1lIjogImFkbWluIiwgInJvbGVzX2xpbmtzIjogW10sICJpZCI6ICI5MzY4ZTUzMWZmZTA0YzNiOWYxNmYyNGE3MmFkMDdkYiIsICJyb2xlcyI6IFtdLCAibmFtZSI6ICJhZG1pbiJ9LCAibWV0YWRhdGEiOiB7ImlzX2FkbWluIjogMCwgInJvbGVzIjogW119fX0xggGBMIIBfQIBATBcMFcxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVVbnNldDEOMAwGA1UEBwwFVW5zZXQxDjAMBgNVBAoMBVVuc2V0MRgwFgYDVQQDDA93d3cuZXhhbXBsZS5jb20CAQEwBwYFKw4DAhowDQYJKoZIhvcNAQEBBQAEggEAkKi2MGtOXFkn15RxRCb6keWBkvluTWSNNl0C5wrmdLMRU2t3VOLgQOONXvq2iRrASmkBB7P5t5fBC--efg2wGX4xGOwbzVSniPI2rhmbDp+DVOjBI2MIfmFSZMIMDHE8FizH9yW6seFl+yTgz0S0TOWlQ9USqKH+9+pQFrsNPyDCQAj+QzbYric4wPRA8E-agfIPduPQc8xODBgIZU80B0Vs7CoTxfw8pKY+u8iPEgWYwpr1y2mokB7EinVHdxTDM377FVRcUtFWC2FXykY8FxuoiK0uwMehEl45GUlD71kLng3-tpVFgXv-mBw5ByoaZYx1oYNQfBDZftGjeep7eA=="
,
"issued_at"
:
"2014-01-14T07:09:06.527873"
}
,
"user"
:
{
"id"
:
"9368e531ffe04c3b9f16f24a72ad07db"
,
"name"
:
"admin"
,
"roles"
:
[
]
,
"roles_links"
:
[
]
,
"username"
:
"admin"
}
}
}
<
/
font
>
|
不过你也可以试试别的方法比如:
curl -I -H "X-Auth-Token:YOUR_ADMIN_TOKEN" http://localhost:35357/v2.0/tokens/YOUR_LONG_LONG_TOKEN
成功的话效果理论上是返回200,但是我测试了两次都是204,效果如下:
1
2
3
4
5
6
|
<
font
face
=
"Courier"
>
HTTP
/
1.1
204
No
Content
Vary
:
X
-
Auth
-
Token
Content
-
Length
:
0
Date
:
Tue
,
14
Jan
2014
07
:
29
:
42
GMT
<
/
font
>
|
网上有人说返回码是20X即表示成功。但是根据我看launchpad上的bug928045报告指出,过去是20x或204,但现在已经修复成200了——“As part of bug 933587 (adding support for a HEAD call), all null content bodies will now be accompanied by a ’204 No Content’ instead of ’200 OK’”。而且还是很久以前就修复过了……
拿到taken后我们就可以做一些事情了,比如查看下endpoints什么的,不过貌似大多数操作还是不需要token的,具体可以看官方的 Service API Examples Using Curl 。