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 创建的端点)。