What You See Is What You Get Element

OpenStackによるエンタープライズ・プライベート・クラウドを20分でデプロイする方法(パート1)

Glynn Foster著

このハンズオン・ラボでは、Oracle Solaris 11.2でOpenStackのシングル・ノード・インスタンスをセットアップする方法について説明します。


2015年1月公開


この記事についてコメントする場合は、リンクをFacebookのOTN Garageのページに投稿してください。同様の記事を共有する場合は、FacebookまたはTwitterに投稿してください。みんなで議論しましょう。
目次
はじめに
ラボのセットアップ
演習1:OpenStackパッケージのインストール
演習2:Keystoneの構成
演習3:Glanceの構成
演習4:Novaの構成
演習5:Cinderの構成
演習6:Neutronの構成
演習7:Horizonの構成
演習8:Horizonへのログイン
演習9:インスタンスの起動
演習10:内部的な構成の確認
追加演習
付録—OpenStack hol_single_host.py構成スクリプト
関連項目
著者について

はじめに

このラボでは、Oracle OpenWorld 2014のHands-On Labセッション9821で行った作業について説明します。Oracle Solaris 11でのOpenStack構成方法の基礎について解説します。OpenStackは広く使用されているオープン・ソースのクラウド・インフラストラクチャで、Oracle Solaris 11.2にはこれが統合されていますOpenStackには、Webベースのダッシュボードからデータセンター内のコンピューティング・リソース、ストレージ・リソース、ネットワーク・リソースを一元的に管理するためのさまざまなサービスが含まれています。

図1: リソース管理に便利なOpenStackのダッシュボード。



図1:リソース管理に便利なOpenStackのダッシュボード

OpenStackの各サービスを要約すると表1のようになります。

表1:OpenStackのサービス
サービス名 説明
Nova コンピューティングの仮想化
Cinder ブロック・ストレージ
Neutron ソフトウェア定義ネットワーク(SDN)
Keystone クラウド・サービス間の認証
Glance イメージの管理とデプロイ
Horizon Webベースのダッシュボード

このラボでは、OpenStackをシングル・ノード・インスタンス内でセットアップします。一般的なエンタープライズ・デプロイ環境では、これらのサービスはロードバランシングやその他の高可用性機能によって複数のノードに分散されます。

Oracle Solaris 11.2リリースでは、統合アーカイブと呼ばれる新しいアーカイブ形式が導入されました。統合アーカイブにより、ゴールデン・イメージ方式のデプロイを簡単に実行できます。管理者は稼働中のシステムのスナップショットをすぐに取得し、そのスナップショットをクローンとしてクラウド環境内にデプロイできます。このラボでは、統合アーカイブを作成して、OpenStackのサービスやそれらの構成方法について実際に体験していきます。

ラボのセットアップ

このラボでは以下のセットアップが必要です。

  • Oracle Solaris 11.2(rootのパスワード:solaris11
  • ホスト名solarisとIPアドレス範囲10.158.56.0/21
  • /repository/publishers/solarisにあるOracle Solaris Image Packaging Systemリポジトリのクローン
  • OpenStack構成スクリプト:/root/hol_single_host.pyに配置(このスクリプトは付録に記載されています。このスクリプトはローカルに配置し、rootユーザーまたは特権ユーザーで実行する必要があります)

最初に、ホストOSでターミナル・ウィンドウを起動し、ユーザー名/パスワードとしてroot/solaris11と指定し、SSH接続を開始します。

# ssh root@10.158.56.x
Password: 
Oracle Corporation      SunOS 5.11      11.2    June 2014

演習1:OpenStackパッケージのインストール

まず、以下のコマンドを実行して、Image Packaging SystemリポジトリからOpenStackパッケージをインストールします。

# pkg install openstack rabbitmq rad-evs-controller
           Packages to install:182
            Services to change:   3
       Create boot environment:No
Create backup boot environment:Yes
DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                            182/182   23198/23198  116.4/116.4  806k/s

PHASE                                          ITEMS
Installing new actions                   26599/26599
Updating package state database                 Done 
Updating package cache                           0/0 
Updating image state                            Done 
Creating fast lookup database                   Done 
Updating package cache                           1/1 

パッケージが正常にインストールされたので、次にOracle Solaris Service Management Facilityサービスのrad:localを再起動する必要があります。Oracle Solarisリモート管理デーモン(rad)は、OpenStack用のOracle Solarisプラグインで利用するOracle Solaris 11の管理インタフェースに、プログラムからアクセスできるようにします。

# svcadm restart rad:local

また、オープン・ソースのRabbitMQサービスも有効化する必要があります。RabbitMQはメッセージ・システムであり、OpenStackコア・サービス間で通信できるようにします。

# svcadm enable rabbitmq
# svcs rabbitmq
STATE          STIME    FMRI
online         23:58:04 svc:/application/rabbitmq:default

演習2:Keystoneの構成

Keystoneは、OpenStackコア・サービス間での認証機能を提供します。このラボで構成して有効化する1つ目のサービスです。

OpenStackは、一連の構成ファイルを利用します。構成ファイルには、キーと値のペアから成るセクションが定義されます。この1つ目のサービスについては手動で適切な設定を行いますが、以降のサービスについては便宜上、スクリプトを利用します。

/etc/keystone/keystone.confファイルを編集して、以下のように設定します。

[DEFAULT]
admin_token = ADMIN

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

[catalog]
driver = keystone.catalog.backends.sql.Catalog

[token]
provider = keystone.token.providers.uuid.Provider

[signing]
token_format = UUID

Keystoneサービスを有効化します。

# svcadm enable -rs keystone
# svcs keystone
STATE          STIME    FMRI
online         23:59:31 svc:/application/openstack/keystone:default

認証を成功させるためには、OpenStackコア・サービスに対応した各テナントにわたって存在するユーザーを、Keystoneデータベースに移入する必要があります。この例では、sample_data.shスクリプトによって提供されるサンプル・データ(表2を参照)を利用します。このスクリプトは、OpenStack基本パッケージに含まれています。本番環境では、LDAPやMicrosoft Active Directoryなどのディレクトリ・サービスとKeystoneを関連付けることになります。

表2:Keystoneデータベースの移入に利用するサンプル・データ
ユーザー テナント パスワード
admin demo secrete
nova service nova
cinder service cinder
neutron service neutron
glance service glance

sample_data.shスクリプトを実行します。

# /usr/demo/openstack/keystone/sample_data.sh
+-------------+---------------------------------------+
|   Property  |                 Value                 |
+-------------+---------------------------------------+
|   adminurl  |  http://localhost:$(admin_port)s/v2.0 |
|      id     |    cdd38de578ffe450a4ebd17e6345ed72   |
| internalurl | http://localhost:$(public_port)s/v2.0 |
|  publicurl  | http://localhost:$(public_port)s/v2.0 |
|    region   |               RegionOne               |
|  service_id |    db9909b96b916b6ed04a818c6f407df0   |
+-------------+---------------------------------------+
+-------------+------------------------------------------------------+
|   Property  |                        Value                         |
+-------------+------------------------------------------------------+
|   adminurl  | http://localhost:$(compute_port)s/v1.1/$(tenant_id)s |
|      id     |           48d62b0291f44c258f0bef5fe72024b9           |
| internalurl | http://localhost:$(compute_port)s/v1.1/$(tenant_id)s |
|  publicurl  | http://localhost:$(compute_port)s/v1.1/$(tenant_id)s |
|    region   |                      RegionOne                       |
|  service_id |           c38ced19a4894a5bc61cbb77e9868bbf           |
+-------------+------------------------------------------------------+
+-------------+----------------------------------------+
|   Property  |                 Value                  |
+-------------+----------------------------------------+
|   adminurl  | http://localhost:8776/v1/$(tenant_id)s |
|      id     |    975e3db88eb56836e779e1b0e8d2dd21    |
| internalurl | http://localhost:8776/v1/$(tenant_id)s |
|  publicurl  | http://localhost:8776/v1/$(tenant_id)s |
|    region   |               RegionOne                |
|  service_id |    39daf3d31c0348f0ae32b04a2ed3dbc4    |
+-------------+----------------------------------------+
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
|   adminurl  |      http://localhost:9292       |
|      id     | a77c1ed7d1a44751afeed55e2e0bbc99 |
| internalurl |      http://localhost:9292       |
|  publicurl  |      http://localhost:9292       |
|    region   |            RegionOne             |
|  service_id | 903f1738fc066deed8a8c4a38925d1e5 |
+-------------+----------------------------------+
+-------------+--------------------------------------+
|   Property  |                Value                 |
+-------------+--------------------------------------+
|   adminurl  | http://localhost:8773/services/Admin |
|      id     |   86d0e7f081d7e512b6638534f391b6ee   |
| internalurl | http://localhost:8773/services/Cloud |
|  publicurl  | http://localhost:8773/services/Cloud |
|    region   |              RegionOne               |
|  service_id |   86b96889f88be522abf19d7ff8e7db18   |
+-------------+--------------------------------------+
+-------------+---------------------------------------------+
|   Property  |                    Value                    |
+-------------+---------------------------------------------+
|   adminurl  |           http://localhost:8080/v1          |
|      id     |       756642548112e822be94a5da3a73588e      |
| internalurl | http://localhost:8080/v1/AUTH_$(tenant_id)s |
|  publicurl  | http://localhost:8080/v1/AUTH_$(tenant_id)s |
|    region   |                  RegionOne                  |
|  service_id |       6d22986ee9c76880e0f0c0da4aa8fe0f      |
+-------------+---------------------------------------------+
+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
|   adminurl  |      http://localhost:9696/      |
|      id     | bbe5bf886bff4c089c0dbc42a65fa521 |
| internalurl |      http://localhost:9696/      |
|  publicurl  |      http://localhost:9696/      |
|    region   |            RegionOne             |
|  service_id | f5c6aeb5a53bceb6f022b85e0b63956f |
+-------------+----------------------------------+

この結果を検証します。このためには、環境変数のSERVICE_ENDPOINTSERVICE_TOKENを設定し、クライアント・サイドのコマンドであるkeystoneを実行します。

# export SERVICE_ENDPOINT=http://localhost:35357/v2.0/
# export SERVICE_TOKEN=ADMIN
# keystone user-list
+----------------------------------+---------+---------+-------+
|                id                |   name  | enabled | email |
+----------------------------------+---------+---------+-------+
| 5bdefb773d3c61fed79d96c5540f9766 |  admin  |   True  |       |
| 8b54a70c235ee1179f15a198a70be099 |  cinder |   True  |       |
| 7949ac987dd5c514e778ba3932586109 |   ec2   |   True  |       |
| d79d19dc2945ed758747c2e2d8ab7e89 |  glance |   True  |       |
| ac11eb0e1aed68f2c45085797c8bade5 | neutron |   True  |       |
| d9e6d0ddfbaf4ca6a6ee9bb951877d3d |   nova  |   True  |       |
| eb3237eea75ae619aba6cf75a49f798f |  swift  |   True  |       |
+----------------------------------+---------+---------+-------+

演習3:Glanceの構成

Glanceは、OpenStackのイメージ管理を行うサービスです。このサービスは、新しい仮想マシン(VM)インスタンスの作成時にコンピューティング・ノード上にインストールする一連のイメージを管理します。このサービスは、いくつかの異なるサービスから成り、最初にそれらのサービスを構成する必要があります。便宜上、この構成をすぐに実行するために、付録に記載されているhol_single_host.pyスクリプトを利用します。

# ./hol_single_host.py glance
configuring glance

このスクリプトにより以下のファイルが構成され、さらにGlanceエンドポイントに対して適切な構成(通常はユーザー/パスワード情報)が適用されます。

  • /etc/glance/glance-api.conf
  • /etc/glance/glance-registry.conf
  • /etc/glance/glance-cache.conf
  • /etc/glance/glance-api-paste.ini
  • /etc/glance/glance-registry-paste.ini
  • /etc/glance/glance-scrubber.conf

Glanceサービスを有効化します。

# svcadm enable -rs glance-api glance-db glance-registry glance-scrubber

以下のコマンドを実行して、この構成が正常に行われたかを確認できます。この実行結果より、イメージ・レジストリに正常に接続できてはいるものの、現時点ではGlanceにロードされているイメージがないことが分かります。

# export OS_AUTH_URL=http://localhost:5000/v2.0/
# export OS_PASSWORD=glance
# export OS_USERNAME=glance
# export OS_TENANT_NAME=service
# glance image-list
+----+------+-------------+------------------+------+--------+
| ID | Name | Disk Format | Container Format | Size | Status |
+----+------+-------------+------------------+------+--------+
+----+------+-------------+------------------+------+--------+

次に、Glanceに対して、インスタンス用に利用可能なイメージを移入します。Oracle Solaris実装では、統合アーカイブと呼ばれる新しいタイプのアーカイブを利用できます。そのため、ここでは統合アーカイブを作成します。

コンピューティング・サービス用の仮想化テクノロジーとしてOracle Solarisゾーンを利用するため、まずは非大域ゾーンを作成する必要があります。

# zonecfg -z myzone create
# zoneadm -z myzone install
The following ZFS file system(s) have been created:
    rpool/VARSHARE/zones/myzone
Progress being logged to /var/log/zones/zoneadm.20140911T002211Z.myzone.install
       Image:Preparing at /system/zones/myzone/root.

 Install Log:/system/volatile/install.2985/install_log
 AI Manifest:/tmp/manifest.xml.JFaOZf
  SC Profile:/usr/share/auto_install/sc_profiles/enable_sci.xml
    Zonename: myzone
Installation:Starting ...

        Creating IPS image
Startup linked:1/1 done
        Installing packages from:
            solaris
                origin:http://localhost:8008/
DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                            282/282   53274/53274  351.9/351.9  4.1M/s

PHASE                                          ITEMS
Installing new actions                   71043/71043
Updating package state database                 Done 
Updating package cache                           0/0 
Updating image state                            Done 
Creating fast lookup database                   Done 
Updating package cache                           1/1 
Installation:Succeeded

        Note:Man pages can be obtained by installing pkg:/system/manual

 done.

        Done:Installation completed in 230.010 seconds.


  Next Steps:Boot the zone, then log into the zone console (zlogin -C)

              to complete the configuration process.

Log saved in non-global zone as /system/zones/myzone/root/var/log/zones/zoneadm.20140911T002211Z.myzone.install
# zoneadm -z myzone boot
# zoneadm list -cv
  ID NAME             STATUS      PATH                         BRAND      IP    
   0 global           running     /                            solaris    shared
   1 myzone           running     /system/zones/myzone         solaris    excl

次に、最後の構成を行うため、このゾーンにログインします。

# zlogin -C myzone
[Connected to zone 'myzone' console]

ログイン後、Oracle Solarisシステム構成ツールが表示されます。作成したゾーンをアーカイブする前に、このツールを用いて残りの構成を行います(表3を参照)。この構成はゾーンのデプロイ時には使用しませんが、アーカイブの作成前にこの構成を行っておく必要があります。このツールはファンクション・キーで操作できます。

表3:システム構成ツールで指定する構成情報
項目 設定内容
ホスト名 myzone
ネットワーク 192.168.56.100(手動設定)
DNS DNSの構成はなし
ネーム・サービス なし
タイムゾーンとロケール 任意の設定を選択
rootパスワード solaris11

構成情報の選択を完了すると、以下のような出力が表示されます。

SC profile successfully generated as:
/etc/svc/profile/sysconfig/sysconfig-20140911-002744/sc_profile.xml

Exiting System Configuration Tool.Log is available at:
/system/volatile/sysconfig/sysconfig.log.4666
Hostname: myzone

myzone console login:

これで、rootユーザー(パスワードsolaris11)でログインできます。

myzone console login:root
Password:solaris11
Sep 11 00:33:57 myzone login:ROOT LOGIN /dev/console
Oracle Corporation      SunOS 5.11      11.2    June 2014

virtinfoコマンドを実行すると、現在非大域ゾーンにいることが分かります。

root@myzone:~# virtinfo
NAME            CLASS   
non-global-zone current 
logical-domain   parent

統合アーカイブを作成する前に、もう1つ別の構成を行う必要があります。OpenStackを用いてインスタンスをデプロイする際には、SSH公開キーペアを指定する必要があります。SSH公開キーペアは、通常はインスタンスへのおもな認証手法として利用されます。パスワード不要の運用にするため、ゾーンのスナップショットを作成する前に、この非大域ゾーン内で稼働するSSHサーバー・サービスの構成を一部変更する必要があります。

/etc/ssh/sshd_configファイルを編集します。

root@myzone:~# vi /etc/ssh/sshd_config

PermitRootLoginというキーと値のペアを探し、without-passwordと設定します。

PermitRootLogin without-password

~~.エスケープ・シーケンスを入力して、ゾーンから出ます。

root@myzone:~# ~~.
#

これでようやく統合アーカイブを作成できます。

# archiveadm create -z myzone myzone.uar
Initializing Unified Archive creation resources...
Unified Archive initialized:/root/myzone.uar
Logging to:/system/volatile/archive_log.5578
Executing dataset discovery...
Dataset discovery complete
Creating install media for zone(s)...
Media creation complete
Preparing archive system image...
Beginning archive stream creation...
Archive stream creation complete
Beginning final archive assembly...
Archive creation complete

次に、イメージをGlanceにアップロードします。

# export OS_AUTH_URL=http://localhost:5000/v2.0/
# export OS_PASSWORD=glance
# export OS_USERNAME=glance
# export OS_TENANT_NAME=service
# glance image-create --container-format bare --disk-format raw \
--is-public true --name "Base Zone" --property architecture=sparc64 \
--property hypervisor_type=solariszones \
--property vm_mode=solariszones < myzone.uar 
+----------------------------+--------------------------------------+
| Property                   | Value                                |
+----------------------------+--------------------------------------+
| Property 'architecture'    | sparc64                              |
| Property 'hypervisor_type' | solariszones                         |
| Property 'vm_mode'         | solariszones                         |
| checksum                   | 336bdfe5f76876fe24907e35479101e7     |
| container_format           | bare                                 |
| created_at                 | 2014-09-11T00:52:14.269232           |
| deleted                    | False                                |
| deleted_at                 | None                                 |
| disk_format                | raw                                  |
| id                         | b42e47ee-d8dc-e50c-d6e0-9206d761ce41 |
| is_public                  | True                                 |
| min_disk                   | 0                                    |
| min_ram                    | 0                                    |
| name                       | Base Zone                            |
| owner                      | f17341f0a2a24ec9ec5f9ca497e8c0cc     |
| protected                  | False                                |
| size                       | 1277245440                           |
| status                     | active                               |
| updated_at                 | 2014-09-11T00:52:42.352947           |
+----------------------------+--------------------------------------+

演習4:Novaの構成

NovaはOpenStackのコンピューティング・サービスであり、新しいインスタンスのスケジュール設定やデプロイを行います。Glanceと同様に複数のサービスから成り、それらのサービスを構成して有効化する必要があります。ここでもスクリプトを用いて、すばやく構成します。

# ./hol_single_host.py nova
configuring nova

さらに、Novaではサービスの起動順に少し気を配る必要があります。まず、コンダクタ・サービス(原則的に、コンピューティング・ノードからNovaデータベースへのアクセスをプロキシするサービス)を有効化してから、他のサービスを有効化してください。

# svcadm enable -rs nova-conductor
# svcadm enable -rs nova-api-ec2 nova-api-osapi-compute nova-scheduler nova-cert nova-compute

Novaが正常に機能しているかを確認します。いくつかの環境変数を設定して、エンドポイントの情報を表示します。

# export OS_AUTH_URL=http://localhost:5000/v2.0/
# export OS_PASSWORD=nova
# export OS_USERNAME=nova
# export OS_TENANT_NAME=service
# nova endpoints
+-------------+-------------------------------------------------------------+
| nova        | Value                                                       |
+-------------+-------------------------------------------------------------+
| adminURL    | http://localhost:8774/v1.1/f17341f0a2a24ec9ec5f9ca497e8c0cc |
| id          | 08eb495c11864f67d4a0e58c8ce53e8b                            |
| internalURL | http://localhost:8774/v1.1/f17341f0a2a24ec9ec5f9ca497e8c0cc |
| publicURL   | http://localhost:8774/v1.1/f17341f0a2a24ec9ec5f9ca497e8c0cc |
| region      | RegionOne                                                   |
| serviceName | nova                                                        |
+-------------+-------------------------------------------------------------+
+-------------+----------------------------------+
| neutron     | Value                            |
+-------------+----------------------------------+
| adminURL    | http://localhost:9696/           |
| id          | 96e693c539c0ca3ee5f0c04e958c33fe |
| internalURL | http://localhost:9696/           |
| publicURL   | http://localhost:9696/           |
| region      | RegionOne                        |
+-------------+----------------------------------+
+-------------+----------------------------------+
| glance      | Value                            |
+-------------+----------------------------------+
| adminURL    | http://localhost:9292            |
| id          | 121ad7a65c0fce83834583b2c0c7c3fb |
| internalURL | http://localhost:9292            |
| publicURL   | http://localhost:9292            |
| region      | RegionOne                        |
+-------------+----------------------------------+
+-------------+-----------------------------------------------------------+
| cinder      | Value                                                     |
+-------------+-----------------------------------------------------------+
| adminURL    | http://localhost:8776/v1/f17341f0a2a24ec9ec5f9ca497e8c0cc |
| id          | ee83dab8b39d4d0ad480a75cadb965dc                          |
| internalURL | http://localhost:8776/v1/f17341f0a2a24ec9ec5f9ca497e8c0cc |
| publicURL   | http://localhost:8776/v1/f17341f0a2a24ec9ec5f9ca497e8c0cc |
| region      | RegionOne                                                 |
+-------------+-----------------------------------------------------------+
+-------------+--------------------------------------+
| ec2         | Value                                |
+-------------+--------------------------------------+
| adminURL    | http://localhost:8773/services/Admin |
| id          | 1558b719141ae2fed54ff0bfe80cb646     |
| internalURL | http://localhost:8773/services/Cloud |
| publicURL   | http://localhost:8773/services/Cloud |
| region      | RegionOne                            |
+-------------+--------------------------------------+
+-------------+----------------------------------------------------------------+
| swift       | Value                                                          |
+-------------+----------------------------------------------------------------+
| adminURL    | http://localhost:8080/v1                                       |
| id          | 51f1908de52f68af984c849985924e0b                               |
| internalURL | http://localhost:8080/v1/AUTH_f17341f0a2a24ec9ec5f9ca497e8c0cc |
| publicURL   | http://localhost:8080/v1/AUTH_f17341f0a2a24ec9ec5f9ca497e8c0cc |
| region      | RegionOne                                                      |
+-------------+----------------------------------------------------------------+
+-------------+----------------------------------+
| keystone    | Value                            |
+-------------+----------------------------------+
| adminURL    | http://localhost:35357/v2.0      |
| id          | 371c73559bd842d6b961d021eeeaa2e5 |
| internalURL | http://localhost:5000/v2.0       |
| publicURL   | http://localhost:5000/v2.0       |
| region      | RegionOne                        |
+-------------+----------------------------------+

正常に機能しているため、次に進みます。

演習5:Cinderの構成

Cinderは、OpenStackでブロック・ストレージを提供します。ブロック・ストレージは通常、コンピューティング・インスタンスに関連付けます。これまでと同様に、複数のサービスを構成して有効化する必要があります。

# ./hol_single_host.py cinder
configuring cinder
# svcadm enable -rs cinder-api cinder-db cinder-scheduler cinder-volume:setup cinder-volume:default

すべて正常に構成されたことを再確認します。

# export OS_AUTH_URL=http://localhost:5000/v2.0/
# export OS_PASSWORD=cinder
# export OS_USERNAME=cinder
# export OS_TENANT_NAME=service
# cinder list
+----+--------+--------------+------+-------------+----------+-------------+
| ID | Status | Display Name | Size | Volume Type | Bootable | Attached to |
+----+--------+--------------+------+-------------+----------+-------------+
+----+--------+--------------+------+-------------+----------+-------------+

まだブロック・ストレージを割り当てていないため、この結果は正常です。

演習6:Neutronの構成

NeutronはOpenStackでネットワーク機能を提供し、同じテナント内やサブネット内でのVMの相互通信や、VMから外部への直接通信を実行できるようにします。この機能は、異なる多数のサービスによって実現されます。Oracle Solaris実装は内部的にElastic Virtual Switch(EVS)を利用します。EVSは、複数のコンピューティング・ノードにわたって必要な調査を行い、トラフィックを適切にルーティングします。EVSとNeutron間でSSHキーとradを用いてある程度の信頼性を確保するには、一部の構成をOpenStackの外部で行う必要があります。

まず、evsuserneutronrootの各ユーザーのSSHキーを生成しましょう。

# su - evsuser -c "ssh-keygen -N '' -f /var/user/evsuser/.ssh/id_rsa -t rsa"
Generating public/private rsa key pair.
Your identification has been saved in /var/user/evsuser/.ssh/id_rsa.
Your public key has been saved in /var/user/evsuser/.ssh/id_rsa.pub.
The key fingerprint is:
13:cb:06:c4:88:5e:10:7d:84:8b:c8:38:30:83:89:9f evsuser@solaris
# su - neutron -c "ssh-keygen -N '' -f /var/lib/neutron/.ssh/id_rsa -t rsa"
Generating public/private rsa key pair.
Created directory '/var/lib/neutron/.ssh'.
Your identification has been saved in /var/lib/neutron/.ssh/id_rsa.
Your public key has been saved in /var/lib/neutron/.ssh/id_rsa.pub.
The key fingerprint is:
13:d6:ef:22:4b:f0:cf:9f:14:e3:ee:50:05:1a:c7:a5 neutron@solaris
# ssh-keygen -N '' -f /root/.ssh/id_rsa -t rsa 
Generating public/private rsa key pair.
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
c1:6f:a5:38:fc:11:85:16:ad:1d:ad:cd:2f:38:ce:26 root@solaris

次に、これらのサービス間でパスワード不要のアクセスを実現するために、さまざまなSSH公開キーをauthorized_keysに追加する必要があります。

# cat /var/user/evsuser/.ssh/id_rsa.pub /var/lib/neutron/.ssh/id_rsa.pub /root/.ssh/id_rsa.pub \
>> /var/user/evsuser/.ssh/authorized_keys

最後に、これらのサービスにログインして、1回限りの質問に答える必要があります。

# su - evsuser -c "ssh evsuser@localhost true"
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 36:9b:74:4b:e9:57:11:70:bc:71:d6:4d:77:b4:74:b3.
Are you sure you want to continue connecting (yes/no)?yes
Warning:Permanently added 'localhost' (RSA) to the list of known hosts.
# su - neutron -c "ssh evsuser@localhost true"
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 36:9b:74:4b:e9:57:11:70:bc:71:d6:4d:77:b4:74:b3.
Are you sure you want to continue connecting (yes/no)?yes
Warning:Permanently added 'localhost' (RSA) to the list of known hosts.
# ssh evsuser@localhost true
The authenticity of host 'localhost (::1)' can't be established.
RSA key fingerprint is 36:9b:74:4b:e9:57:11:70:bc:71:d6:4d:77:b4:74:b3.
Are you sure you want to continue connecting (yes/no)?yes
Warning:Permanently added 'localhost' (RSA) to the list of known hosts.

Oracle Solarisでは、コントローラという概念を用いて、データセンター内の複数のリソースにわたってEVSを管理します。コントローラは、一元化された調整ポイントです。このノードに適切なコントローラを構成し(複数のコンピューティング・ノードでこの構成を行う場合は、それぞれのコンピューティング・ノードで同じ作業を行う必要があります)、EVSデータベースを初期化します。

# evsadm set-prop -p controller=ssh://evsuser@localhost
# evsadm
# evsadm show-prop
PROPERTY            PERM VALUE                         DEFAULT
controller          rw   ssh://evsuser@localhost       --

このセットアップでは、VXLANを利用して、ネットワーク・トラフィックに適切にタグを付け、トラフィックを分離します。そのように構成するには、以下のコマンドを実行します。

# evsadm set-controlprop -p l2-type=vxlan
# evsadm set-controlprop -p vxlan-range=200-300

また、コントローラのアップリンク・ポートとしてnet0(ここで利用できる唯一のNIC)を設定する必要があります。

# evsadm set-controlprop -p uplink-port=net0
# evsadm show-controlprop
PROPERTY            PERM VALUE               DEFAULT             HOST
l2-type             rw   vxlan               vlan                --
uplink-port         rw   net0                --                  --
vlan-range          rw   --                  --                  --
vlan-range-avail    r-   --                  --                  --
vxlan-addr          rw   0.0.0.0             0.0.0.0             --
vxlan-ipvers        rw   v4                  v4                  --
vxlan-mgroup        rw   0.0.0.0             0.0.0.0             --
vxlan-range         rw   200-300             --                  --
vxlan-range-avail   r-   200-300             --                  --

これで、EVSによる基本構成が完了したので、この基本構成を利用するようにNeutronを構成できます。ここでは便宜上、スクリプトを利用します。

# ./hol_single_host.py neutron
configuring neutron
# svcadm enable -rs neutron-server neutron-dhcp-agent

Neutronをテストし、正常に機能していることを確認しましょう。

# export OS_AUTH_URL=http://localhost:5000/v2.0/
# export OS_PASSWORD=neutron
# export OS_USERNAME=neutron
# export OS_TENANT_NAME=service
# neutron net-list

まだネットワークを作成していないため、結果が空であることは想定内です。

演習7:Horizonの構成

最後に、Horizonを構成します。HorizonはOpenStack用のWebベースのダッシュボードであり、マルチテナント環境でのセルフサービス機能を提供します。スクリプトを利用してこの構成を行います。

# ./hol_single_host.py horizon
configuring horizon
# cp /etc/apache2/2.2/samples-conf.d/openstack-dashboard-http.conf /etc/apache2/2.2/conf.d
# svcadm enable apache22
# svcs apache22
STATE          STIME    FMRI
online          1:53:42 svc:/network/http:apache22

演習8:Horizonへのログイン

ホスト環境内でブラウザを起動し、割り当てられたIPアドレス(http://10.158.56.x/horizon)にアクセスします。ログイン画面で、ユーザー名/パスワードとしてadmin/secreteと指定します。

図2: ログイン画面

図2:ログイン画面

サインイン後、OpenStack管理者向けのメイン・ダッシュボードが表示されます。画面の左側には、管理パネルとプロジェクト・パネルをそれぞれ示す2つのタブがあります。プロジェクト・パネルには、この現在のユーザーが属しているプロジェクトが一覧表示されます。プロジェクトは、組織的なグループに分類するための手段と考えてください。

ここでは、管理者としてインスタンスを起動せずに、Adminタブで新しいユーザーを作成します。メニューから「Users」を選択して、以下の画面を開きます。

図3: Users画面


図3:Users画面

数人のユーザーがすでに定義されています。定義済みのユーザーは管理者か、または各種OpenStackサービス向けのユーザーです。

Create User」ボタンをクリックし、このユーザーの詳細情報を入力します(図4を参照)。ここでは、この新しいユーザーをデモ・プロジェクトに追加しますが、必要であれば同様に新しいプロジェクトを作成してもかまいません。

図4: Create User画面


図4:Create User画面

サインアウトし、この新しいユーザーでログインします。

次に必要となる作業は、このユーザーの鍵ペアの追加です。メニューから「Access & Security」を選択して、以下の画面を開きます。

図5: Access & Security画面

図5:Access & Security画面

現時点では、鍵ペアは定義されていません。「Import Keypair」ボタンをクリックして、図6のImport Keypair画面を開きます。

この例では、大域ゾーンのSSH公開鍵を利用します。まず、以下のコマンドを実行して鍵を取得し、この鍵をImport Keypair画面のPublic Keyフィールドに入力します。

 root@solaris:~# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA0Khp4Th5VcKQW4LttqzKAR8O60gj43cB0CbdpiizEhXEbVgjI7IlnZl
o9iSEFpJlnZrFQC8MU2L7Hn+CD5nXLT/uK90eAEVXVqwc4Y7IVbEjrABQyB74sGnJy+SHsCGgetjwVrifR9
fkxFHgjxXkOunXrPMe86hDJRpZLJFGYZZezJRtd1eRwVNSHhJdZmUac7cILFJen/wSsM8TOSAkh+ZWEhwY3
o08nZg2IWdMImPbwPwtRohJSH3W7XkDE85d7UZebNJpD9kDAw6OmXsY5CLgV6gEoUExZ/J4k29WOrr1XKR3
jiRqQlf3Kw4YuK9JUi/gPhg2lTOhISgJoelorQ== root@solaris

図6: Import Keypair画面


図6:Import Keypair画面

SSH鍵ペアのインポート終了後、このインスタンス用のネットワークを作成します。メニューから「Networks」を選択して、以下の画面を開きます。

図7: Networks画面

図7:Networks画面

現時点でネットワークは定義されていません。新しいネットワークを作成しましょう。まず、「Create Network」ボタンをクリックします。

mynetworkというネットワークを、サブネット名mysubnetとして、192.168.x.0/24のアドレス範囲で作成します。この指定により、このネットワークを選択するインスタンスは、このアドレス範囲内(192.168.x.3から始まる)で作成されます。

図8: Create Network画面


図8:Create Network画面

作成後のネットワークがNetworks画面の一覧に表示されます。

図9: Networks画面に表示される作成後のネットワーク

図9:Networks画面に表示される作成後のネットワーク

これで、新しいインスタンスを起動できるようになりました。メニューから「Instances」を選択して、以下の画面を開きます。

図10: Instance画面

図10:Instance画面

演習9:インスタンスの起動

新しいインスタンスを起動しましょう。まず、「Launch Instance」ボタンをクリックします。

インスタンスの名称はmyinstanceとします。このインスタンスに、tinyというOracle Solaris非大域ゾーンのフレーバを指定します。フレーバは、このインスタンスに付与する必要があるリソースの規模を表します。図11から分かるように、10GBのルート・ディスクと2,048MBのRAMが適用されます。このインスタンスを、先ほどアップロードしてGlanceに保管したイメージ(Base Zoneという名称のもの)からブートするようにします。

図11: Launch Instance画面


図11:Launch Instance画面

Detailsタブの内容に問題がなければ、次にAccess & Securityタブに移ります。この画面では、先ほどの鍵ペアが選択済みですので、すぐにNetworkingタブに移ります。この画面で、ネットワークとして「mynetwork」を選択し、「Launch」ボタンをクリックします。

図12: Networkingタブ


図12:Networkingタブ

少し待った後、インスタンスが192.168.x.3というIPアドレスにより正常にブートされます。

図13: インスタンスのステータスが"アクティブ"であることを示す画面

図13:インスタンスのステータスが"アクティブ"であることを示す画面

これで、このインスタンスにログインできるようになりました。このラボでは、内部ネットワーク・トポロジをセットアップするだけの単純な手順を確認しました。一般的なクラウド環境では、VMが外部と通信するための外部ネットワークをセットアップします。そのようなVMには、大域ゾーンからアクセスする必要があります。

root@solaris:~# ssh root@192.168.x.3
The authenticity of host '192.168.66.3 (192.168.66.3)' can't be established.
RSA key fingerprint is 89:64:96:91:67:ab:6b:35:58:37:35:b8:ab:f3:e5:98.
Are you sure you want to continue connecting (yes/no)?yes
Warning:Permanently added '192.168.66.3' (RSA) to the list of known hosts.
Last login:Thu Sep 11 00:33:57 2014
Oracle Corporation      SunOS 5.11      11.2    June 2014
root@host-192-168-66-3:~# ipadm
NAME              CLASS/TYPE STATE        UNDER      ADDR
lo0               loopback   ok           --         --
   lo0/v4         static     ok           --         127.0.0.1/8
   lo0/v6         static     ok           --         ::1/128
net0              ip         ok           --         --
   net0/dhcp      inherited  ok           --         192.168.66.3/24
root@host-192-168-66-3:~# exit
logout
Connection to 192.168.66.3 closed.

演習10:内部的な構成の確認

大域ゾーンから、OpenStackにより作成された要素を確認します。まず、作成されたゾーンを確認します。

root@solaris:~# zoneadm list -cv
  ID NAME             STATUS      PATH                         BRAND      IP    
   0 global           running     /                            solaris    shared
   2 instance-00000001 running     /system/zones/instance-00000002 solaris    excl

リスト1

リスト1では、1つの非大域ゾーンが正常に稼働していることが分かります。この非大域ゾーンがNovaインスタンスに相当します。次に、このインスタンスに対して作成されたネットワークを確認します。

root@solaris:~# ipadm
NAME              CLASS/TYPE STATE        UNDER      ADDR
evsaf75747a_3_0   ip         ok           --         --
   evsaf75747a_3_0/v4 static ok           --         192.168.66.2/24
lo0               loopback   ok           --         --
   lo0/v4         static     ok           --         127.0.0.1/8
   lo0/v6         static     ok           --         ::1/128
net0              ip         ok           --         --
   net0/v4        static     ok           --         10.158.56.70/24

リスト2

リスト2では、新しいNICがあることが分かります。以前、このVMでは1つの物理NICしかなかったことを考慮すると、新しいNICは仮想NICであることがうかがえます。実際に確認しましょう。

root@solaris:~# dladm show-vnic
LINK                OVER              SPEED  MACADDRESS        MACADDRTYPE VIDS
evsaf75747a_3_0     evs-vxlan200      1000   2:8:20:6d:cb:f4   fixed       0
instance-00000002/net0 evs-vxlan200   1000   2:8:20:72:63:4a   fixed       0

リスト3

リスト3では、新しいNICはVNICであることが分かりますが、さらに新しいインスタンス向けにVNICが作成されています。EVSでどのような構成が行われたかを確認しましょう。

root@solaris:/rpool# evsadm show-evs
EVS           TENANT        STATUS NVPORTS IPNETS      HOST
mynetwork     49068a0d5bce6f8780e7bb786feb9d75 busy 2 mysubnet solaris

リスト4

リスト4では、1つのElastic Virtual Switchが作成されていることが分かります。このサブネットのIPネットワークを調べましょう。

root@solaris:/rpool# evsadm show-ipnet
NAME                TENANT        SUBNET            DEFROUTER         AVAILRANGE
mynetwork/mysubnet  49068a0d5bce6f8780e7bb786feb9d75 192.168.66.0/24 192.168.66.1 192.168.66.4-192.168.66.254

リスト5

リスト5では、192.168.x.0/24のサブネットが作成され、そのデフォルト・ルーターは192.168.x.1であることが分かります。この仮想スイッチがどのように構成されているかを確認するために、割り当てられている仮想ポートを調査します(リスト6を参照)。

root@solaris:~# evsadm show-vport
NAME                TENANT        STATUS VNIC         HOST
mynetwork/af75747a396811e4a440a52ebd715acf 49068a0d5bce6f8780e7bb786feb9d75 used evsaf75747a_3_0 solaris
mynetwork/1fd1bb30397211e4962c317e4dba6ecd 49068a0d5bce6f8780e7bb786feb9d75 used instance-00000005/net0 solaris

リスト6

最後に、このElastic Virtual Switchのプロパティを確認します(リスト7を参照)。

root@solaris:~# evsadm show-evsprop
EVS           TENANT        PROPERTY  PERM VALUE     DEFAULT   POSSIBLE
mynetwork     49068a0d5bce6f8780e7bb786feb9d75 maxbw rw -- --  --
mynetwork     49068a0d5bce6f8780e7bb786feb9d75 priority rw -- medium low,medium,
                                                               high
mynetwork     49068a0d5bce6f8780e7bb786feb9d75 l2-type r- vxlan -- --
mynetwork     49068a0d5bce6f8780e7bb786feb9d75 vlanid r- -- -- --
mynetwork     49068a0d5bce6f8780e7bb786feb9d75 vni r- 200 --   --
mynetwork     49068a0d5bce6f8780e7bb786feb9d75 tenant r- 49068a0d5bce6f8780e7bb786feb9d75 -- --

リスト7

もう一度AdminタブのVolumesメニューに移り、ブロック・ストレージをプロビジョニングします。myvolume1GBのサイズ)の作成後、この画面は以下のようになります。

図14: Volumes画面

図14:Volumes画面

もう一度zfs listコマンドを実行して大域ゾーンを確認すると(リスト8を参照)、新しいデータセットがrpool/cinderの下に作成されていることが分かります。これは、デフォルトのCinderプラグインが基本のZFSボリューム・ドライバであり、このドライバがrpoolからZFSデータセットをプロビジョニングするためです。

root@solaris:/#zfs list | grep cinder
rpool/cinder                                                            1.03G  24.5G    31K  /rpool/cinder
rpool/cinder/volume-25f4c9b0-2645-cecd-e13d-e76d371d026f                1.03G  25.5G    16K  -

リスト8

Cinderは、iSCSI経由でボリュームをプロビジョニングするか、またはOracle ZFS Storage Applianceから直接プロビジョニングするように構成できます。

お疲れ様でした。これでこのラボは終了です。時間があり、続きに興味がある方は、以下の追加演習に挑戦してください。ご参加いただき、ありがとうございました。

追加演習

このラボでは、VMが192.168.x.0/24アドレス空間で通信するためのプライベート・ネットワークを構成しました。VMが10.158.56.xのホストにpingできるように、NeutronとEVSを構成してみてください。

ヒント:neutron-l3-agentサービスを利用する必要があります。

Swiftは、OpenStackでオブジェクト・ストレージ機能を提供するサービスです。このラボでは説明しませんでしたが、インスタンスにオブジェクト・ストレージ機能を提供するようにSwiftをセットアップしてみてください。

付録—OpenStack hol_single_host.py構成スクリプト

#!/usr/bin/python

# Copyright (c) 2013, 2014, Oracle and/or its affiliates.All rights reserved.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License.You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the
#    License for the specific language governing permissions and limitations
#    under the License.

import ConfigParser
import grp
import os
import pwd
import shutil
import sys
import time

import netifaces

from M2Crypto import RSA
from subprocess import CalledProcessError, Popen, PIPE, check_call

def keystone():
    print "configuring keystone"
    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/keystone/keystone.conf"))
    config.set("DEFAULT", "admin_token", "ADMIN")
    config.set("identity", "driver", "keystone.identity.backends.sql.Identity")
    config.set("catalog", "driver", "keystone.catalog.backends.sql.Catalog")
    config.set("token", "provider", "keystone.token.providers.uuid.Provider")
    config.set("signing", "token_format", "UUID")
    with open("/etc/keystone/keystone.conf", "wb") as fh:
        config.write(fh)

def glance():
    print "configuring glance"

    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/glance/glance-api.conf"))
    config.set("keystone_authtoken", "admin_tenant_name", "service")
    config.set("keystone_authtoken", "admin_user", "glance")
    config.set("keystone_authtoken", "admin_password", "glance")
    with open("/etc/glance/glance-api.conf", "wb") as fh:
        config.write(fh)

    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/glance/glance-cache.conf"))
    config.set("DEFAULT", "auth_url", "http://127.0.0.1:5000/v2.0/")
    config.set("DEFAULT", "admin_tenant_name", "service")
    config.set("DEFAULT", "admin_user", "glance")
    config.set("DEFAULT", "admin_password", "glance")
    with open("/etc/glance/glance-cache.conf", "wb") as fh:
        config.write(fh)
    
    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/glance/glance-registry.conf"))
    config.set("keystone_authtoken", "admin_tenant_name", "service")
    config.set("keystone_authtoken", "admin_user", "glance")
    config.set("keystone_authtoken", "admin_password", "glance")
    with open("/etc/glance/glance-registry.conf", "wb") as fh:
        config.write(fh)
    
    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/glance/glance-api-paste.ini"))
    config.set("pipeline:glance-api",
               "pipeline", "versionnegotiation authtoken context apiv1app")
    config.set("filter:authtoken", "auth_host", "127.0.0.1")
    config.set("filter:authtoken", "auth_port", "35357")
    config.set("filter:authtoken", "auth_protocol", "http")
    config.set("filter:authtoken", "admin_tenant_name", "service")
    config.set("filter:authtoken", "admin_user", "glance")
    config.set("filter:authtoken", "admin_password", "glance")
    with open("/etc/glance/glance-api-paste.ini", "wb") as fh:
        config.write(fh)

    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/glance/glance-registry-paste.ini"))
    config.set("pipeline:glance-registry",
               "pipeline", "authtoken context apiv1app")
    config.set("filter:authtoken", "auth_host", "127.0.0.1")
    config.set("filter:authtoken", "auth_port", "35357")
    config.set("filter:authtoken", "auth_protocol", "http")
    config.set("filter:authtoken", "admin_tenant_name", "service")
    config.set("filter:authtoken", "admin_user", "glance")
    config.set("filter:authtoken", "admin_password", "glance")
    with open("/etc/glance/glance-registry-paste.ini", "wb") as fh:
        config.write(fh)

    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/glance/glance-scrubber.conf"))
    config.set("DEFAULT", "filesystem_store_datadir", "/var/lib/glance/images")
    config.set("DEFAULT", "swift_store_auth_address", "127.0.0.1:5000/v2.0/")
    config.set("DEFAULT", "swift_store_user", "johndoe:johndoe")
    config.set("DEFAULT", "swift_store_key", "a86850deb2742ec3cb41518e26aa2d89")
    config.set("DEFAULT", "s3_store_host", "127.0.0.1:8080/v1.0/")
    config.set("DEFAULT", "s3_store_access_key", '"<20-char AWS access key>"')
    config.set("DEFAULT", "s3_store_secret_key", '"<40-char AWS secret key>"')
    config.set("DEFAULT", "s3_store_bucket", '"<lowercased 20-char aws key>"')
    config.set("DEFAULT", "s3_store_create_bucket_on_put", "False")
    config.set("DEFAULT", "auth_url", "http://127.0.0.1:5000/v2.0/")
    config.set("DEFAULT", "admin_tenant_name", "service")
    config.set("DEFAULT", "admin_user", "glance")
    config.set("DEFAULT", "admin_password", "glance")
    with open("/etc/glance/glance-scrubber.conf", "wb") as fh:
        config.write(fh)

def neutron():
    print "configuring neutron"
    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/neutron/neutron.conf"))
    config.set("DEFAULT", "allow_overlapping_ips", "False")

    if not config.has_section("keystone_authtoken"):
        config.add_section("keystone_authtoken")
    config.set("keystone_authtoken", "auth_host", "127.0.0.1")
    config.set("keystone_authtoken", "auth_port", "35357")
    config.set("keystone_authtoken", "auth_protocol", "http")
    config.set("keystone_authtoken", "admin_tenant_name", "service")
    config.set("keystone_authtoken", "admin_user", "neutron")
    config.set("keystone_authtoken", "admin_password", "neutron")
    config.set("keystone_authtoken", "signing_dir",
               "/var/lib/neutron/keystone-signing")
    with open("/etc/neutron/neutron.conf", "wb") as fh:
        config.write(fh)

def nova():
    print "configuring nova"
    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/nova/nova.conf"))
    config.set("DEFAULT", "firewall_driver",
               "nova.virt.firewall.NoopFirewallDriver")
    config.set("DEFAULT", "neutron_url", "http://localhost:9696")
    config.set("DEFAULT", "neutron_admin_username", "neutron")
    config.set("DEFAULT", "neutron_admin_password", "neutron")
    config.set("DEFAULT", "neutron_admin_tenant_name", "service")
    config.set("DEFAULT", "neutron_admin_auth_url",
               "http://localhost:5000/v2.0")
    config.set("DEFAULT", "neutron_auth_strategy", "keystone")
    with open("/etc/nova/nova.conf", "wb") as fh:
        config.write(fh)

    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/nova/api-paste.ini"))
    config.set("filter:authtoken", "admin_tenant_name", "service")
    config.set("filter:authtoken", "admin_user", "nova")
    config.set("filter:authtoken", "admin_password", "nova")
    with open("/etc/nova/api-paste.ini", "wb") as fh:
        config.write(fh)

def cinder():
    print "configuring cinder"
    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/cinder/cinder.conf"))
    config.set("DEFAULT", "my_ip", "localhost")
    config.set("DEFAULT", "scheduler_driver",
               "cinder.scheduler.simple.SimpleScheduler")
    config.set("DEFAULT", "zfs_volume_base", "rpool/cinder")
    with open("/etc/cinder/cinder.conf", "wb") as fh:
        config.write(fh)

    config = ConfigParser.RawConfigParser()
    config.readfp(open("/etc/cinder/api-paste.ini"))
    config.set("filter:authtoken", "admin_tenant_name", "service")
    config.set("filter:authtoken", "admin_user", "cinder")
    config.set("filter:authtoken", "admin_password", "cinder")
    config.set("filter:authtoken", "signing_dir",
               "/var/lib/cinder/keystone-signing")
    with open("/etc/cinder/api-paste.ini", "wb") as fh:
        config.write(fh)

def horizon():
    print "configuring horizon"
    # who loves sed?
    cmd = ["gsed", '-i',
           "-e", "s@SECURE_PROXY_SSL_HEADER@#SECURE_PROXY_SSL_HEADER@",
           "-e", "s@CSRF_COOKIE_SECURE@#CSRF_COOKIE_SECURE@",
           "-e", "s@SESSION_COOKIE_SECURE@#SESSION_COOKIE_SECURE@",
           "-e", "s@from horizon.utils @#from horizon.utils@",
           "-e", "s@SECRET_KEY@#SECRET_KEY@",
           "/etc/openstack_dashboard/local_settings.py"]
    try:
        check_call(cmd)
    except CalledProcessError:
        print "text/gnu-sed not installed: skipping horizon configuration."
        return


def main(args):
    if not args:
	 print "hol_single_host.py [args]"
	 print "Arguments can be one of: all, keystone, glance, nova, cinder, horizon, neutron"

    if "all" in args:
         args = ["keystone", "glance", "nova", "cinder", "horizon", "swift",
                 "neutron"]

    if "keystone" in args:
        keystone()

    if "glance" in args:
        glance()

    if "nova" in args:
        nova()

    if "cinder" in args:
        cinder()

    if "horizon" in args:
        horizon()

    if "neutron" in args:
        neutron()

if __name__ == "__main__":
    main(sys.argv[1:])

関連項目

また、次のリソースも参照してください。

著者について

Glynn Fosterは、Oracle SolarisのPrincipal Product ManagerですOpenStack、Oracle Solaris Image Packaging System、インストール、構成管理など、さまざまなテクノロジー領域を担当しています。

リビジョン1.0、2015/01/07

フォロー先:
ブログ | Facebook | Twitter | YouTube