OpenStack APIs

要验证对 OpenStack 服务的访问,您必须首先使用包含凭据的负载向 OpenStack Identity 发出身份验证请求,以获取身份验证令牌。

凭据通常是您的用户名和密码的组合,以及云的项目名称或 ID(可选)。请向您的云管理员索取您的用户名、密码和项目,以便您可以生成身份验证令牌。或者,您可以提供令牌,而不是用户名和密码。

当您发送 API 请求时,您需要在 X-Auth-Token 头部包含令牌。如果您访问多个 OpenStack 服务,则必须为每个服务获取一个令牌。令牌在过期前有效的时间有限。令牌也可能因为其他原因而失效。例如,如果用户的角色发生更改,则该用户现有的令牌将不再有效。

身份验证和 API 请求流程

  1. 从您的云管理员提供的 Identity 端点请求身份验证令牌。在请求中发送包含凭据的负载,如 Authenticate 所示。如果请求成功,服务器将返回一个身份验证令牌。

  2. 发送 API 请求,并在 X-Auth-Token 头部包含令牌。继续使用该令牌发送 API 请求,直到服务完成请求或发生 Unauthorized (401) 错误。

  3. 如果发生 Unauthorized (401) 错误,请请求另一个令牌。

本节中的示例使用 cURL 命令。有关 cURL 的信息,请参阅 http://curl.haxx.se/。有关 OpenStack APIs 的信息,请参阅 Current API versions

Authenticate

用于身份验证的凭据负载包含以下参数

凭据参数

参数

类型

描述

User Domain(必需)

字符串

用户的域。

username(必需)

字符串

用户名。如果您未提供用户名和密码,则必须提供令牌。

password(必需)

字符串

用户的密码。

Project Domain(可选)

字符串

项目的域。这是 scope 对象的一部分。

Project Name(可选)

字符串

项目名称。Project IDProject Name 都是可选的。

Project ID(可选)

字符串

项目 ID。Project IDProject 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 GuideOpenStack Administrator GuideOpenStack 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