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

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

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

2.2.3.1. Keystoneのダウンロード

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

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

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

2.2.3.1.2. KeystoneのバージョンをGrizzlyに固定

$ cd /opt/keystone ; sudo git checkout -b grizzly origin/stable/grizzly

2.2.3.2. Keystoneのインストール

ダウンロードしたKeystoneをインストールします。
pipで依存関係を解決します。
あと、いくつか依存関係のあるパッケージのインストールが必要です。
$ sudo apt-get install zlib1g-dev -y
$ sudo pip install -r /opt/keystone/tools/pip-requires
$ cd /opt/keystone && sudo python setup.py install

2.2.3.3. 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

2.2.3.4. 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の接続先、ユーザ名、パスワードは適切なものを設定するようにして下さい。
$ sudo vi /etc/keystone/keystone.conf
[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 base endpoint URLs for keystone that are advertised to clients
# (NOTE: this does NOT affect how keystone listens for connections)
# public_endpoint = http://localhost:%(public_port)d/
# admin_endpoint = http://localhost:%(admin_port)d/

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

# Path to your policy definition containing identity actions
# policy_file = policy.json

# Rule to check if no matching policy definition is found
# FIXME(dolph): This should really be defined as [policy] default_rule
# policy_default_rule = admin_required

# Role for migrating membership relationships
# During a SQL upgrade, the following values will be used to create a new role
# that will replace records in the user_tenant_membership table with explicit
# role grants.  After migration, the member_role_id will be used in the API
# add_user_to_project, and member_role_name will be ignored.
# member_role_id = 9fe2ff9ee4384b1894a90878d3e92bab
# member_role_name = _member_

# === Logging Options ===
# Print debugging output
# (includes plaintext request logging, potentially including passwords)
debug = True

# Print more verbose output
verbose = 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 = 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

# This references the domain to use for all Identity API v2 requests (which are
# not aware of domains). A domain with this ID will be created for you by
# keystone-manage db_sync in migration 008.  The domain referenced by this ID
# cannot be deleted on the v3 API, to prevent accidentally breaking the v2 API.
# There is nothing special about this domain, other than the fact that it must
# exist to order to maintain support for your v2 clients.
# default_domain_id = default

[trust]
# driver = keystone.trust.backends.sql.Trust

# delegation and impersonation features can be optionally disabled
# enabled = True

[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.sql.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 = PKI
#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

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

# Maximum results per page; a value of zero ('0') disables paging (default)
# page_size = 0

# The LDAP dereferencing option for queries. This can be either 'never',
# 'searching', 'always', 'finding' or 'default'. The 'default' option falls
# back to using default dereferencing configured by your ldap.conf.
# alias_dereferencing = default

# The LDAP scope for queries, this can be either 'one'
# (onelevel/singleLevel) or 'sub' (subtree/wholeSubtree)
# query_scope = one

# user_tree_dn = ou=Users,dc=example,dc=com
# user_filter =
# user_objectclass = inetOrgPerson
# user_domain_id_attribute = businessCategory
# user_id_attribute = cn
# user_name_attribute = sn
# user_mail_attribute = email
# user_pass_attribute = userPassword
# user_enabled_attribute = enabled
# user_enabled_mask = 0
# user_enabled_default = True
# user_attribute_ignore = tenant_id,tenants
# user_allow_create = True
# user_allow_update = True
# user_allow_delete = True
# user_enabled_emulation = False
# user_enabled_emulation_dn =

# tenant_tree_dn = ou=Groups,dc=example,dc=com
# tenant_filter =
# tenant_objectclass = groupOfNames
# tenant_domain_id_attribute = businessCategory
# tenant_id_attribute = cn
# tenant_member_attribute = member
# tenant_name_attribute = ou
# tenant_desc_attribute = desc
# tenant_enabled_attribute = enabled
# tenant_attribute_ignore =
# tenant_allow_create = True
# tenant_allow_update = True
# tenant_allow_delete = True
# tenant_enabled_emulation = False
# tenant_enabled_emulation_dn =

# role_tree_dn = ou=Roles,dc=example,dc=com
# role_filter =
# role_objectclass = organizationalRole
# role_id_attribute = cn
# role_name_attribute = ou
# role_member_attribute = roleOccupant
# role_attribute_ignore =
# role_allow_create = True
# role_allow_update = True
# role_allow_delete = True

# group_tree_dn =
# group_filter =
# group_objectclass = groupOfNames
# group_id_attribute = cn
# group_name_attribute = ou
# group_member_attribute = member
# group_desc_attribute = desc
# group_attribute_ignore =
# group_allow_create = True
# group_allow_update = True
# group_allow_delete = True

[auth]
methods = password,token
password = keystone.auth.plugins.password.Password
token = keystone.auth.plugins.token.Token

[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:sizelimit]
paste.filter_factory = keystone.middleware:RequestBodySizeLimiter.factory

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

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

[filter:access_log]
paste.filter_factory = keystone.contrib.access:AccessLogMiddleware.factory

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

[app:service_v3]
paste.app_factory = keystone.service:v3_app_factory

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

[pipeline:public_api]
pipeline = access_log sizelimit 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 = access_log sizelimit stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug stats_reporting ec2_extension s3_extension crud_extension admin_service

[pipeline:api_v3]
pipeline = access_log sizelimit stats_monitoring url_normalize token_auth admin_token_auth xml_body json_body debug stats_reporting ec2_extension s3_extension service_v3

[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 = access_log sizelimit stats_monitoring url_normalize xml_body public_version_service

[pipeline:admin_version_api]
pipeline = access_log sizelimit stats_monitoring url_normalize xml_body admin_version_service

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

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

2.2.3.5. データベースの作成

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

2.2.3.6. プロセスの起動

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

2.2.3.6.1. 起動スクリプトの用意

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

start on runlevel [2345]
stop on runlevel [!2345]

respawn

exec start-stop-daemon --start --chuid keystone \
            --chdir /var/lib/keystone --name keystone \
            --exec /usr/local/bin/keystone-all
KEYSTONE_INIT

2.2.3.6.2. プロセスの起動

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

$ sudo rm /var/log/keystone/*
$ sudo stop keystone ; sudo start keystone
$ status keystone

2.2.3.7. データの作成

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

す。

データ投入スクリプトのコピー

$ cd /usr/local/src ; sudo cp -a /opt/keystone/tools/sample_data.sh .

環境変数の設定

$ export CONTROLLER_HOSTNAME=stack01
$ export SERVICE_ENDPOINT=http://$CONTROLLER_HOSTNAME:35357/v2.0
$ sudo sed -i "s/localhost/$CONTROLLER_HOSTNAME/" /usr/local/src/sample_data.sh

スクリプトの実行

$ sudo -E bash /usr/local/src/sample_data.sh

2.2.3.8. 設定確認

実際にデータが作成されていることを確認しましょう。
ユーザがkeystoneを操作するにはオプションを付与する必要があります。
操作するテナント名、テナントに対するユーザ名、パスワード、エンドポイントを設定する必要があります。
エンドポイントとは、APIを利用するための接続先であるURLのことです。
OpenStackの各コンポーネントはそれぞれエンドポイントを持つことになります。
ここではKeystoneのためのエンドポイントを環境変数に設定します。
エンドポイントにはパブリックURL、インターナルURL、管理用URLの3種類があります。
:header-rows: 1
エンドポイントの種類 概要
パブリックURL エンドユーザがアクセスするためのURL
インターナルURL LAN経由でアクセス可能なユーザのためのURL
管理用URL 管理者用がアクセスするためのURL
環境変数の読み込みを行ってから確認します。
$ export OS_SERVICE_TOKEN=ADMIN
$ export OS_SERVICE_ENDPOINT=http://stack01:35357/v2.0/
作成されたものをlistコマンドでそれぞれ確認してみます。
確認するには環境変数の設定が必要ですのでログインしなおしたりしている場合は再度設定しておいて下さい。
エンドポイント、サービスにもlistコマンドが用意されていますが実行すると501エラーが帰ってきます。
これは、データベースでなくファイルを利用する設定を行ったためですので問題ありません。
テナント、テナントに対するユーザとロール、AmazonAPIを利用するユーザ一覧を確認してみましょう。
$ keystone tenant-list
+----------------------------------+---------+---------+
|                id                |   name  | enabled |
+----------------------------------+---------+---------+
| af15b2df723747449170a7186bb08976 |   demo  |   True  |
| 22c83d1ac73d4405a5ef2a7ca54911c3 | service |   True  |
+----------------------------------+---------+---------+
$ keystone user-list
+----------------------------------+---------+---------+
|                id                |   name  | enabled |
+----------------------------------+---------+---------+
| af15b2df723747449170a7186bb08976 |   demo  |   True  |
| 22c83d1ac73d4405a5ef2a7ca54911c3 | service |   True  |
+----------------------------------+---------+---------+
+----------------------------------+---------+---------+
|                id                |   name  | enabled |
+----------------------------------+---------+---------+
| af15b2df723747449170a7186bb08976 |   demo  |   True  |
| 22c83d1ac73d4405a5ef2a7ca54911c3 | service |   True  |
+----------------------------------+---------+---------+
$ keystone service-list
+----------------------------------+---------+---------+
|                id                |   name  | enabled |
+----------------------------------+---------+---------+
| af15b2df723747449170a7186bb08976 |   demo  |   True  |
| 22c83d1ac73d4405a5ef2a7ca54911c3 | service |   True  |
+----------------------------------+---------+---------+
$ keystone endpoint-list
+----------------------------------+-----------+----------------------------------------------------+----------------------------------------------------+----------------------------------------------------+----------------------------------+
|                id                |   region  |                     publicurl                      |                    internalurl                     |                      adminurl                      |            service_id            |
+----------------------------------+-----------+----------------------------------------------------+----------------------------------------------------+----------------------------------------------------+----------------------------------+
| 20732cfb77e048fdb72db2de9c43cff8 | RegionOne | http://stack01:$(compute_port)s/v1.1/$(tenant_id)s | http://stack01:$(compute_port)s/v1.1/$(tenant_id)s | http://stack01:$(compute_port)s/v1.1/$(tenant_id)s | a0ea6fa439494a0ba1ca47191eb9e28c |
| 30a7e6622a384972a919bdc880e8ff6b | RegionOne |        http://stack01:$(public_port)s/v2.0         |        http://stack01:$(public_port)s/v2.0         |         http://stack01:$(admin_port)s/v2.0         | 6fdfa4608658441180ff8973d8690ca6 |
| 34d7ba27d06b48c3b01f26ba46d2ea09 | RegionOne |                http://stack01:9292                 |                http://stack01:9292                 |                http://stack01:9292                 | 33015002e7ea4bf88ef9581db424514e |
| 4a8c6cb627294756afdb6f03aec55131 | RegionOne |        http://stack01:8776/v1/$(tenant_id)s        |        http://stack01:8776/v1/$(tenant_id)s        |        http://stack01:8776/v1/$(tenant_id)s        | 24e2d4df57d7418b90bf6a4fb447d8b7 |
| ce0618edad0f4494a163541314b1f8df | RegionOne |         http://stack01:8773/services/Cloud         |         http://stack01:8773/services/Cloud         |         http://stack01:8773/services/Admin         | 29d821184471480f80ebaab50388a38a |
| ebb4f37942ab457482972c3dfdaf9bf2 | RegionOne |     http://stack01:8888/v1/AUTH_$(tenant_id)s      |     http://stack01:8888/v1/AUTH_$(tenant_id)s      |               http://stack01:8888/v1               | 5ed6d15be2e44591a87a33fbcdb3aaf1 |
+----------------------------------+-----------+----------------------------------------------------+----------------------------------------------------+----------------------------------------------------+----------------------------------+
Keystoneのインストール、設定はここで終了です。