kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

Diablo版Swiftインストール:keystone編

久しぶりにSwiftをさわることなり、以前からバージョンアップもされ、特に認証機能が大きく変わったので、再度インストールを試みたのでそのときのメモ。

今回は、認証機能である keystone のインストールについてメモっておく。参考にしたのは以下のサイト。

ちなみに、この記事を書いている段階ではまだ各機能の詳細については理解してない。とりあえず、上記サイトを参考にして動かすことだけを目的とした。

構成

今回試した構成は以下のようなもの。

          +ーー[認証サーバ(keystone)]
[クライアント]ーー+
          +ーー[プロクシサーバ]ーー+ーー[ストレージ1]
                        +ーー[ストレージ2]
                        +ーー[ストレージ3]
                        +ーー[ストレージ4]

ゾーンはストレージノードごとに別々としたので、都合4ゾーンの構成。

なお今回は、すべて http でのアクセスを想定しての設定とした。SSL の場合はまた別途考えるかもしれないけれど。。。

認証サーバとプロクシサーバ(クライアント側に見える)のIPはそれぞれ以下の通りとしている。

認証サーバ 172.16.0.99/16
プロクシサーバ 172.16.0.100/16

OS環境

今回は Scientific Linux 6.1(64bit)を利用した。実際はさくらのクラウド(β)のテンプレートを使ったので特にOS自体のインストールはしていないので、インストール方法は省略。

OpenStack Diablo 版の公開リポジトリhttp://yum.griddynamics.net/yum/ にあるので、こちらを利用することにした。その準備として、まず以下のようにリポジトリ情報の元となるrpmをインストールした。

# wget http://yum.griddynamics.net/yum/master/openstack/openstack-repo-2011.3-0.2.noarch.rpm
# rpm -ivh openstack-repo-2011.3-0.2.noarch.rpm

その後、diablo-centos, diablo からパッケージを取得するように /etc/yum.repos.d/openstack.repo を以下のように修正した。

[diablo-centos]
name=OpenStack Diablo for CentOS
baseurl=http://yum.griddynamics.net/yum/diablo-centos
enabled=1
gpgcheck=1
metadata_expire=90
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OPENSTACK

[diablo]
name=OpenStack Diablo
baseurl=http://yum.griddynamics.net/yum/diablo
enabled=1
gpgcheck=1
metadata_expire=90
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-OPENSTACK

パッケージインストール

認証サーバに必要なパッケージは以下のようにしてインストールした。

# yum install python-greenlet python-httplib2
# yum --disablerepo=diablo install openstack-keystone start-stop-daemon python-paste-deploy python-setuptools python-webob

keystoneの設定

keystoneの設定は /etc/keystone/keystone.conf に記述する。とりあえず、パッケージからインストールされたそのままを使った。

その後、keystoneを起動。

# chkconfig --add openstack-keystone
# chkconfig openstack-keystone on
# service openstack-keystone start

keystone が起動したらユーザやリージョンなどの初期データを登録する。このときのデータに少し嵌った。
TechTarget の記事は Diablo-4 の時のもので、このときはServiceを登録しなくてもよかったのか、Serviceの登録コマンドがなかった。このため動作しなかったのだと思うけど、github の情報や動作しなかった時のデバッグログから、Serviceの登録が必須のようであったので、初期データスクリプトを以下のようにし実行した。

#!/bin/bash
BIN_DIR=/usr/bin
# Tenants
$BIN_DIR/keystone-manage $* tenant add admin
$BIN_DIR/keystone-manage $* tenant add demo

# Users
$BIN_DIR/keystone-manage $* user add demo secrete demo
$BIN_DIR/keystone-manage $* user add admin secrete admin

# Roles
$BIN_DIR/keystone-manage $* role add Admin
$BIN_DIR/keystone-manage $* role add Member
$BIN_DIR/keystone-manage $* role grant Admin admin

SWIFT=172.16.0.100
KEYSTONE=172.16.0.99

# Services
$BIN_DIR/keystone-manage $* service add swift object-store 'Swift-compatible service'
$BIN_DIR/keystone-manage $* service add identity identity 'OpenStack Identity Service'

#endpointTemplates
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne 1 http://${SWIFT}:8080/v1/AUTH_%tenant_id% http://${SWIFT}:8080/ http://${SWIFT}:8080/v1/AUTH_%tenant_id% 1 1
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne 2 http://${KEYSTONE}:5000/v2.0 http://${KEYSTONE}:5001/v2.0 http://${KEYSTONE}:5000/v2.0 1 1

# Tokens
$BIN_DIR/keystone-manage $* token add 999888777666 admin admin 2015-02-05T00:00

#Tenant endpoints
$BIN_DIR/keystone-manage $* endpoint add admin 1
$BIN_DIR/keystone-manage $* endpoint add admin 2

$BIN_DIR/keystone-manage $* endpoint add demo 1
$BIN_DIR/keystone-manage $* endpoint add demo 2

ちなみに、Diablo のリリース後に keystone/manage/api.py が修正されていて、endpointTemplates の add では service id ではなく service name を記述するようになっている。なので、上記の #endpointTemplates の部分は

#endpointTemplates
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne swift http://${SWIFT}:8080/v1/AUTH_%tenant_id% http://${SWIFT}:8080/ http://${SWIFT}:8080/v1/AUTH_%tenant_id% 1 1
$BIN_DIR/keystone-manage $* endpointTemplates add RegionOne identity http://${KEYSTONE}:5000/v2.0 http://${KEYSTONE}:5001/v2.0 http://${KEYSTONE}:5000/v2.0 1 1

と書くように変更しなければならないようだ。

また、もし設定をミスったりして最初からデータ登録をやり直したい場合は、openstack-keystone を停止後に /var/lib/keystone/keystone.db を削除して、再度 openstack-keystone を開始すればよい。

動作確認

以上で必要最低限の設定までできたので動作確認できる。

# curl -d '{ "auth" : {"passwordCredentials":{"username": "admin", "password": "secrete"}}}' -H "Content-type: application/json" http://localhost:5000/v2.0/tokens

と実行して

{"access": {"token": {"expires": "2011-10-23T23:29:11.643318", "id": "5bb58e2c-dd73-4858-9133-7a0e809146ec", "tenant": {"id": "1", "name": "admin"}}, "serviceCatalog": [{"endpoints": [{"adminURL": "http://172.16.0.100:8080/", "region": "RegionOne", "internalURL": "http://172.16.0.100:8080/v1/AUTH_1", "publicURL": "http://172.16.0.100:8080/v1/AUTH_1"}], "type": "object-store", "name": "swift"}, {"endpoints": [{"adminURL": "http://172.16.0.99:5001/v2.0", "region": "RegionOne", "internalURL": "http://172.16.0.99:5000/v2.0", "publicURL": "http://172.16.0.99/v2.0"}], "type": "identity", "name": "identity"}], "user": {"id": "2", "roles": [{"id": "1", "name": "Admin"}], "name": "admin"}}}

のような出力が得られる。
ポート5001に対しても同様なコマンドを実行して、同様な出力が得られることを確認できる。

その他気づいたこと

OpenStack Docs: Current では

# curl http://localhost:5001/v2.0/

のようにして動作確認をするような記述がある。しかし、これを実行するとエラーとなった。

調べた感じでは、rpmパッケージとしてkeystoneを入れると、keystoneコマンドは /usr/bin/keystone というパスに存在する。しかし、/usr/lib/python2.6/site-packages/keystone 配下のソースのいくつかでは

possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
                                   os.pardir,
                                   os.pardir))

という記述がある。おそらく、github のディレクトリ構成そのままで動かす場合は問題ないのだと思うが、rpmパッケージ化により、この部分が機能していないように見える。
なので、とりあえずは

possible_topdir = '/usr/lib/python2.6/site-packages'

とすれば、エラーは起きなくなった。

ただし、今回Swiftを動かした範囲においてはこの修正がなくとも動作はした。

以上で、keyston の設定はおしまい。次回はプロクシサーバについて記述予定。