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

Identity Service(Keystone)のインストール

OpenStack Identity Serviceのコード名はKeystoneです。
Keystoneはユーザ、テナント(プロジェクト)などOpenStackのコンポーネント全ての共通認証・認可を一括管理するコンポーネントです。
Keystoneをインストールすることによって各々のコンポーネントで認証・認可を行う必要がなくなります。

Keystoneのダウンロード

Keystoneのソースをダウンロードします。
またKeystoneAPIを利用するためのクライアントもダウンロードしておきます。
ダウンロードしたバージョンはMasterになっているためバージョンはどちらもFolsomにします。

Keystoneのソースをダウンロード

$ sudo git clone git://github.com/openstack/keystone /opt/keystone
$ sudo git clone git://github.com/openstack/python-keystoneclient /opt/python-keystoneclient

KeystoneのバージョンをFolsomに固定

クライアントのタグは folsom-1 までしか切られていませんがMasterで問題ないのでMasterを利用します。
$ cd /opt/keystone ; sudo git checkout -b folsom origin/stable/folsom

Keystoneのインストール

ダウンロードしたKeystoneとクライアントをインストールします。
pipでパッケージの依存関係を解決します。
$ sudo pip install -r /opt/keystone/tools/pip-requires
$ cd /opt/keystone && sudo python setup.py install
$ cd /opt/python-keystoneclient && sudo python setup.py install

Keystoneが利用するユーザ、ディレクトリなどの作成

ソースからインストールする場合はユーザやディレクトリを作成する必要がありますので作成します。
$ sudo useradd keystone -m -d /var/lib/keystone -s /bin/false
$ sudo mkdir /etc/keystone
$ sudo mkdir /var/log/keystone
$ sudo chown keystone:keystone /var/log/keystone

Keystoneのコンフィグ

keystoneのコンフィグを行います。
バックアップをディレクトリごととっておきましょう。
$ sudo cp -a /opt/keystone/etc/* /etc/keystone
$ sudo mv /etc/keystone/keystone.conf.sample /etc/keystone/keystone.conf
$ sudo mv /etc/keystone/logging.conf.sample /etc/keystone/logging.conf
DEFAULT、CATALOG、SQL、TOKEN、EC2の5セクションの変更が必要です。
SQLの接続先、ユーザ名、パスワードは適切なものを設定するようにして下さい。
何故かGitのものは全てがコメントになっているのでコンフィグを以下に示します。
[DEFAULT]
# A "shared secret" between keystone and other openstack services
admin_token = ADMIN

# The IP address of the network interface to listen on
bind_host = 0.0.0.0

# The port number which the public service listens on
public_port = 5000

# The port number which the public admin listens on
admin_port = 35357

# The port number which the OpenStack Compute service listens on
compute_port = 8774

# === Logging Options ===
# Print debugging output
verbose = True

# Print more verbose output
# (includes plaintext request logging, potentially including passwords)
debug = True

# Name of log file to output to. If not set, logging will go to stdout.
log_file = keystone.log

# The directory to keep log files in (will be prepended to --logfile)
log_dir = /var/log/keystone

# Use syslog for logging.
# use_syslog = False

# syslog facility to receive log lines
# syslog_log_facility = LOG_USER

# If this option is specified, the logging configuration file specified is
# used and overrides any other logging options specified. Please see the
# Python logging module documentation for details on logging configuration
# files.
# log_config = logging.conf

# A logging.Formatter log message format string which may use any of the
# available logging.LogRecord attributes.
# log_format = %(asctime)s %(levelname)8s [%(name)s] %(message)s

# Format string for %(asctime)s in log records.
# log_date_format = %Y-%m-%d %H:%M:%S

# onready allows you to send a notification when the process is ready to serve
# For example, to have it notify using systemd, one could set shell command:
# onready = systemd-notify --ready
# or a module with notify() method:
# onready = keystone.common.systemd

[sql]
# The SQLAlchemy connection string used to connect to the database
# connection = sqlite:///keystone.db
connection = mysql://keystone:password@stack01/keystone?charset=utf8

# the timeout before idle sql connections are reaped
# idle_timeout = 200

[identity]
driver = keystone.identity.backends.sql.Identity

[catalog]
# dynamic, sql-based backend (supports API/CLI-based management commands)
driver = keystone.catalog.backends.sql.Catalog

# static, file-based backend (does *NOT* support any management commands)
# driver = keystone.catalog.backends.templated.TemplatedCatalog

# template_file = default_catalog.templates

[token]
driver = keystone.token.backends.sql.Token

# Amount of time a token should remain valid (in seconds)
# expiration = 86400

[policy]
driver = keystone.policy.backends.rules.Policy

[ec2]
driver = keystone.contrib.ec2.backends.sql.Ec2

[ssl]
#enable = True
#certfile = /etc/keystone/ssl/certs/keystone.pem
#keyfile = /etc/keystone/ssl/private/keystonekey.pem
#ca_certs = /etc/keystone/ssl/certs/ca.pem
#cert_required = True

[signing]
#token_format = UUID
#certfile = /etc/keystone/ssl/certs/signing_cert.pem
#keyfile = /etc/keystone/ssl/private/signing_key.pem
#ca_certs = /etc/keystone/ssl/certs/ca.pem
#key_size = 1024
#valid_days = 3650
#ca_password = None
#token_format = PKI

[ldap]
# url = ldap://localhost
# user = dc=Manager,dc=example,dc=com
# password = None
# suffix = cn=example,cn=com
# use_dumb_member = False

# user_tree_dn = ou=Users,dc=example,dc=com
# user_objectclass = inetOrgPerson
# user_id_attribute = cn
# user_name_attribute = sn

# tenant_tree_dn = ou=Groups,dc=example,dc=com
# tenant_objectclass = groupOfNames
# tenant_id_attribute = cn
# tenant_member_attribute = member
# tenant_name_attribute = ou

# role_tree_dn = ou=Roles,dc=example,dc=com
# role_objectclass = organizationalRole
# role_id_attribute = cn
# role_member_attribute = roleOccupant

[filter:debug]
paste.filter_factory = keystone.common.wsgi:Debug.factory

[filter:token_auth]
paste.filter_factory = keystone.middleware:TokenAuthMiddleware.factory

[filter:admin_token_auth]
paste.filter_factory = keystone.middleware:AdminTokenAuthMiddleware.factory

[filter:xml_body]
paste.filter_factory = keystone.middleware:XmlBodyMiddleware.factory

[filter:json_body]
paste.filter_factory = keystone.middleware:JsonBodyMiddleware.factory

[filter:user_crud_extension]
paste.filter_factory = keystone.contrib.user_crud:CrudExtension.factory

[filter:crud_extension]
paste.filter_factory = keystone.contrib.admin_crud:CrudExtension.factory

[filter:ec2_extension]
paste.filter_factory = keystone.contrib.ec2:Ec2Extension.factory

[filter:s3_extension]
paste.filter_factory = keystone.contrib.s3:S3Extension.factory

[filter:url_normalize]
paste.filter_factory = keystone.middleware:NormalizingFilter.factory

[filter:stats_monitoring]
paste.filter_factory = keystone.contrib.stats:StatsMiddleware.factory

[filter:stats_reporting]
paste.filter_factory = keystone.contrib.stats:StatsExtension.factory

[app:public_service]
paste.app_factory = keystone.service:public_app_factory

[app:admin_service]
paste.app_factory = keystone.service:admin_app_factory

[pipeline:public_api]
pipeline = stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug ec2_extension user_crud_extension public_service

[pipeline:admin_api]
pipeline = stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug stats_reporting ec2_extension s3_extension crud_extension admin_service

[app:public_version_service]
paste.app_factory = keystone.service:public_version_app_factory

[app:admin_version_service]
paste.app_factory = keystone.service:admin_version_app_factory

[pipeline:public_version_api]
pipeline = stats_monitoring url_normalize xml_body public_version_service

[pipeline:admin_version_api]
pipeline = stats_monitoring url_normalize xml_body admin_version_service

[composite:main]
use = egg:Paste#urlmap
/v2.0 = public_api
/ = public_version_api

[composite:admin]
use = egg:Paste#urlmap
/v2.0 = admin_api
/ = admin_version_api

データベースの作成

Keystoneが利用するデータベースを作成します。
Keystoneのデータベースを設定するためのユーザ、パスワードはMySQLをインストールした時のものですので注意して下さい。
データベース名keystone、ユーザ名keystone、パスワードはpasswordとしているため適切なものへ変更してください。
ホスト名も同様にstack01としていますので変更が必要であればおこなって下さい。
$ mysql -uroot -pnova -e "drop database keystone;"
$ mysql -uroot -pnova -e "create database keystone character set utf8;"
$ mysql -uroot -pnova -e "grant all privileges on keystone.* to 'keystone'@'%' identified by 'password';"
$ mysql -uroot -pnova -e "grant all privileges on keystone.* to 'keystone'@'localhost' identified by 'password';"
$ mysql -uroot -pnova -e "grant all privileges on keystone.* to 'keystone'@'stack01' identified by 'password';"
$ sudo keystone-manage db_sync

プロセスの起動

Keystoneを起動します。がソースからのインストールの場合は起動スクリプトがありませんので用意します。

起動スクリプトの用意

$ cat << 'KEYSTONE_INIT' | sudo tee /etc/init/keystone.conf > /dev/null
description "Keystone API server"
author "Soren Hansen <soren@linux2go.dk>"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [016]

respawn

exec su -s /bin/sh -c "exec keystone-all" keystone
KEYSTONE_INIT

プロセスの起動

作成した起動スクリプトを利用してKeystoneを起動します。

$ sudo stop keystone ; sudo start keystone
$ status keystone

データの作成

KeystoneにOpenStackで利用するサービス、サービスに対するユーザ、ロールの設定を行います。
実際には環境にあった設定を利用したシェルの作成などが必要かも知れません。
複数台構築することを想定してローカルホストの設定になっている箇所をControllerNodeのホスト名へ変更しておきま

す。

データ投入スクリプトのダウンロード

$ cd /usr/local/src
$ sudo wget https://raw.github.com/hagix9/openstack-folsom-guide/master/scripts/keystone-data.sh
$ sudo wget https://raw.github.com/hagix9/openstack-folsom-guide/master/scripts/keystone-endpoints.sh

環境変数の設定

$ export CONTROLLER_HOST=stack01
$ export OS_TENANT_NAME=admin
$ export OS_USERNAME=admin
$ export OS_PASSWORD=password
$ export OS_AUTH_URL=http://$CONTROLLER_HOST:5000/v2.0/
$ export SERVICE_ENDPOINT=http://$CONTROLLER_HOST:35357/v2.0/
$ export SERVICE_TOKEN=ADMIN

スクリプトの実行

$ sudo -E bash keystone-data.sh
$ sudo -E bash keystone-endpoints.sh -K $CONTROLLER_HOST

設定確認

実際にデータが作成されていることを確認しましょう。
ユーザがkeystoneを操作するにはオプションを付与する必要があります。
操作するテナント名、テナントに対するユーザ名、パスワード、エンドポイントを設定する必要があります。
エンドポイントとは、APIを利用するための接続先であるURLのことです。
OpenStackの各コンポーネントはそれぞれエンドポイントを持つことになります。
ここではKeystoneのためのエンドポイントを環境変数に設定します。
エンドポイントにはパブリックURL、インターナルURL、管理用URLの3種類があります。
:header-rows: 1
エンドポイントの種類 概要
パブリックURL エンドユーザがアクセスするためのURL
インターナルURL LAN経由でアクセス可能なユーザのためのURL
管理用URL 管理者用がアクセスするためのURL
作成されたものをlistコマンドでそれぞれ確認してみます。
確認するには環境変数の設定が必要ですのでログインしなおしたりしている場合は再度設定しておいて下さい。
エンドポイント、サービスにもlistコマンドが用意されていますが実行すると501エラーが帰ってきます。
これは、データベースでなくファイルを利用する設定を行ったためですので問題ありません。
テナント、テナントに対するユーザとロール、AmazonAPIを利用するユーザ一覧を確認してみましょう。
$ keystone tenant-list
+----------------------------------+--------------------+---------+
|                id                |        name        | enabled |
+----------------------------------+--------------------+---------+
| aa229621e50b4bc892372633b4e7be96 |      service       |   True  |
| b041b0ccce9c4ecc8d7fdd874c12d013 |       admin        |   True  |
| bfed77382c4c4af49913901b74eb3b27 |        demo        |   True  |
| d76febd5112449b4a79679fdb356bed5 | invisible_to_admin |   True  |
+----------------------------------+--------------------+---------+

$ keystone user-list
+----------------------------------+---------+---------+--------------------+
|                id                |   name  | enabled |       email        |
+----------------------------------+---------+---------+--------------------+
| 0bd75a8a80ea4163b2531379d1a9843c |  swift  |   True  |  swift@domain.com  |
| 130f64cdb23547a3a88ed9e1389152b5 |   demo  |   True  |  demo@domain.com   |
| 1710e4b9135242bf90b4ca7b1574fde0 |  admin  |   True  |  admin@domain.com  |
| 22c78dc47ee04bd080fa06d9b8e9421a |  glance |   True  | glance@domain.com  |
| 41b5900074ad4af38378392dcfa4843a |  cinder |   True  | cinder@domain.com  |
| a022e452421f4111b3cc1b28190bda1b |   nova  |   True  |  nova@domain.com   |
| b23d518912174f22bb693319c4d267d3 |   heat  |   True  |  heat@domain.com   |
| df18c60138d94e92ba887312a91556f8 | quantum |   True  | quantum@domain.com |
+----------------------------------+---------+---------+--------------------+

$ keystone role-list
+----------------------------------+----------------------+
|                id                |         name         |
+----------------------------------+----------------------+
| 5d4761074ad44b84b1e4cbc727ba088b |        admin         |
| 75265579dddc48f591a37393c44e1573 |        Member        |
| 7e6de61a7e664a7e8059f775eda0fed2 | KeystoneServiceAdmin |
| cd8a121340954cc5af886ea33807665d |    KeystoneAdmin     |
| f5d1455c03d0467aba1ac7a47aea3162 |    ResellerAdmin     |
+----------------------------------+----------------------+

$ keystone service-list
+----------------------------------+----------+---------------+------------------------------+
|                id                |   name   |      type     |         description          |
+----------------------------------+----------+---------------+------------------------------+
| 0adb26caa08844dfa1c6556c2555fb5a |   nova   |    compute    |  OpenStack Compute Service   |
| 15728b0e5db24e7e8ffb31a3904edfe7 | quantum  |    network    | OpenStack Networking service |
| 17cc2c2e72264744af22b0ff74d10f34 |  swift   |  object-store |  OpenStack Storage Service   |
| 59aadf24f2fd48b2894572592242226a |  glance  |     image     |   OpenStack Image Service    |
| 6023fc5667204ff195e865f40b4f8d2d |  cinder  |     volume    |   OpenStack Volume Service   |
| 67787841684f4213b014b5e6f6a62973 |   ec2    |      ec2      |    OpenStack EC2 service     |
| b46cdf4781994002ba7f201bffd06f1e |   heat   | orchestration |    OPenStack Heat Service    |
| bd29f05f2b4d49328c4a35d46deb7b97 | keystone |    identity   |      OpenStack Identity      |
+----------------------------------+----------+---------------+------------------------------+

$ keystone endpoint-list
+----------------------------------+-----------+-------------------------------------------+-------------------------------------------+--------------------------------------+
|                id                |   region  |                 publicurl                 |                internalurl                |               adminurl               |
+----------------------------------+-----------+-------------------------------------------+-------------------------------------------+--------------------------------------+
| 0175333385c4409282bc2529b494d311 | RegionOne |          http://stack01:5000/v2.0         |          http://stack01:5000/v2.0         |      http://stack01:35357/v2.0       |
| 2e55f30fe5714a839a1650d31c75866f | RegionOne | http://stack01:8080/v1/AUTH_$(tenant_id)s | http://stack01:8080/v1/AUTH_$(tenant_id)s |        http://stack01:8080/v1        |
| 354061be704f46729806a03aa1e432bf | RegionOne |    http://stack01:8776/v1/$(tenant_id)s   |    http://stack01:8776/v1/$(tenant_id)s   | http://stack01:8776/v1/$(tenant_id)s |
| 49f07f896d664f97b15a537b29de7141 | RegionOne |           http://stack01:9292/v2          |           http://stack01:9292/v2          |        http://stack01:9292/v2        |
| 5227ec52e06b4dc68ab5d4925a54b3d8 | RegionOne |    http://stack01:8774/v2/$(tenant_id)s   |    http://stack01:8774/v2/$(tenant_id)s   | http://stack01:8774/v2/$(tenant_id)s |
| 8e3242ba338f455da0357479d318d75f | RegionOne |            http://stack01:9696/           |            http://stack01:9696/           |         http://stack01:9696/         |
| c2a68bfad24248f8a860fe151d240d01 | RegionOne |     http://stack01:8773/services/Cloud    |     http://stack01:8773/services/Cloud    |  http://stack01:8773/services/Admin  |
| f8c7aada409a441899e91f1501013816 | RegionOne |            http://stack01:8000/           |            http://stack01:8000/           |         http://stack01:8000/         |
+----------------------------------+-----------+-------------------------------------------+-------------------------------------------+--------------------------------------+
Keystoneのインストール、設定はここで終了です。
SwiftやQauntumのインストールなどのコンポーネントを追加する際はサンプルシェルでなくコマンドで追加します。
サンプルシェルでなく独自でシェルを作成してテナントやユーザを作成する場合はそちらを参考にして作成して下さい。