swift使用ResellerAdmin角色来设置account的quota

env

  • 系统:Ubuntu Server 16.04×64
  • 存储设置:4T
  • 架构部署:
主机名 IP 作用
keystone 192.168.100.50 keystone node
Proxy 192.168.100.50/192.168.0.50 代理节点
object1 192.168.100.105 存储节点1(zone1)
object2 192.168.100.106 存储节点2(zone1)
object3 192.168.100.107 存储节点3(zone1)
object4 192.168.100.107 存储节点4(zone1)

注意

step

配置 proxy-swift.conf

要把 swift proxy 节点的 reseller_admin_role = ResellerAdmin 打开注释,重启服务

root@controller:~# grep ResellerAdmin -rn /etc/swift/proxy-server.conf  
417:reseller_admin_role = ResellerAdmin
root@controller:~# service swift-proxy restart
root@controller:~#

创建新环境

创建新的project, user, role 来实验

准备语句:

openstack project create --description "testTenant" testreseller --domain default    
openstack user create --project testreseller --password openstack testreseller 
openstack role create reseller
openstack role add --user testreseller --project testreseller reseller
openstack role add --user testreseller --project testreseller ResellerAdmin

开始吧

root@controller:~# openstack project create   --description "testTenant" testreseller \
>   --domain default
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | testTenant                       |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 3320a273a7094d789f99756b0e9d0f4f |
| is_domain   | False                            |
| name        | testreseller                     |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+
root@controller:~# openstack project list
+----------------------------------+--------------+
| ID                               | Name         |
+----------------------------------+--------------+
| 3320a273a7094d789f99756b0e9d0f4f | testreseller |
| 7d6eaa90d74a4f239963933c3a744df3 | demo         |
| a640c74e595c44c4902d1c5ebc3afa8a | service      |
| f04ec0abf3d1460dad82608bb03af589 | admin        |
+----------------------------------+--------------+ 
root@controller:~# openstack user create --project testreseller --password openstack testreseller
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | 3320a273a7094d789f99756b0e9d0f4f |
| domain_id           | default                          |
| enabled             | True                             |
| id                  | c83158ab5c3348ab9d148673c23903be |
| name                | testreseller                     |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+ 
root@controller:~# openstack role create reseller
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 09d4fdc0e9544f509c599cd62ab40e6c |
| name      | reseller                         |
+-----------+----------------------------------+ 
root@controller:~# openstack role add --user testreseller --project testreseller reseller
root@controller:~#

创建 ResellerAdmin ,把新用户 testreseller 赋予这个role

root@controller:~# openstack role create ResellerAdmin
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 1671364ac7a945e5ae164e100de2c366 |
| name      | ResellerAdmin                    |
+-----------+----------------------------------+
root@controller:~# openstack role add --user testreseller --project testreseller ResellerAdmin
root@controller:~#

验证一下,是否 ResellerAdmin 加上了

root@controller:~# cat admin-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
root@controller:~# 
root@controller:~# . admin-openrc 
root@controller:~# openstack role assignment list --role ResellerAdmin
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| Role                             | User                             | Group | Project                          | Domain | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| 1671364ac7a945e5ae164e100de2c366 | c83158ab5c3348ab9d148673c23903be |       | 3320a273a7094d789f99756b0e9d0f4f |        | False     |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
root@controller:~# openstack user show  c83158ab5c3348ab9d148673c23903be
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| default_project_id  | 3320a273a7094d789f99756b0e9d0f4f |
| domain_id           | default                          |
| enabled             | True                             |
| id                  | c83158ab5c3348ab9d148673c23903be |
| name                | testreseller                     |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+
root@controller:~#

确实是加上了。

给 testreseller 这个 accout 限制 大小

root@controller:~# swift --os-auth-url http://controller:5000/v3  --auth-version 3\
>       --os-project-name testreseller --os-project-domain-name default \
>       --os-username testreseller --os-user-domain-name default \
>       --os-password openstack post -m quota-bytes:10000 
root@controller:~#

查看一下用户 admin 与 testreseller 的区别。

root@controller:~# cat admin-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
root@controller:~# . admin-openrc 
root@controller:~# swift stat -v
                     StorageURL: http://controller:8080/v1/AUTH_f04ec0abf3d1460dad82608bb03af589
                     Auth Token: gAAAAABcSZpeeHt6OUARCkWhJaVQ-1lOWxqxscVYMl1eAnrmfwXk40injCPY7V0ZjQOv7wReLgjv4Z4qM_ZzDlNK-KRz2AQFLTVxe4PdQJk7dEazzzQ-MTpMtD2WEqrYfgxdtbEXLE3Iw9Tthhbn-XHnc2OM3sJdIsTVBnvhDc4Tf4NBnItIQ2c
                        Account: AUTH_f04ec0abf3d1460dad82608bb03af589
                     Containers: 1
                        Objects: 1
                          Bytes: 26262280
Containers in policy "policy-0": 1
   Objects in policy "policy-0": 1
     Bytes in policy "policy-0": 26262280
    X-Account-Project-Domain-Id: default
         X-Openstack-Request-Id: txc6f0ed7792c546bfbd160-005c499a5e
                    X-Timestamp: 1547641627.86782
                     X-Trans-Id: txc6f0ed7792c546bfbd160-005c499a5e
                   Content-Type: application/json; charset=utf-8
                  Accept-Ranges: bytes
root@controller:~# 
root@controller:~# cat testreseller-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=testreseller
export OS_USERNAME=testreseller
export OS_PASSWORD=openstack
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
root@controller:~# . testreseller-openrc 
root@controller:~# swift stat -v
                 StorageURL: http://controller:8080/v1/AUTH_3320a273a7094d789f99756b0e9d0f4f
                 Auth Token: gAAAAABcSY0Uyh27qJWIkueCQZ6ZWhXP-NJbGj4dJ6qRefiYEqBoT_9SfR86cyucBRPxL3dxOlwy-5mHtZ0M8lE-TveWKbLijW3rJDNolFEQria_tn9rdE4q5SK5a5Rl6LhF7XxBaTBb5cXFRozFcivAi8RKbfgqCX6mLpFnupEWfc_Dh5JwDCA
                    Account: AUTH_3320a273a7094d789f99756b0e9d0f4f
                 Containers: 0
                    Objects: 0
                      Bytes: 0
           Meta Quota-Bytes: 10000
X-Account-Project-Domain-Id: default
     X-Openstack-Request-Id: txa424375b986a4b82a61e4-005c498d14
                X-Timestamp: 1548323944.28538
                 X-Trans-Id: txa424375b986a4b82a61e4-005c498d14
               Content-Type: application/json; charset=utf-8
              Accept-Ranges: bytes
root@controller:~#

观察到:

  • admin 用户不受影响
  • testreseller 用户有多一行Meta Quota-Bytes: 10000 也就是说,限制testreseller 用户的存储大小为 10000 bytes

check

chrome打开: http://192.168.0.50/horizon/project/containers/container/lt10000

但是,发现,上传了 4M, 30M, 70M, 112M 的文件,都可以。为什么???

问题解决了

https://blog.csdn.net/my_vips/article/details/17919167 看到下面这一句话:

使用admin为test租户设置限额,test租户的url地址为:http://192.168.26.69:8080/v1/AUTH_3e2a0a2df18b4f86a52e2dc6ad3cb989
swift -V 2 -A http://192.168.26.69:5000/v2.0 -U admin:admin -K ADMIN_PASS --os-storage-url=http://192.168.26.69:8080/v1/AUTH_3e2a0a2df18b4f86a52e2dc6ad3cb989 post -m quota-bytes:100000000

原来,不是自己给自己配置,而是通过具体 ResellerAdmin 角色的用户给 其它用户 配置 quota-bytes.

(可不看)之前的错误尝试

root@controller:~# swift --os-auth-url http://controller:5000/v3  --auth-version 3\
>   --os-project-name demo --os-project-domain-name default \
>   --os-username demo --os-user-domain-name default \
>   --os-password openstack post -m quota-bytes:100
Account POST failed: http://controller:8080/v1/AUTH_7d6eaa90d74a4f239963933c3a744df3 403 Forbidden  [first 60 chars of response] <html><h1>Forbidden</h1><p>Access was denied to this resourc
Failed Transaction ID: txfa9b8b212b504f10af48c-005c49a542
root@controller:~# . admin-openrc 
root@controller:~# swift --os-auth-url http://controller:5000/v3  --auth-version 3  --os-project-name demo --os-project-domain-name default   --os-username demo --os-user-domain-name default   --os-password openstack post -m quota-bytes:100
Account POST failed: http://controller:8080/v1/AUTH_7d6eaa90d74a4f239963933c3a744df3 403 Forbidden  [first 60 chars of response] <html><h1>Forbidden</h1><p>Access was denied to this resourc
Failed Transaction ID: tx2814b6402eba42e39c8a1-005c49a55b
root@controller:~#

把 admin 用户赋予 ResellerAdmin

root@controller:~# openstack role add --user admin --project admin ResellerAdmin
root@controller:~# openstack project list
+----------------------------------+--------------+
| ID                               | Name         |
+----------------------------------+--------------+
| 3320a273a7094d789f99756b0e9d0f4f | testreseller |
| 7d6eaa90d74a4f239963933c3a744df3 | demo         |
| a640c74e595c44c4902d1c5ebc3afa8a | service      |
| f04ec0abf3d1460dad82608bb03af589 | admin        |
+----------------------------------+--------------+
root@controller:~# openstack role add --user admin ResellerAdmin
Must specify either system, domain, or project
root@controller:~#

demo租户的url地址为: http://controller:8080/v1/AUTH_7d6eaa90d74a4f239963933c3a744df3(这个地址可以有多种方式拿到,最简单的,就是访问:http://192.168.0.50/horizon/project/api_access/)

那么使用admin为demo租户设置限额200bytes, 则设置如下:

root@controller:~# swift --os-auth-url http://controller:5000/v3  --auth-version 3\
>   --os-project-name demo --os-project-domain-name default \
>   --os-username demo --os-user-domain-name default \
>   --os-password openstack stat
                        Account: AUTH_7d6eaa90d74a4f239963933c3a744df3
                     Containers: 8
                        Objects: 51
                          Bytes: 8239369253
Containers in policy "policy-0": 8
   Objects in policy "policy-0": 51
     Bytes in policy "policy-0": 8239369253
    X-Account-Project-Domain-Id: default
         X-Openstack-Request-Id: txd1e045cb10584e7da8e5f-005c49a53b
                    X-Timestamp: 1546928904.74292
                     X-Trans-Id: txd1e045cb10584e7da8e5f-005c49a53b
                   Content-Type: application/json; charset=utf-8
                  Accept-Ranges: bytes
root@controller:~# 
root@controller:~# swift -V 3 -A http://controller:5000/v3 -U admin:admin -K openstack --os-storage-url=http://controller:8080/v1/AUTH_7d6eaa90d74a4f239963933c3a744df3 post -m quota-bytes:200
root@controller:~# swift --os-auth-url http://controller:5000/v3  --auth-version 3\
>   --os-project-name demo --os-project-domain-name default \
>   --os-username demo --os-user-domain-name default \
>   --os-password openstack stat
                        Account: AUTH_7d6eaa90d74a4f239963933c3a744df3
                     Containers: 8
                        Objects: 51
                          Bytes: 8239369253
Containers in policy "policy-0": 8
   Objects in policy "policy-0": 51
     Bytes in policy "policy-0": 8239369253
               Meta Quota-Bytes: 200
    X-Account-Project-Domain-Id: default
         X-Openstack-Request-Id: tx1baa9f71649a4f5f9a5e0-005c49a63a
                    X-Timestamp: 1546928904.74292
                     X-Trans-Id: tx1baa9f71649a4f5f9a5e0-005c49a63a
                   Content-Type: application/json; charset=utf-8
                  Accept-Ranges: bytes
root@controller:~#

成功了。

check

http://192.168.0.50/horizon/project/containers/container/lt200

因为之前的account 的总大小已经大于200,所以,哈哈,现在连4K的文件都上传不了。

去除 quota-bytes

root@controller:~# swift --os-auth-url http://controller:5000/v3  --auth-version 3\
>   --os-project-name demo --os-project-domain-name default \
>   --os-username demo --os-user-domain-name default \
>   --os-password openstack stat
                        Account: AUTH_7d6eaa90d74a4f239963933c3a744df3
                     Containers: 8
                        Objects: 51
                          Bytes: 8239369253
Containers in policy "policy-0": 8
   Objects in policy "policy-0": 51
     Bytes in policy "policy-0": 8239369253
               Meta Quota-Bytes: 200
    X-Account-Project-Domain-Id: default
         X-Openstack-Request-Id: tx1baa9f71649a4f5f9a5e0-005c49a63a
                    X-Timestamp: 1546928904.74292
                     X-Trans-Id: tx1baa9f71649a4f5f9a5e0-005c49a63a
                   Content-Type: application/json; charset=utf-8
                  Accept-Ranges: bytes
root@controller:~# swift -V 3 -A http://controller:5000/v3 -U admin:admin -K openstack --os-storage-url=http://controller:8080/v1/AUTH_7d6eaa90d74a4f239963933c3a744df3 post -m quota-bytes:
root@controller:~# swift --os-auth-url http://controller:5000/v3  --auth-version 3  --os-project-name demo --os-project-domain-name default   --os-username demo --os-user-domain-name default   --os-password openstack stat
                        Account: AUTH_7d6eaa90d74a4f239963933c3a744df3
                     Containers: 9
                        Objects: 51
                          Bytes: 8239369253
Containers in policy "policy-0": 9
   Objects in policy "policy-0": 51
     Bytes in policy "policy-0": 8239369253
    X-Account-Project-Domain-Id: default
         X-Openstack-Request-Id: tx39a80777df094e57800d4-005c49a6c2
                    X-Timestamp: 1546928904.74292
                     X-Trans-Id: tx39a80777df094e57800d4-005c49a6c2
                   Content-Type: application/json; charset=utf-8
                  Accept-Ranges: bytes
root@controller:~#

check

http://192.168.0.50/horizon/project/containers/container/lt200

上传成功。

ref

results matching ""

    No results matching ""