OpenStack APIs¶
要验证对 OpenStack 服务的访问,您必须首先使用包含凭据的负载向 OpenStack Identity 发出身份验证请求,以获取身份验证令牌。
凭据通常是您的用户名和密码的组合,以及云的项目名称或 ID(可选)。请向您的云管理员索取您的用户名、密码和项目,以便您可以生成身份验证令牌。或者,您可以提供令牌,而不是用户名和密码。
当您发送 API 请求时,您需要在 X-Auth-Token 头部包含令牌。如果您访问多个 OpenStack 服务,则必须为每个服务获取一个令牌。令牌在过期前有效的时间有限。令牌也可能因为其他原因而失效。例如,如果用户的角色发生更改,则该用户现有的令牌将不再有效。
身份验证和 API 请求流程¶
从您的云管理员提供的 Identity 端点请求身份验证令牌。在请求中发送包含凭据的负载,如 Authenticate 所示。如果请求成功,服务器将返回一个身份验证令牌。
发送 API 请求,并在
X-Auth-Token头部包含令牌。继续使用该令牌发送 API 请求,直到服务完成请求或发生 Unauthorized (401) 错误。如果发生 Unauthorized (401) 错误,请请求另一个令牌。
本节中的示例使用 cURL 命令。有关 cURL 的信息,请参阅 http://curl.haxx.se/。有关 OpenStack APIs 的信息,请参阅 Current API versions。
Authenticate¶
用于身份验证的凭据负载包含以下参数
参数 |
类型 |
描述 |
|---|---|---|
User Domain(必需) |
字符串 |
用户的域。 |
username(必需) |
字符串 |
用户名。如果您未提供用户名和密码,则必须提供令牌。 |
password(必需) |
字符串 |
用户的密码。 |
Project Domain(可选) |
字符串 |
项目的域。这是 scope 对象的一部分。 |
Project Name(可选) |
字符串 |
项目名称。Project ID 和 Project Name 都是可选的。 |
Project ID(可选) |
字符串 |
项目 ID。Project ID 和 Project Name 都是可选的。但是,其中一个与 Project Domain 一起是必需的。它们被封装在一个 scope 对象中。如果您不知道项目名称或 ID,请发送不包含任何 scope 对象的请求。 |
在典型的 OpenStack 部署中,您可以指定项目名称、用户名和密码凭据进行身份验证。
首先,将您的项目名称导出到 OS_PROJECT_NAME 环境变量,将您的项目域名称导出到 OS_PROJECT_DOMAIN_NAME 环境变量,将您的用户名导出到 OS_USERNAME 环境变量,将您的密码导出到 OS_PASSWORD 环境变量,并将您的用户域名称导出到 OS_USER_DOMAIN_NAME 环境变量。
下面的示例使用来自 Ocata 安装的端点,并遵循安装指南。但是,您也可以根据需要将 $OS_AUTH_URL 作为环境变量使用来更改 URL。
然后,运行此 cURL 命令请求令牌
$ curl -v -s -X POST $OS_AUTH_URL/auth/tokens?nocatalog -H "Content-Type: application/json" -d '{ "auth": { "identity": { "methods": ["password"],"password": {"user": {"domain": {"name": "'"$OS_USER_DOMAIN_NAME"'"},"name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'"} } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name": "'"$OS_PROJECT_NAME"'" } } }}' \
| python -m json.tool
如果请求成功,它将返回 Created (201) 响应代码,以及响应头中的 X-Subject-Token 中的令牌值。头部后面是一个响应体,其中包含一个类型为 token 的对象,该对象以 "expires_at":"datetime" 的形式包含令牌的过期日期和时间,以及其他属性。
以下示例显示了一个成功的响应
* Trying 192.168.56.101...
* Connected to controller (192.168.56.101) port 5000 (#0)
> POST /v3/auth/tokens?nocatalog HTTP/1.1
> Host: controller:5000
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 226
>
} [226 bytes data]
* upload completely sent off: 226 out of 226 bytes
< HTTP/1.1 201 Created
< Date: Fri, 26 May 2017 06:48:58 GMT
< Server: Apache/2.4.18 (Ubuntu)
< X-Subject-Token: gAAAAABZJ8_a7aiq1SnOhbNw8vFb5WZChcvWdzzUAFzhiB99BHrjdSGai--_-JstU3WazsFXmRHNbD07qOQKTp5Sen2R_b9csaDkU49VXqSaJ0jh2nAlwJkys8aazz2oa3xSeUVe3Ndv_HRiW23-iWTr6jquK_AXdhRX7nvM4lmVTrxXFpelnJQ
< Vary: X-Auth-Token
< X-Distribution: Ubuntu
< x-openstack-request-id: req-0e9239ec-104b-40e0-a337-dca91fb24387
< Content-Length: 521
< Content-Type: application/json
<
{ [521 bytes data]
* Connection #0 to host controller left intact
{
"token": {
"audit_ids": [
"HOGlhnMFT52xY7PjbuJZlA"
],
"expires_at": "2017-05-26T07:48:58.000000Z",
"is_domain": false,
"issued_at": "2017-05-26T06:48:58.000000Z",
"methods": [
"password"
],
"project": {
"domain": {
"id": "default",
"name": "Default"
},
"id": "05ef0bf2a79c42b2b8155873b6404061",
"name": "demo"
},
"roles": [
{
"id": "b18239b7026042ef8695c3c4cf10607b",
"name": "user"
}
],
"user": {
"domain": {
"id": "default",
"name": "Default"
},
"id": "12846256e60c42f88d0e1ba9711a57f5",
"name": "demo",
"password_expires_at": null
}
}
}
注意
在上面的请求中,查询字符串 nocatalog 用于您只想获取令牌,并且不希望服务目录(如果用户可用)弄乱输出。如果用户想要获取服务目录,则不需要将此查询字符串附加到 URL。
发送 API 请求¶
本节展示了如何进行一些基本的 Compute API 调用。有关完整的 Compute API 调用列表,请参阅 Compute API。
将令牌 ID 导出到 OS_TOKEN 环境变量。例如
export OS_TOKEN=gAAAAABZJ8_a7aiq1SnOhbNw8vFb5WZChcvWdzzUAFzhiB99BHrjdSGai--_-JstU3WazsFXmRHNbD07qOQKTp5Sen2R_b9csaDkU49VXqSaJ0jh2nAlwJkys8aazz2oa3xSeUVe3Ndv_HRiW23-iWTr6jquK_AXdhRX7nvM4lmVTrxXFpelnJQ
默认情况下,令牌每小时过期一次,尽管可以配置不同的设置 - 请参阅 Identity Service Configuration Guide 中的 expiration 选项。
将项目名称导出到 OS_PROJECT_NAME 环境变量。例如
export OS_PROJECT_NAME=demo
然后,使用 Compute API 列出风味,将 Compute API 端点替换为包含您的项目 ID 的端点
$ curl -s -H "X-Auth-Token: $OS_TOKEN" \
$OS_COMPUTE_API/flavors \
| python -m json.tool
{
"flavors": [
{
"id": "1",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/1",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/1",
"rel": "bookmark"
}
],
"name": "m1.tiny"
},
{
"id": "2",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/2",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/2",
"rel": "bookmark"
}
],
"name": "m1.small"
},
{
"id": "3",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/3",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/3",
"rel": "bookmark"
}
],
"name": "m1.medium"
},
{
"id": "4",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/4",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/4",
"rel": "bookmark"
}
],
"name": "m1.large"
},
{
"id": "5",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/flavors/5",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/flavors/5",
"rel": "bookmark"
}
],
"name": "m1.xlarge"
}
]
}
从令牌调用中导出 $OS_PROJECT_ID,然后使用 Compute API 列出镜像
$ curl -s -H "X-Auth-Token: $OS_TOKEN" \
http://8.21.28.222:8774/v2/$OS_PROJECT_ID/images \
| python -m json.tool
{
"images": [
{
"id": "2dadcc7b-3690-4a1d-97ce-011c55426477",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/2dadcc7b-3690-4a1d-97ce-011c55426477",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/2dadcc7b-3690-4a1d-97ce-011c55426477",
"rel": "bookmark"
},
{
"href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/2dadcc7b-3690-4a1d-97ce-011c55426477",
"type": "application/vnd.openstack.image",
"rel": "alternate"
}
],
"name": "Fedora 21 x86_64"
},
{
"id": "cfba3478-8645-4bc8-97e8-707b9f41b14e",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/cfba3478-8645-4bc8-97e8-707b9f41b14e",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/cfba3478-8645-4bc8-97e8-707b9f41b14e",
"rel": "bookmark"
},
{
"href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/cfba3478-8645-4bc8-97e8-707b9f41b14e",
"type": "application/vnd.openstack.image",
"rel": "alternate"
}
],
"name": "Ubuntu 14.04 amd64"
},
{
"id": "2e4c08a9-0ecd-4541-8a45-838479a88552",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/2e4c08a9-0ecd-4541-8a45-838479a88552",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/2e4c08a9-0ecd-4541-8a45-838479a88552",
"rel": "bookmark"
},
{
"href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/2e4c08a9-0ecd-4541-8a45-838479a88552",
"type": "application/vnd.openstack.image",
"rel": "alternate"
}
],
"name": "CentOS 7 x86_64"
},
{
"id": "c8dd9096-60c1-4e23-a486-82955481df9f",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/c8dd9096-60c1-4e23-a486-82955481df9f",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/c8dd9096-60c1-4e23-a486-82955481df9f",
"rel": "bookmark"
},
{
"href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/c8dd9096-60c1-4e23-a486-82955481df9f",
"type": "application/vnd.openstack.image",
"rel": "alternate"
}
],
"name": "CentOS 6.5 x86_64"
},
{
"id": "f97b8d36-935e-4666-9c58-8a0afc6d3796",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f9828a18c6484624b571e85728780ba8/images/f97b8d36-935e-4666-9c58-8a0afc6d3796",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f9828a18c6484624b571e85728780ba8/images/f97b8d36-935e-4666-9c58-8a0afc6d3796",
"rel": "bookmark"
},
{
"href": "http://8.21.28.222:9292/f9828a18c6484624b571e85728780ba8/images/f97b8d36-935e-4666-9c58-8a0afc6d3796",
"type": "application/vnd.openstack.image",
"rel": "alternate"
}
],
"name": "Fedora 20 x86_64"
}
]
}
从令牌调用中导出 $OS_PROJECT_ID,然后使用 Compute API 列出服务器
$ curl -s -H "X-Auth-Token: $OS_TOKEN" \
http://8.21.28.222:8774/v2/$OS_PROJECT_ID/servers \
| python -m json.tool
{
"servers": [
{
"id": "41551256-abd6-402c-835b-e87e559b2249",
"links": [
{
"href": "http://8.21.28.222:8774/v2/f8828a18c6484624b571e85728780ba8/servers/41551256-abd6-402c-835b-e87e559b2249",
"rel": "self"
},
{
"href": "http://8.21.28.222:8774/f8828a18c6484624b571e85728780ba8/servers/41551256-abd6-402c-835b-e87e559b2249",
"rel": "bookmark"
}
],
"name": "test-server"
}
]
}
OpenStack 命令行客户端¶
对于脚本工作和简单的请求,您可以使用像 openstack-client 这样的命令行客户端。此客户端使您能够通过命令行界面使用 Identity、Compute、Block Storage 和 Object Storage APIs。
有关命令行客户端的信息,请参阅 OpenStack Command-Line Interface Reference。
安装客户端¶
使用 pip 在 Mac OS X 或 Linux 系统上安装 OpenStack 客户端。它很容易,并确保您从 Python Package Index 获取客户端的最新版本。此外,pip 允许您更新或删除软件包。
您必须为每个项目单独安装客户端,但 python-openstackclient 涵盖多个项目。
安装或更新客户端软件包
$ sudo pip install [--upgrade] python-PROJECTclient
其中 PROJECT 是项目名称。
例如,安装 openstack 客户端
$ sudo pip install python-openstackclient
要更新 openstack 客户端,请运行此命令
$ sudo pip install --upgrade python-openstackclient
要删除 openstack 客户端,请运行此命令
$ sudo pip uninstall python-openstackclient
在您发出客户端命令之前,您必须下载并 source openrc 文件以设置环境变量。
有关 OpenStack 客户端的完整信息,包括如何 source openrc 文件,请参阅 OpenStack End User Guide、OpenStack Administrator Guide 和 OpenStack Command-Line Interface Reference。
启动实例¶
要启动实例,您必须选择实例的名称、镜像和风味。
要列出可用的镜像,请通过 openstack 客户端调用 Compute API
$ openstack image list
+--------------------------------------+------------------+
| ID | Name |
+--------------------------------------+------------------+
| a5604931-af06-4512-8046-d43aabf272d3 | fedora-20.x86_64 |
+--------------------------------------+------------------+
要列出风味,请运行此命令
$ openstack flavor list
+----+-----------+-----------+------+-----------+------+-------+-----------+
| ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | Is_Public |
+----+-----------+-----------+------+-----------+------+-------+-----------+
| 1 | m1.tiny | 512 | 0 | 0 | | 1 | True |
| 2 | m1.small | 2048 | 20 | 0 | | 1 | True |
| 3 | m1.medium | 4096 | 40 | 0 | | 2 | True |
| 4 | m1.large | 8192 | 80 | 0 | | 4 | True |
| 42 | m1.nano | 64 | 0 | 0 | | 1 | True |
| 5 | m1.xlarge | 16384 | 160 | 0 | | 8 | True |
| 84 | m1.micro | 128 | 0 | 0 | | 1 | True |
+----+-----------+-----------+------+-----------+------+-------+-----------+
要启动实例,请记下所需的镜像和风味的 ID。
要启动 my_instance 实例,请使用镜像和风味 ID 以及服务器名称运行 openstack server create 命令
$ openstack server create --image a5604931-af06-4512-8046-d43aabf272d3 --flavor 1 my_instance
+--------------------------------------+---------------------------------------------------------+
| Field | Value |
+--------------------------------------+---------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL |
| OS-EXT-AZ:availability_zone | nova |
| OS-EXT-STS:power_state | 0 |
| OS-EXT-STS:task_state | scheduling |
| OS-EXT-STS:vm_state | building |
| OS-SRV-USG:launched_at | None |
| OS-SRV-USG:terminated_at | None |
| accessIPv4 | |
| accessIPv6 | |
| addresses | |
| adminPass | 3vgzpLzChoac |
| config_drive | |
| created | 2015-08-27T03:02:27Z |
| flavor | m1.tiny (1) |
| hostId | |
| id | 1553694c-d711-4954-9b20-84b8cb4598c6 |
| image | fedora-20.x86_64 (a5604931-af06-4512-8046-d43aabf272d3) |
| key_name | None |
| name | my_instance |
| os-extended-volumes:volumes_attached | [] |
| progress | 0 |
| project_id | 9f0e4aa4fd3d4b0ea3184c0fe7a32210 |
| properties | |
| security_groups | [{u'name': u'default'}] |
| status | BUILD |
| updated | 2015-08-27T03:02:28Z |
| user_id | b3ce0cfc170641e98ff5e42b1be9c85a |
+--------------------------------------+---------------------------------------------------------+
注意
有关 OpenStack 组件使用的默认端口的信息,请参阅 OpenStack Installation Guide 中的 Firewalls and default ports。