跳转到: 导航, 搜索

Swift/DevstackSetupForKeystoneV3

使用 Keystone V3 API 设置 devstack 运行 Swift

安装 devstack

关于 devstack 一体化安装的说明请参见:http://devstack.org/guides/single-machine.html

按照该页面中的描述编辑 devstack/local.conf。

在运行 stack.sh 之前,还需要进行一些配置更改。

1. 如果您的环境中存在代理设置,请务必为本地地址范围设置 no_proxy,例如:

 export no_proxy=192.168.58.0/8,localhost,127.0.0.0/8,.localdomain

(将 192.168.58.0 替换为您的 VM 子网)

2. 启用 Swift 在 devstack 中运行

默认情况下,devstack 不运行 Swift,因此在 Swift 部分将一行添加到 devstack/local.conf

 enable_service s-proxy s-object s-container s-account

(请参见 http://devstack.org/configuration.html)

3. 启用 Keystone V3 API 以供 Swift 的身份验证中间件使用

将行添加到 devstack/lib/swift 中,在以注释“# Configure Keystone”开头的部分

 iniset ${SWIFT_CONFIG_PROXY_SERVER} filter:authtoken auth_version v3.0

(撰写本文时,这位于 devstack/lib/swift 的第 369 行)

4. 配置 Keystone 使用 UUID 令牌而不是 PKI - 这可能不是必需的,但可以避免由于大型 PKI 令牌超过 Swift 的默认最大标头大小而引起的问题。

通过添加一行来设置默认 KEYSTONE_TOKEN_FORMAT,编辑 devstack/lib/keystone

# Select Keystone's token format
# Choose from 'UUID', 'PKI', or 'PKIZ'
# INSERT THIS LINE...
 KEYSTONE_TOKEN_FORMAT=${KEYSTONE_TOKEN_FORMAT:-UUID}
 KEYSTONE_TOKEN_FORMAT=$(echo ${KEYSTONE_TOKEN_FORMAT} | tr '[:upper:]' '[:lower:]')

(撰写本文时,这位于 devstack/lib/keystone 的第 67 行)


现在运行 devstack

$ cd devstack
$ ./stack.sh

在提示时输入 SERVICE_TOKEN 密码(以下示例假定为“ADMIN”)。

在 devstack 运行时,检查 /etc/swift/proxy-server.conf 中的 [filter:authtoken] 部分,以验证 auth_version = v3.0 是否已设置。

安装 openstackclient

openstackclient 将用于在非默认 Keystone 域中设置用户和项目 - keystoneclient CLI 不支持非默认域。

在客户端机器上

$ git clone https://github.com/openstack/python-openstackclient.git openstackclient
$ cd openstackclient
[ may be needed: $ sudo pip install -r requirements.txt ]
$ sudo python setup.py install
$ cd ..

openstack 客户端命令行帮助在这里:https://wiki.openstack.org/wiki/OpenStackClient/Commands

使用 openstackclient 创建域、用户和项目

keystone-v3-setup.sh 脚本将执行以下步骤:https://gist.github.com/alistairncoles/ae9d5f92063b58afeb88#file-keystone-v3-setup-sh

注意:在以下示例中,将“u132.localdomain”替换为您的 devstack 主机名/IP 地址,并将“ADMIN”替换为您在运行 stack.sh 时输入的 SERVICE_TOKEN 密码

创建一个名为 d1 的域(注意使用 --os-url 和 --os-token 来管理 keystone)

$ openstack --os-url http://u132.localdomain:5000/v3 --os-identity-api-version 3 --os-token=ADMIN domain create d1
+---------+----------------------------------------------------------------------------------------+
| Field   | Value                                                                                  | 
+---------+----------------------------------------------------------------------------------------+
| enabled | True                                                                                   |
| id      | b91b1a2be2784448a44f82ed1feafef8                                                       |
| links   | {u'self': u'http://u132.localdomain:5000/v3/domains/b91b1a2be2784448a44f82ed1feafef8'} |
| name    | d1                                                                                     |
+---------+----------------------------------------------------------------------------------------+

在域 d1 中创建一个名为 p1 的项目

$ openstack --os-url http://u132.localdomain:5000/v3 --os-identity-api-version 3 --os-token=ADMIN project create p1 --domain d1
+-------------+-----------------------------------------------------------------------------------------+
| Field       | Value                                                                                   |
+-------------+-----------------------------------------------------------------------------------------+
| description |                                                                                         |
| domain_id   | b91b1a2be2784448a44f82ed1feafef8                                                        |
| enabled     | True                                                                                    |
| id          | 3a64e71a64a84c4796b93b109cd2b5ba                                                        |
| links       | {u'self': u'http://u132.localdomain:5000/v3/projects/3a64e71a64a84c4796b93b109cd2b5ba'} |
| name        | p1                                                                                      |
+-------------+-----------------------------------------------------------------------------------------+


在域 d1 中创建一个名为 u1 的用户

$ openstack --os-url http://u132.localdomain:5000/v3 --os-identity-api-version 3 --os-token=ADMIN user create u1 --domain d1 --password testing
+-----------+--------------------------------------------------------------------------------------+
| Field     | Value                                                                                |
+-----------+--------------------------------------------------------------------------------------+
| domain_id | b91b1a2be2784448a44f82ed1feafef8                                                     |
| enabled   | True                                                                                 |
| id        | f227284da36849a39b29db3798d00979                                                     |
| links     | {u'self': u'http://u132.localdomain:5000/v3/users/f227284da36849a39b29db3798d00979'} |
| name      | u1                                                                                   |
+-----------+--------------------------------------------------------------------------------------+

创建一个名为 admin 的角色(注意,使用“admin”角色,因为 devstack 没有在 swift-proxy-server.conf 中配置“swiftoperator”角色)

$ openstack --os-url http://u132.localdomain:5000/v3 --os-identity-api-version 3 --os-token=ADMIN role create admin
+-------+--------------------------------------------------------------------------------------+
| Field | Value                                                                                |
+-------+--------------------------------------------------------------------------------------+
| id    | 587f0885f6174436bd1cd5b0862324b2                                                     |
| links | {u'self': u'http://u132.localdomain:5000/v3/roles/587f0885f6174436bd1cd5b0862324b2'} |
| name  | admin                                                                                |
+-------+--------------------------------------------------------------------------------------+

将用户 u1 分配到项目 p1 上的 admin 角色

$ openstack --os-url http://u132.localdomain:5000/v3 --os-identity-api-version 3 --os-token=ADMIN role add --user u1 --project p1 admin

这可能会返回一个错误,因为“admin”角色已经存在 - 请忽略

ERROR: cliff.app Conflict occurred attempting to store role. (IntegrityError) (1062, "Duplicate entry 'admin' for key 'ixu_role_name'") 'INSERT INTO role (id, name, extra) VALUES (%s, %s, %s)' ('342b7b9103ff4c1284b1926c6e2bcc2c', 'admin', '{}') (HTTP 409)

使用 swiftclient 创建账户

https://review.openstack.org/#/c/91788/ 补丁 swiftclient 以获得 keystone v3 支持。

统计账户 (注意 -V 3 选项和 auth url 末尾的 /v3)

$ swift --os-auth-url http://u132.localdomain:5000/v3 --os-username u1 --os-user-domain-name d1 --os-project-name p1 --os-project-domain-name d1 --os-password testing -V 3 stat
No handlers could be found for logger "keystoneclient.httpclient"
      Account: AUTH_3a64e71a64a84c4796b93b109cd2b5ba
   Containers: 0
      Objects: 0
        Bytes: 0
 Content-Type: text/plain; charset=utf-8
  X-Timestamp: 1406021227.61343
   X-Trans-Id: tx405d56d8da1a454492a58-0053ce2e6b 
X-Put-Timestamp: 1406021227.61343

创建一个容器

$ swift --os-auth-url http://u132.localdomain:5000/v3 --os-username u1 --os-user-domain-name d1 --os-project-name p1 --os-project-domain-name d1 --os-password testing -V 3 post c1
No handlers could be found for logger "keystoneclient.httpclient"

使用 swiftclient 列出账户容器

$ swift --os-auth-url http://u132.localdomain:5000/v3 --os-username u1 --os-user-domain-name d1 --os-project-name p1 --os-project-domain-name d1 --os-password testing -V 3 list
No handlers could be found for logger "keystoneclient.httpclient"
c1

您还可以使用 openstackclient 列出账户容器(注意:现在使用 --os-auth-url 和用户凭据)

$ openstack --os-auth-url http://u132.localdomain:5000/v3 --os-identity-api-version 3 --os-username u1 --os-user-domain-name d1 --os-project-name p1 --os-project-domain-name d1 --os-password testing container list
WARNING: keystoneclient.httpclient Failed to retrieve management_url from token
+------+
| Name |
+------+
| c1   |
+------+ list

在 Keystone 中创建 SAIO VM 的端点

一旦您拥有正在运行的 devstack(或任何 Keystone 实例),您可能希望将其用作 SAIO 实例的身份服务。为此,您需要在 Keystone 的服务目录中创建一个指向您的 SAIO 的端点(默认情况下,devstack 为 devstack swift 实例安装端点 - 我们将为 SAIO 添加另一个端点)。

注意:确保您的 SAIO 和 devstack 机器已时间同步:Keystone 生成的令牌将具有在 SAIO 的 swift 身份验证中间件中检查的到期时间。

首先,您可以列出现有的端点

注意:在以下示例中,将“u133.localdomain”替换为您的 devstack 主机名/IP 地址,并将“ADMIN”替换为您在运行 stack.sh 时输入的 SERVICE_TOKEN 密码

注意:示例使用 openstack 版本 0.4.0.78

$openstack --version
openstack 0.4.0.78
$ openstack --os-url http://u133.localdomain:5000/v3 --os-identity-api-version 3 --os-token=ADMIN endpoint list 
+----------------------------------+-----------+--------------+----------------+---------+-----------+-------------------------------------------------------+
| ID                               | Region    | Service Name | Service Type   | Enabled | Interface | URL                                                   | 
+----------------------------------+-----------+--------------+----------------+---------+-----------+-------------------------------------------------------+
<other services snipped>
| a859cc9ea3fa44d99e7dfedfa0bd835d | RegionOne | swift        | object-store   | True    | admin     | http://192.168.58.133:8080                            |
| d7aa041b33f845ca9916a26243f394a2 | RegionOne | swift        | object-store   | True    | internal  | http://192.168.58.133:8080/v1/AUTH_$(tenant_id)s      |
| de71171eaf80404da55239f28c765222 | RegionOne | swift        | object-store   | True    | public    | http://192.168.58.133:8080/v1/AUTH_$(tenant_id)s      |
+----------------------------------+-----------+--------------+----------------+---------+-----------+-------------------------------------------------------+

所有现有的端点都在 RegionOne 中 - 我们将在另一个区域(“MyRegion”)中创建一个新的端点,以便 swiftclient 可以根据区域选择端点。端点 url 使用特殊语法,以便 keystone 自动在 AUTH_ 部分之后插入租户 ID。

注意:将 saio-1.localdomain 替换为您的 SAIO 机器的主机名/IP。

$ openstack --os-url http://u133.localdomain:5000/v3 --os-token ADMIN endpoint create --region MyRegion object-store public 'http://saio-1.localdomain:8080/v1/AUTH_$(tenant_id)s' 
+--------------+----------------------------------------------------------------------------------------+
| Field        | Value                                                                                  | 
+--------------+----------------------------------------------------------------------------------------+
| enabled      | True                                                                                   |
| id           | a303fdceb8e145869dad2caef0cb7d6b                                                       |
| interface    | public                                                                                 |
| links        | {u'self': u'http://192.168.58.133:5000/v3/endpoints/a303fdceb8e145869dad2caef0cb7d6b'} |
| region       | MyRegion                                                                               |
| service_id   | a510395df29949f8b1531eb79e367924                                                       |
| service_name | swift                                                                                  |
| service_type | object-store                                                                           |
| url          | http://saio-1.localdomain:8080/v1/AUTH_$(tenant_id)s                                   | 
+--------------+----------------------------------------------------------------------------------------+

接下来,我们需要配置 swift 的 auth_token 中间件配置,以使用 devstack keystone 验证令牌。在 proxy-server.conf 中,您需要相对于 proxy-server.conf-sample 进行一些更改,以启用和配置使用 keystone 身份验证

[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk tempurl ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo proxy-logging proxy-server
[filter:authtoken]
log_level = DEBUG 
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
delay_auth_decision = true
auth_version = v3.0
auth_port = 35357
auth_host = u133.localdomain
auth_protocol = http
auth_uri = http://u133.localdomain:5000/v3
admin_tenant_name = service
admin_user = swift
admin_password = ADMIN
#admin_token = ADMIN                                                                                                                           
cache = swift.cache
include_service_catalog = False

重新启动 swift 代理服务器,并尝试统计一个账户

$ swift --os-auth-url http://u133.localdomain:5000/v3 --os-username u1 --os-user-domain-name d1 --os-project-name p1 --os-project-domain-name d1 --os-password testing -V 3 --os-region MyRegion stat
      Account: AUTH_05257da6eba143cd8af9d40bf5fcddc5
   Containers: 0
      Objects: 0
        Bytes: 0
 Content-Type: text/plain; charset=utf-8
  X-Timestamp: 1407862944.15104
   X-Trans-Id: txf62ec2664851468abbe61-0053ea489f
X-Put-Timestamp: 1407862944.15104

(您可能会发现您不需要在 swift 命令行中指定 --os-region - swift 解析 keystone 返回的目录并选择它找到的第一个对象存储端点,这可能恰好是您为 MyRegion 创建的端点)。