2012年4月16日月曜日

OpenStack/Essex Configuration 03:Swift


このエントリーをはてなブックマークに追加


CentOS6.2上でOpenStack Essexを動かす。
全コンポーネントを連携させることが目標。

- OpenStack/Essex Configuration 01:DB, Queue
- OpenStack/Essex Configuration 02:KeyStone
- OpenStack/Essex Configuration 03:Swift
- OpenStack/Essex Configuration 04:Glance
- OpenStack/Essex Configuration 05:Nova
- OpenStack/Essex Configuration 06:Horizon

OpenStack/Essex RPMs
- OpenStack/Essex RPM Nova/Horizon
- OpenStack/Essex RPM Swift/Keystone/Glance


パッケージの導入

リポジトリはこちらを利用:http://kvps-27-34-160-192.secure.ne.jp/pub/openstack-essex/

[root@opst-sw ~]# yum install openstack-swift.noarch
[root@opst-sw ~]# yum install openstack-swift-saio.noarch

openstack-swift-saio.noarch は Swift ALL in ONE をRPM化したパッケージ。
設定済みのコンフィグファイルと、フォーマットしたディスクイメージを含む。


[root@opst-sw ~]# yum install openstack-keystone

keystone連携するためにkeystoneパッケージが必要になる。


動作確認

openstack-swift-saio.noarch を導入すると、即Swiftを起動できるので、事前に動作確認をしておく。

*openstack-swift-saio はデフォルトでTempAuthを使った認証が行われている

[root@opst-sw ~]# df -h

Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_root-lv_root
20G  3.4G   16G  19% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/vda1             485M   31M  429M   7% /boot
/mnt/disk0            504M   17M  462M   4% /swift/disk0
/mnt/disk1            504M   17M  462M   4% /swift/disk1
/mnt/disk2            504M   17M  462M   4% /swift/disk2
/mnt/disk3            504M   17M  462M   4% /swift/disk3
/mnt/disk4            504M   17M  462M   4% /swift/disk4

[root@opst-sw ~]# netstat -nap |grep python |grep LISTEN |sort
tcp        0      0 0.0.0.0:6000                0.0.0.0:*                   LISTEN      1564/python
tcp        0      0 0.0.0.0:6001                0.0.0.0:*                   LISTEN      1558/python
tcp        0      0 0.0.0.0:6002                0.0.0.0:*                   LISTEN      1559/python
tcp        0      0 0.0.0.0:8080                0.0.0.0:*                   LISTEN      1553/python

[root@opst-sw ~]# /etc/init.d/memcached restart
[root@opst-sw ~]# /etc/init.d/xinetd restart

[root@opst-sw ~]# swift-init all start
Starting container-updater...(/etc/swift/container-server.conf)
Starting account-auditor...(/etc/swift/account-server.conf)
Starting object-replicator...(/etc/swift/object-server.conf)
Starting proxy-server...(/etc/swift/proxy-server.conf)
Starting container-replicator...(/etc/swift/container-server.conf)
Starting object-auditor...(/etc/swift/object-server.conf)
Starting object-expirer...(/etc/swift/object-expirer.conf)
Starting container-auditor...(/etc/swift/container-server.conf)
Starting container-server...(/etc/swift/container-server.conf)
Starting account-server...(/etc/swift/account-server.conf)
Starting account-reaper...(/etc/swift/account-server.conf)
Starting container-sync...(/etc/swift/container-server.conf)
Starting account-replicator...(/etc/swift/account-server.conf)
Starting object-updater...(/etc/swift/object-server.conf)
Starting object-server...(/etc/swift/object-server.conf)

[root@opst-sw ~]# swift -A http://localhost:8080/auth/v1.0 -U admin:admin -K admin stat
   Account: AUTH_admin
Containers: 0
   Objects: 0
     Bytes: 0
Accept-Ranges: bytes
X-Trans-Id: txef7767ba53b245a19b8b341931dd56a9


proxy-server.conf

Keystoneと連携するための設定をproxy-server.confへ行う。

[DEFAULT]
bind_ip = 0.0.0.0
bind_port = 8080
# backlog = 4096
swift_dir = /etc/swift
workers = 2
user = swift
# cert_file = /etc/swift/proxy.crt
# key_file = /etc/swift/proxy.key
# expiring_objects_container_divisor = 86400
# You can specify default log routing here if you want:
# log_name = swift
# log_facility = LOG_LOCAL0
# log_level = INFO

[pipeline:main]
#pipeline = catch_errors healthcheck cache ratelimit tempauth proxy-server
pipeline = catch_errors healthcheck cache ratelimit authtoken keystone proxy-server

[app:proxy-server]
use = egg:swift#proxy
account_autocreate = true

[filter:keystone]
paste.filter_factory = keystone.middleware.swift_auth:filter_factory
operator_roles = admin, swiftoperator

[filter:authtoken]
paste.filter_factory = keystone.middleware.auth_token:filter_factory

service_port = 5000
service_host = 192.168.128.110
service_protocol = http

auth_port = 35357
auth_host = 192.168.128.110
auth_token = ADMIN_keystone_token
auth_protocol = http

admin_token = ADMIN_keystone_token

[filter:healthcheck]
use = egg:swift#healthcheck

[filter:cache]
use = egg:swift#memcache
memcache_servers = 127.0.0.1:11211

[filter:ratelimit]
use = egg:swift#ratelimit

[filter:domain_remap]
use = egg:swift#domain_remap

[filter:catch_errors]
use = egg:swift#catch_errors

[filter:cname_lookup]
use = egg:swift#cname_lookup

# Note: Put staticweb just after your auth filter(s) in the pipeline
[filter:staticweb]
use = egg:swift#staticweb

# Note: Put tempurl just before your auth filter(s) in the pipeline
[filter:tempurl]
use = egg:swift#tempurl
[filter:formpost]
use = egg:swift#formpost

# Note: Just needs to be placed before the proxy-server in the pipeline.
[filter:name_check]
use = egg:swift#name_check


Keystone連携の確認

[root@opst-sw swift]# swift-init proxy-server restart

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U admin:admin -K admin stat
Account: AUTH_e3f5826b96f74985b5ad673de64e0afd
Containers: 0
   Objects: 0
     Bytes: 0
Accept-Ranges: bytes
X-Trans-Id: tx92d2335b8c6f41eaa59ba68519ea7dea
[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U demo:demo -K demo stat
Account HEAD failed: http://10.0.0.130:8080/v1/AUTH_b38a3428d9b341bfbc9f616a28010e68 403 Forbidden
KeyStone連携において、Swiftを利用する権限は、operator_roles で指定されたロールを持つユーザのみ。


ユーザの作成と権限設定

operator_roles = admin, swiftoperator

swiftoperatorに権限を与えていく。keystoneサーバ上で操作

■作成イメージ
| tenant | user  | role          |
|--------+-------+---------------|
| pub1   | user1 | swiftoperator |
|        | user2 | swiftoperator |
|        | user3 | swiftoperator |
| pub2   | user4 | swiftoperator |
|        | user5 | swiftoperator |
|        | user6 | Member        |

■テナント作成
[keystone@opst-ky ~]$ keystone tenant-create --name="pub1"
| Property    | Value                            |
|-------------+----------------------------------|
| description | None                             |
| enabled     | True                             |
| id          | 6e54b6a764e3490291d6179138e2782b |
| name        | pub1                             |

[keystone@opst-ky ~]$ keystone tenant-create --name="pub2"
| Property    | Value                            |
|-------------+----------------------------------|
| description | None                             |
| enabled     | True                             |
| id          | 3e9bd6fc8d714a01903151e14539b126 |
| name        | pub2                             |

export PUBTENANT1=6e54b6a764e3490291d6179138e2782b
export PUBTENANT2=3e9bd6fc8d714a01903151e14539b126

■ロールの作成

[keystone@opst-ky ~]$ keystone role-create --name=swiftoperator
| Property | Value                            |
|----------+----------------------------------|
| id       | 11a4700c237741db898bff3d5bac44d1 |
| name     | swiftoperator                    |

[keystone@opst-ky ~]$ keystone role-list
| id                               | name                 |
|----------------------------------+----------------------|
| 0f3ccb94533f44d69816f3ce615499ca | KeystoneAdmin        |
| 11a4700c237741db898bff3d5bac44d1 | swiftoperator        |
| 149361074fc943b0a010cae2666f6a1c | netadmin             |
| 45855c93f8b7484f8f00c73b830e719f | Member               |
| 87782a629e8246e2a71e7ab7d8cadedc | sysadmin             |
| b8da27650f5b45bb9fce6183f0256a28 | KeystoneServiceAdmin |
| d6db3b3b678448ba84a334645ad9e4d1 | admin                |

export DEMOROLE=45855c93f8b7484f8f00c73b830e719f
export SWROLE=11a4700c237741db898bff3d5bac44d1

■ユーザの作成

[keystone@opst-ky ~]$ keystone user-create --name=user1 --pass="user1"
[keystone@opst-ky ~]$ keystone user-create --name=user2 --pass="user2"
[keystone@opst-ky ~]$ keystone user-create --name=user3 --pass="user3"
[keystone@opst-ky ~]$ keystone user-create --name=user4 --pass="user4"
[keystone@opst-ky ~]$ keystone user-create --name=user5 --pass="user5"
[keystone@opst-ky ~]$ keystone user-create --name=user6 --pass="user6"

[keystone@opst-ky ~]$ keystone user-list
| id                               | enabled | email              | name   |
|----------------------------------+---------+--------------------+--------|
| bd5158ed087948dc974028036e5f65dd | True    | admin@example.com  | admin  |
| 1ff2e19b2bf8449bba1f5fccce9f023d | True    | demo@example.com   | demo   |
| 5c68d3d474544a479f43b3d20d2a2caf | True    | swift@example.com  | swift  |
| 61f8dc5df0fb48a2867078476cdd5b66 | True    | glance@example.com | glance |
| b10e6c4b56b5454a9370de87ceb7759d | True    | nova@example.com   | nova   |
| dad2bacaa50941f5a67430f4a0ff34b4 | True    | None               | user1  |
| db8a0abd8e7144dbaed8e79f47466f89 | True    | None               | user2  |
| c168ec00783344ca9fbc348abe6eb15a | True    | None               | user3  |
| adbe3a16d2f347e3b571134f0f7051ab | True    | None               | user4  |
| bd1a8dae933e45238b3b56999bd8e5ba | True    | None               | user5  |
| 4de6e805c8b64b6db65ef24404d0349e | True    | None               | user6  |

export USER1=dad2bacaa50941f5a67430f4a0ff34b4
export USER2=db8a0abd8e7144dbaed8e79f47466f89
export USER3=c168ec00783344ca9fbc348abe6eb15a
export USER4=adbe3a16d2f347e3b571134f0f7051ab
export USER5=bd1a8dae933e45238b3b56999bd8e5ba
export USER6=4de6e805c8b64b6db65ef24404d0349e

■テナント・ロール・ユーザの関連付け

keystone user-role-add --user $USER1 --role $SWROLE --tenant_id $PUBTENANT1
keystone user-role-add --user $USER2 --role $SWROLE --tenant_id $PUBTENANT1
keystone user-role-add --user $USER3 --role $SWROLE --tenant_id $PUBTENANT1
keystone user-role-add --user $USER4 --role $SWROLE --tenant_id $PUBTENANT2
keystone user-role-add --user $USER5 --role $SWROLE --tenant_id $PUBTENANT2
keystone user-role-add --user $USER6 --role $DEMOROLE --tenant_id $PUBTENANT2


アクセス確認

通常のアクセス(エラーが出なければ成功している)

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user1 -K user1 list

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user2 -K user2 list

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user3 -K user3 list

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub2:user4 -K user4 list

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub2:user5 -K user5 list

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub2:user6 -K user6 list
Account GET failed: http://10.0.0.130:8080/v1/AUTH_3e9bd6fc8d714a01903151e14539b126?format=json 403 Forbidden

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub2:user1 -K user1 list
Auth GET failed: http://192.168.128.110:5000/v2.0/tokens 401 Not Authorized

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user4 -K user4 list
Auth GET failed: http://192.168.128.110:5000/v2.0/tokens 401 Not Authorized


テナントとアカウント

Swiftはテナント(アカウント)の中にユーザが存在する。
つまり、Swiftでは各テナントへ同じユーザ名を持つユーザを作成できるが、それぞれは別ユーザ扱いになる。

しかしKeystoneやNovaはユーザを作って、ユーザをテナントへ参加させる。

そのため、SwiftとKeystoneでは以下の意味が変わってくる。
| tenant | user  |
|--------+-------|
| pub1   | user1 |
| pub2   | user1 |
Swiftから見ると、pub1に所属するuser1と、pub2に所属するuser1 という二人のユーザが存在する。
Keystoneから見ると、user1はpu1とpub2に所属している。

この状態を確認してみる。

keystone user-role-add --user $USER1 --role $SWROLE --tenant_id $PUBTENANT2

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user1 -K user1 list
[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub2:user1 -K user1 list

両者とも「同じユーザ」で認証OK。


[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user1 -K user1 post cont01
[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user1 -K user1 upload cont01 account.ring.gz
account.ring.gz

pub1側でコンテナと、オブジェクトのアップロード


[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user1 -K user1 list
cont01

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub1:user1 -K user1 list cont01
account.ring.gz

pub1側は確認できるが、


[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub2:user1 -K user1 list

[root@opst-sw swift]# swift -V 2 -A http://192.168.128.110:5000/v2.0 -U pub2:user1 -K user1 list cont01
Container 'cont01' not found

pub2側は確認できない。


Swift単体では同じユーザ名でも、所属するテナントが違えば別ユーザとなるため、個別にパスワードを設定できたが、Keystoneを使うと同じユーザになってしまう。この違いを認識しておく必要がある。

0 件のコメント:

コメントを投稿