Openstack Rocky でプライベートクラウドを構築する!(2)

前回に引き続き Keystone のインストール、設定を行います。

環境

ソフト

  • Ubuntu 18.04.1 Server 64bit
  • Openstack Rocky

ハード

※コントローラーは仮想マシンでもいけました。

  • CPUx2
  • MEM 8G
  • SSD 30G
  • NIC 2 枚

IP 構成

  • コントローラー ( vm-nfj-osctrln1 )
  • 公開用 ( 外部 ):10.1.55.11/16
  • 管理用 ( 内部 ):10.2.55.11/16
  • コンピュート ( vm-nfj-oscomp1 )
  • 公開用 ( 外部 ):10.1.55.21/16
  • 管理用 ( 内部 ):10.2.55.21/16

Keystone

DB に keystone テーブルを作成します

$ mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 134542
Server version: 10.1.37-MariaDB-1~xenial mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE keystone;
Query OK, 1 row affected (0.01 sec)

アクセス権の設定

pwgen で生成したパスワードを使うようにしましょう。

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'C0E6b!u}fo';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'C0E6b!u}fo';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'10.1.0.0/255.255.0.0'  IDENTIFIED BY 'C0E6b!u}fo';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'10.2.0.0/255.255.0.0'  IDENTIFIED BY 'C0E6b!u}fo';
Query OK, 0 rows affected (0.02 sec)

Keysotne 関連コンポーネントのインストール

HTTP サーバーとして apache2 + mod_wsgi を利用しポート 5000 で LISTEN します。

$ sudo apt install keystone  apache2 libapache2-mod-wsgi

/etc/keystone/keystone.conf の編集

[database] セクションにデータベースアクセスの設定をおこないます。10.2.2.90 の箇所は DB ホストです。コントローラーノード上に MySQL をインストールしている場合は自身のホスト名を指定します。

715 # Directory containing Fernet keys used to encrypt and decrypt credentials
716 # stored in the credential backend. Fernet keys used to encrypt credentials
717 # have no relationship to Fernet keys used to encrypt Fernet tokens. Both sets
718 # of keys should be managed separately and require different rotation policies.
719 # Do not share this repository with the repository used to manage keys for
720 # Fernet tokens. (string value)
721 #key_repository = /etc/keystone/credential-keys/
722 
723 
724 [database]
725 #connection = sqlite:////var/lib/keystone/keystone.db
726 connection = mysql+pymysql://keystone:C0E6b!u}[email protected]/keystone
727 
[token]セクションで Fernet トークンプロバイダを有効化します
2818 # Entry point for the token provider in the `keystone.token.provider`
2819 # namespace. The token provider controls the token construction, validation,
2820 # and revocation operations. Keystone includes `fernet` token provider.
2821 # `fernet` tokens do not need to be persisted at all, but require that you run
2822 # `keystone-manage fernet_setup` (also see the `keystone-manage fernet_rotate`
2823 # command). (string value)
2824 #provider = fernet
2825 provider = fernet

Identity サービス・データベースを移入

$ sudo -s /bin/sh -c "keystone-manage db_sync" keystone

Fernet key リポジトリを初期化

$ sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
$ sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

Identity サービスをブート

pwgen で生成したパスワードを指定する。region-id は好きなものでよいかと。

$ sudo keystone-manage bootstrap --bootstrap-password 'R$8i8eyhev' \
  --bootstrap-admin-url http://vm-nfj-osctrln1:5000/v3/ \
  --bootstrap-internal-url http://vm-nfj-osctrln1:5000/v3/ \
  --bootstrap-public-url http://vm-nfj-osctrln1:5000/v3/ \
  --bootstrap-region-id Tokyo

Apache の設定

/etc/apache2/apache2.conf の ServerName を追記

Global configuration コメントの下あたりに追加しました。

55 # Global configuration
56 #
57 
58 ServerName vm-nfj-osctrln1
59 

apache を再起動しておきます

$ sudo service apache2 restart

管理者アカウントを設定します

$ sudo service apache2 restart
$ export OS_USERNAME=admin
$ export OS_PASSWORD='R$8i8eyhev'
$ export OS_PROJECT_NAME=admin
$ export OS_USER_DOMAIN_NAME=Default
$ export OS_PROJECT_DOMAIN_NAME=Default
$ export OS_AUTH_URL=http://vm-nfj-osctrln1:5000/v3
$ export OS_IDENTITY_API_VERSION=3

ドメイン、プロジェクト、ユーザ、役割の作成

Identity サービスは OpenStack 関連サービスに認証機能を提供します。認証にあたってドメイン、プロジェクト、ユーザ、役割を利用します。

ドメインの作成

$ openstack domain create --description "An Neoflow Domain" neoflow
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | An Neoflow Domain                |
| enabled     | True                             |
| id          | d1bfc27fab7b49e8980042a4dab2612b |
| name        | neoflow                          |
| tags        | []                               |
+-------------+----------------------------------+

プロジェクトの作成

service プロジェクトを作成してみます。

$ openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 583b93f996b64b1c80811bef7f2fe561 |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+

一般プロジェクトの作成

管理者権限を必要としない通常タスク用途では特権のないユーザとプロジェクトを使用するためもう一つ myproject プロジェクトと myuser ユーザを作成してみます。

$ openstack project create --domain default --description "Demo Project" myproject
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 90cd75bfbfd648e995fb45784ed95e0e |
| is_domain   | False                            |
| name        | myproject                        |
| parent_id   | default                          |
| tags        | []                               |
+-------------+----------------------------------+

ユーザの作成

パスワードを聞かれますので myuser ユーザ用のパスワードを入力します。

$ openstack user create --domain default --password-prompt myuser
User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 3176d2b4e6a0490ab8624336c299a6e4 |
| name                | myuser                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

役割の作成

myrole ロール(役割)を作成します。

$ openstack role create myrole
+-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 16d91d84949b4a849b64a7aaeab67db4 |
| name      | myrole                           |
+-----------+----------------------------------+

役割の紐づけ

myrole 役割を myproject プロジェクトと myuser ユーザに紐づけします。特になにも出力されませんがそれで正常です。

$ openstack role add --project myproject --user myuser myrole

操作の検証

他のサービスをインストールする前に、Identity サービスの動作検証をしておきます。

OS_AUTH_URL 一時環境変数を削除

$ unset OS_AUTH_URL OS_PASSWORD

admin ユーザとして認証トークンをリクエスト

$ openstack --os-auth-url http://vm-nfj-osctrln1:5000/v3 --os-project-domain-name Default --os-user-domain-name Default --os-project-name admin --os-username admin token issue
Password: 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2018-11-13T16:15:16+0000                                                                                                                                                                |
| id         | gAAAAABb6uqEApqYTk6LAIyw9mrUgJmL3Vp-XXI7WAumL3UzEUH83ijmz39XHbNHwFk83UZWSmz3pHJyCNisrUzSEL1woOVfgCjkKa8Gk5wu1JN2bbIDtgYJWhiXHCt0VpZNbwMWkQ9c0gSsLuypTT9zy6RS8ZrSz0GDgCxUQ2KQUnOFqtEU4DI |
| project_id | 3b8ce084c51347f38511d61a9f7cd433                                                                                                                                                        |
| user_id    | 6540e9bf162742ab80856e491c3ed8e5                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

myuser ユーザで認証トークンをリクエスト

作成したユーザでも正常にリクエストが通るか確認します。

$ openstack --os-auth-url http://vm-nfj-osctrln1:5000/v3   --os-project-domain-name Default --os-user-domain-name Default   --os-project-name myproject --os-username myuser token issue
Password: 
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2018-11-13T16:18:13+0000                                                                                                                                                                |
| id         | gAAAAABb6us1ZMaOdWg0vQPg6N2aa1V2JMXl6_YceRG-yrLEuQaFf3h-bFo_LA4cWA0zE6bvm38OXER_lbhbP5cbcaCyf1T_8QfCgmRyZXEd7P7U7PM31gOn3Dqz0NqiNx_x1sfZaKApPh4rtW30SBl86-uW-vhytsaQugkaAJ_jGTpyK3Tp6CE |
| project_id | 90cd75bfbfd648e995fb45784ed95e0e                                                                                                                                                        |
| user_id    | 3176d2b4e6a0490ab8624336c299a6e4                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

openstack クライアント用スクリプト

上記の例では環境変数を利用して openstack クライアント動作確認をおこないましたが、OpenRC ファイルというシンプルなスクリプトを利用することがサポートされている。

admin-openrc スクリプトの作成

お好みのエディタで admin-openrc というファイルを作成して中に環境変数と値を書いておきます。

$ 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='R$8i8eyhev'
export OS_AUTH_URL=http://vm-nfj-osctrln1:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

demo-openrc スクリプトの作成

同様に myproject プロジェクトの myuser ユーザ用のスクリプトも作成します。

$ cat demo-openrc 
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=myproject
export OS_USERNAME=myuser
export OS_PASSWORD='[email protected]'
export OS_AUTH_URL=http://vm-nfj-osctrl1n:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2

スクリプトを利用する

$ . admin-openrc 
$ openstack token issue
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Field      | Value                                                                                                                                                                                   |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| expires    | 2018-11-14T03:30:15+0000                                                                                                                                                                |
| id         | gAAAAABb64i3b80MkaHX7iMhZSPd0fhsjrupU1ni_QxYv768WKuhlfTcOaKr-4ofiv9O0BGFAibGHy18yDyyHyGv6zE6WOk6IlT7fSLsLJT-8bTCkoh78f2KIFOpLcDxwy7TsmFizFS_K39B-6jslgUpRd-vMCeCvgS_zgH6mSU0ni4UTGaVPsc |
| project_id | 3b8ce084c51347f38511d61a9f7cd433                                                                                                                                                        |
| user_id    | 6540e9bf162742ab80856e491c3ed8e5                                                                                                                                                        |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

トラブルシューティング

bootstrap コマンドに指定したパスワードを入力しているにもかかわらず 401 が返されて認証失敗となる

$ openstack --os-auth-url http://vm-nfj-osctrln1:5000/v3   --os-project-domain-name Default --os-user-domain-name Default   --os-project-name admin --os-username admin token issue
Password: 
The request you have made requires authentication. (HTTP 401) (Request-ID: req-2ccc33af-8487-471d-a1a9-fc1ce68fad3d)

対応策としては、export OS_PASSWORD=R$8i8eyhev のようにパスワードを環境変数に設定して、env で OS_PASSWORD を見てみると良いです。私の失敗例では結果を確認するとパスワード文字列に$が含まれていたために変数”$8″ として認識されてしまったためパスワードが一致しないというオチであった。。。これは仕方ないか。export の値をシングルクォートでくくるとうまくいきます。

$ export OS_PASSWORD=R$8i8eyhev
$ env | grep OS_PASSWORD
OS_PASSWORD=Ri8eyhev

次回は Glance .

スポンサーリンク