第9章 環境の把握

ここからは、あなたがOpenStackが稼働している環境を持っていると想定して進めます。この節は環境の構築と情報収集に役立つでしょう。

 クライアントコマンドラインツール

OpenStack command line interface (CLI) クライアントツールとOpenStackダッシュボードを組み合わせて使うことをおすすめします。他のクラウド技術の経験を持つユーザーは、EC2互換APIを使っているかも知れませんが、それとは命名規則が少々異なります。それらの違いは必要に応じて補足します。

コマンドラインツールは、UbuntuやFedoraのパッケージからではなく、Python Package Index(PyPI) (https://pypi.python.org/) から導入することを強くおすすめします。クライアントツールは開発が活発であり、OSベンダーが配布しているパッケージのバージョンが古くなりがちなためです。

「pip」ユーティリティはPyPIアーカイブからパッケージを導入するために使われます。そして、多くのLinuxディストリビューションでは「pip」ユーティリティは「python-pip」パッケージに含まれています。各OpenStackプロジェクトはそれぞれクライアントを持ちますので、あなたの環境で動かすサービスに合わせて、以下のパッケージを導入してください。

  • python-novaclient (nova CLI)

  • python-glanceclient (glance CLI)

  • python-keystoneclient (keystone CLI)

  • python-cinderclient (cinder CLI)

  • python-swiftclient (swift CLI)

  • python-quantumclient (quantum CLI)

 ツールの導入

PyPIアーカイブからpipを使ってパッケージをインストール (もしくはアップグレード)するには、rootとして、

# pip install [--upgrade] <package-name>

パッケージを削除するには、

# pip uninstall <package-name>

もし新しいバージョンのクライアントが必要な場合、-eフラグを指定することで、アップストリームのgitリポジトリから直接導入できます。その際は、Python egg名を指定しなければいけません。例えば、

# pip install -e git+https://github.com/openstack/python-novaclient.git#egg=python-novaclient

もしEC2 APIを使いたい場合、「euca2ools」パッケージなどのEC2 API対応ツールで実現できます。EC2 APIベースのツールはこのガイドの範囲外ですが、それを使うための認証情報の取得手段については触れることにします。

 管理系コマンドラインツール

*-manageという名のコマンドラインツールがいくつかあります。

  • nova-manage

  • glance-manage

  • keystone-manage

  • cinder-manage

前述のツールと違って、*-manageツールはクラウドコントローラーからroot権限で実行されなければいけません。なぜなら、それらのツールは/etc/nova/nova.confなどの設定ファイルを読み取り、また、OpenStack API エンドポイントではなく、データベースに対し直接クエリーを発行するからです。

*-manageツールが存在しているのは、歴史的な経緯からです。OpenStackプロジェクトは最終的に、*-manageの全機能を通常のクライアントツールへ移行する予定です。それまでは、cloud controller nodeへSSHし、必要な*-manageを使ってメンテナンス作業を行う必要があります。

 認証情報の取得方法

OpenStackクラウドに対してクエリを発行するためにコマンドラインツールを使いたいのであれば、適切な認証情報を持っている必要があります。コマンドラインツールで使う認証情報を得るための最も簡単な方法は、Horizonダッシュボードです。ユーザー設定ページを表示するには、ページ右上のナビゲーションバーから、設定のリンクを選択し、ユーザー設定を開きます。ユーザー設定では、言語やタイムゾーンも設定できます。ここで重要なのは、このページ左側のナビゲーションにあるOpenStack APIEC2 認証情報 リンクです。このリンクから、あなたのサービスエンドポイントや認証情報といった環境変数を設定するファイルを生成できます。

OpenStackネイティブのツールを使うには、 OpenStack API リンクを選択します。ページ上部にはサービスエンドポイントのURLリストが、その下にタイトルOpenStack RCファイルのダウンロードがあります。管理者としてクラウドにアクセスする場合、ドロップダウンメニューから選択できます。ここから認証情報を取得したいプロジェクトを選択し、RCファイルのダウンロードをクリックします。以下のような、openrc.shファイルが生成されます。

#!/bin/bash
      
# With the addition of Keystone, to use an openstack cloud you should
# authenticate against keystone, which returns a **Token** and **Service
# Catalog**. The catalog contains the endpoint for all services the
# user/tenant has access to - including nova, glance, keystone, swift.
#
# *NOTE*: Using the 2.0 *auth api* does not mean that compute api is 2.0. 
# We use the 1.1 *compute api*
export OS_AUTH_URL=http://203.0.113.10:5000/v2.0
      
# With the addition of Keystone we have standardized on the term **tenant**
# as the entity that owns the resources.
export OS_TENANT_ID=98333aba48e756fa8f629c83a818ad57
export OS_TENANT_NAME="test-project"
      
# In addition to the owning entity (tenant), openstack stores the entity
# performing the action as the **user**.
export OS_USERNAME=test-user
      
# With Keystone you pass the keystone password.
echo "Please enter your OpenStack Password: "
read -s OS_PASSWORD_INPUT
export OS_PASSWORD=$OS_PASSWORD_INPUT
[注記]注記

あなたのパスワードはプレーンテキストに保存されません。これはいいことです。このスクリプトを読み込み、実行する際、パスワードの入力が要求され、環境変数OS_PASSWORDに設定されます。対話式に要求することが重要です。もしあなたが非対話式に操作したいのであれば、値を直接スクリプトに書くことは可能です。しかし、このファイルのセキュリティとパーミッションに細心の注意を払う必要があります。

EC2互換クレデンシャルは左側ナビゲーションバー内の「EC2 認証情報」リンクからダウンロードできます。対象認証情報のプロジェクトを選択し、「EC2 認証情報のダウンロード」をクリックすると、x509証明書とシェルスクリプトを含むzipファイルが生成されます。クラウドにアクセスするために必要な認証情報を含んでいるため、openrcとは異なり、安全な場所へ新しいディレクトリを作り、そこへzipファイルを展開してください。cacert.pem、 cert.pem、 ec2rc.sh そして pk.pemがあるはずです。 ec2rc.shは以下のようになるでしょう。

#!/bin/bash
      
NOVARC=$(readlink -f "${BASH_SOURCE:-${0}}" 2>/dev/null) ||\
NOVARC=$(python -c 'import os,sys; print os.path.abspath(os.path.realpath(sys.argv[1]))' "${BASH_SOURCE:-${0}}")
NOVA_KEY_DIR=${NOVARC%/*}
export EC2_ACCESS_KEY=df7f93ec47e84ef8a347bbb3d598449a
export EC2_SECRET_KEY=ead2fff9f8a344e489956deacd47e818
export EC2_URL=http://203.0.113.10:8773/services/Cloud
export EC2_USER_ID=42 # nova does not use user id, but bundling requires it
export EC2_PRIVATE_KEY=${NOVA_KEY_DIR}/pk.pem
export EC2_CERT=${NOVA_KEY_DIR}/cert.pem
export NOVA_CERT=${NOVA_KEY_DIR}/cacert.pem
export EUCALYPTUS_CERT=${NOVA_CERT} # euca-bundle-image seems to require this set
      
alias ec2-bundle-image="ec2-bundle-image --cert $EC2_CERT --privatekey $EC2_PRIVATE_KEY --user 42 --ec2cert $NOVA_CERT"
alias ec2-upload-bundle="ec2-upload-bundle -a $EC2_ACCESS_KEY -s $EC2_SECRET_KEY --url $S3_URL --ec2cert $NOVA_CERT"

EC2認証情報を環境変数として有効にするには、ec2rc.shファイルを(source コマンドで) 読み込みます。

 コマンドラインのこつとはまりどころ

コマンドラインツールは、--debugフラグを渡すことでOpenStack APIコールを表示することができます。例えば、

# nova --debug list

この例は、クライアントからのHTTPリクエストとエンドポイントからのレスポンスを表示しています。これはOpenStack APIを使ったカスタムツールを作る際に役立ちます。

Keyring Support (https://wiki.openstack.org/wiki/KeyringSupport)は、このガイドの執筆時点では混乱の元になるかもしれません。このバグレポート (https://bugs.launchpad.net/python-novaclient/+bug/1020238)はオープンされた後、無効(invalid)としてクローズされ、何度かやり取りがあって再度オープンされています。

その問題とは、ある条件下でコマンドラインツールがPythonのkeyringを認証情報キャッシュとして使おうとし、さらにある条件が重なった時、使用するたびにツールがkeyringパスワードを要求することです。もしあなたが運悪くその現象に遭遇した場合、認証情報キャッシュを回避するため、--no-cacheフラグを追加するか、OS_NO_CACHE=1を環境変数に設定してください。

[注記]注記

no-cache を設定すると、コマンドラインツールがクラウドとやり取りを行う度に認証が行われます。

 cURL

コマンドラインツールの内部ではOpenStack APIが使用されます。OpenStack APIはHTTP上で動作するRESTful APIです。時に、APIと直接やりとりしたい、CLIツールのバグを疑っている、ということがあるでしょう。その際に最適な方法は、cURL (http://curl.haxx.se/)と、JSONレスポンスを解析するjq (http://stedolan.github.com/jq/)などのツールを組み合わせることです。

まずはじめに、クラウドの認証が必要です。あなたの認証情報を用いて認証トークンを入手してください。

あなたの認証情報はユーザー名、パスワード、テナント(プロジェクト)の組み合わせです。前述したopenrc.shで、それらの値を得ることができます。そのトークンのおかげで、リクエストのたびに再認証することなく、サービスエンドポイントとやりとりすることができます。トークンは通常24時間有効です。失効の際は401 (Unauthorized)レスポンスにて警告されますが、別トークンを要求することができます。

  1. それではOpenStack サービスカタログを見てみましょう。

    $ curl -s -X POST http://203.0.113.10:35357/v2.0/tokens \
        -d '{"auth": {"passwordCredentials": {"username":"test-user", "password":"test-password"}, "tenantName":"test-project"}}' \
        -H "Content-type: application/json" | jq .
  2. JSONレスポンスを読むことで、カタログを把握することができます。

    これ以降のリクエストを楽にするため、トークンを環境変数へ設定します。

    $ TOKEN=`curl -s -X POST http://203.0.113.10:35357/v2.0/tokens \
        -d '{"auth": {"passwordCredentials": {"username":"test-user", "password":"test-password"}, "tenantName":"test-project"}}' \
        -H "Content-type: application/json" |  jq -r .access.token.id`

    コマンドラインから、トークンを$TOKENとして参照できるようになりました。

  3. あなたのサービスカタログからコンピュートなどのエンドポイントを選び、試してみましょう。例えば、(サーバー)インスタンスのリスト出力など。

    $ curl -s \
                                      -H "X-Auth-Token: $TOKEN" \
                                       http://203.0.113.10:8774/v2/98333aba48e756fa8f629c83a818ad57/servers | jq .

APIリクエストがどのような構造かを知るには、OpenStack API Reference (http://api.openstack.org/api-ref.html)を参照してください。また、jqを使ってレスポンスを理解するには、jq Manual (http://stedolan.github.com/jq/manual/)も参考になるでしょう。

cURLの-sフラグを使うことで、プログレスメーター非表示にできます。もしcURLコマンドの実行に問題がある場合、それらを消したくなるでしょう。いっぽう、-vフラグは詳細を出力するため、cURLコマンドのトラブル解決に役立ちます。非常に便利な機能がcURLには多くあるので、manページでそれらのオプションを参照してください。

 サーバーとサービス

管理者として、あなたのOpenStackクラウドがどのような状態か、ツールを使って把握する方法が、いくつかあります。この節では、あなたのクラウドの概要、形、大きさ、状態を得るアイデアをお伝えします。

まず、あなたのOpenStackクラウドに属し、稼働しているサーバーを把握することができます。

$ nova-manage service list | sort

出力は以下のようになります。

Binary           Host              Zone Status  State Updated_At
nova-cert        cloud.example.com nova enabled  :-)  2013-02-25 19:32:38
nova-compute     c01.example.com   nova enabled  :-)  2013-02-25 19:32:35
nova-compute     c02.example.com   nova enabled  :-)  2013-02-25 19:32:32
nova-compute     c03.example.com   nova enabled  :-)  2013-02-25 19:32:36
nova-compute     c04.example.com   nova enabled  :-)  2013-02-25 19:32:32
nova-compute     c05.example.com   nova enabled  :-)  2013-02-25 19:32:41
nova-consoleauth cloud.example.com nova enabled  :-)  2013-02-25 19:32:36
nova-network     cloud.example.com nova enabled  :-)  2013-02-25 19:32:32
nova-scheduler   cloud.example.com nova enabled  :-)  2013-02-25 19:32:33

この出力は、5つのコンピュートノードと1つのクラウドコントローラーがあることを示しています。:-) のような笑顔は、サービスが起動し、稼働中であることを表しています。もしサービスが動作していない場合、:-)XXXへと変化します。なぜサービスがダウンしているのか、問題解決すべき印です。

あなたがまだnova-volumeを使っているのであれば、nova-volumeサービスのエントリも見えるでしょう。 (nova-volumeはFolsomより後のリリースでは廃止予定です)

Cinderを使っているのであれば、以下のコマンドを実行すると同様のリストが見られます。

$ cinder-manage host list | sort
host              zone
c01.example.com   nova
c02.example.com   nova
c03.example.com   nova
c04.example.com   nova
c05.example.com   nova
cloud.example.com nova

これら2つの表で、どのサーバーとサービスがあなたのクラウドを構成しているのか、概要を知ることができました。

また、認証サービス (Keystone)を使い、あなたのクラウドでどのサービスが使えるのか、また、どのエンドポイントがサービス向けに構成されているか、知ることができます。

下記コマンドを実行するには、あなたのシェル環境で正しく管理系の変数が設定されている必要があります。

$ keystone service-list
+-----+----------+----------+----------------------------+
| id  | name     | type     | description                |
+-----+----------+----------+----------------------------+
| ... | cinder   | volume   | Cinder Service             |
| ... | glance   | image    | OpenStack Image Service    |
| ... | nova_ec2 | ec2      | EC2 Service                |
| ... | keystone | identity | OpenStack Identity Service |
| ... | nova     | compute  | OpenStack Compute Service  |
+-----+----------+----------+----------------------------+

上記の出力は、5つのサービスが構成されていることを示しています。

各サービスのエンドポイントを見るには、

$ keystone endpoint-list
+-----+-----------------------------------------+-/+-----------------------------------------+
| id  |            publicurl                    | \|               adminurl                  |
+-----+-----------------------------------------+-/+-----------------------------------------+
| ... | http://example.com:8774/v2/%(tenant_id)s| \| http://example.com:8774/v2/%(tenant_id)s|
| ... | http://example.com:8773/services/Cloud  | /| http://example.com:8773/services/Admin  |
| ... | http://example.com:9292/v1              | \| http://example.com:9292/v1              |
| ... | http://example.com:5000/v2.0            | /| http://example.com:35357/v2.0           |
| ... | http://example.com:8776/v1/%(tenant_id)s| \| http://example.com:8776/v1/%(tenant_id)s|
+-----+-----------------------------------------+-/+-----------------------------------------+

serviceendpointは1対1でマッピングされます。いくつかのサービスではパブリックURLと管理URLが異なるので注意してください。

 ネットワーク

次に、あなたのクラウドでどのような固定IPネットワークが設定されているかを見てみましょう。nova novaコマンドラインクライアントを使って、構成されているIPアドレス空間を得ることができます。

$ nova network-list
+--------------------------------------+--------+--------------+
| ID                                   | Label  | Cidr         |
+--------------------------------------+--------+--------------+
| 3df67919-9600-4ea8-952e-2a7be6f70774 | test01 |  10.1.0.0/24 |
| 8283efb2-e53d-46e1-a6bd-bb2bdef9cb9a | test02 |  10.1.1.0/24 |
+--------------------------------------+--------+--------------+

nova-manage ツールを使うと、もう少し詳しい情報が表示されます。

$ nova-manage network list
id IPv4        IPv6 start address DNS1 DNS2 VlanID project   uuid 
1  10.1.0.0/24 None 10.1.0.3      None None 300    2725bbd   beacb3f2
2  10.1.1.0/24 None 10.1.1.3      None None 301    none      d0b1a796

この出力は、2つのネットワークが構成され、それぞれが255のIPアドレス (/24 サブネット)を持つことを表しています。1つ目のネットワークはあるプロジェクトに割り当てられており、2つ目はまだ割り当てられていません。手動でプロジェクトに割り当てることもできますし、プロジェクトの1つ目のインスタンスを起動する際、自動的に割り当てることもできます。

利用可能なフローティングIPを確認するには、

$ nova-manage floating list
2725bbd458e2459a8c1bd36be859f43f 1.2.3.4 None                                 nova vlan20
None                             1.2.3.5 48a415e7-6f07-4d33-ad00-814e60b010ff nova vlan20

2つのフローティングIPが利用可能であることがわかります。1つめはプロジェクトに割り当て済み、もうひとつは未割り当てです。

 ユーザーとプロジェクト

クラウドに追加されたプロジェクトのリストを見るためには、

$ keystone tenant-list
+-----+----------+---------+
| id  | name     | enabled |
+-----+----------+---------+
| ... | jtopjian | True    |
| ... | alvaro   | True    |
| ... | everett  | True    |
| ... | admin    | True    |
| ... | services | True    |
| ... | jonathan | True    |
| ... | lorin    | True    |
| ... | anne     | True    |
| ... | rhulsker | True    |
| ... | tom      | True    |
| ... | adam     | True    |
+-----+----------+---------+

ユーザーのリストを見るためには、

$ keystone user-list
+-----+----------+---------+------------------------------+
| id  | name     | enabled | email                        |
+-----+----------+---------+------------------------------+
| ... | everett  | True    | everett.towne@backspace.com  |
| ... | jonathan | True    | jon@sfcu.edu                 |
| ... | nova     | True    | nova@localhost               |
| ... | rhulsker | True    | ryan.hulkster@cyberalbert.ca |
| ... | lorin    | True    | lorinhoch@nsservices.com     |
| ... | alvaro   | True    | Alvaro.Perry@cyberalbert.ca  |
| ... | anne     | True    | anne.green@backspace.com     |
| ... | admin    | True    | root@localhost               |
| ... | cinder   | True    | cinder@localhost             |
| ... | glance   | True    | glance@localhost             |
| ... | jtopjian | True    | joe.topjian@cyberalbert.com  |
| ... | adam     | True    | adam@ossmanuals.net          |
| ... | tom      | True    | fafield@univm.edu.au         |
+-----+----------+---------+------------------------------+
[注記]注記

ユーザーとグループが1対1でマッピングされることもあります。これはcinder、glance、novaやswiftなど標準のシステムアカウントや、グループに属すのが1ユーザーのみの場合がこれにあたります。

 稼働中のインスタンス

以下のコマンドで、稼働中のインスタンスのリストが得られます。

$ nova list --all-tenants
+-----+------------------+--------+-------------------------------------------+
| ID  | Name             | Status | Networks                                  |
+-----+------------------+--------+-------------------------------------------+
| ... | Windows          | ACTIVE | novanetwork_1=10.1.1.3, 199.116.232.39    |
| ... | cloud controller | ACTIVE | novanetwork_0=10.1.0.6; jtopjian=10.1.2.3 |
| ... | compute node 1   | ACTIVE | novanetwork_0=10.1.0.4; jtopjian=10.1.2.4 |
| ... | devbox           | ACTIVE | novanetwork_0=10.1.0.3                    |
| ... | devstack         | ACTIVE | novanetwork_0=10.1.0.5                    |
| ... | initial          | ACTIVE | nova_network=10.1.7.4, 10.1.8.4           |
| ... | lorin-head       | ACTIVE | nova_network=10.1.7.3, 10.1.8.3           |
+-----+------------------+--------+-------------------------------------------+

残念ながら、このコマンドは稼働中のインスタンスの詳細を出力しません。例えば、どのコンピュートノードでインスタンスが動いているのか、フレーバーは何か、などなど。あなたは以下のコマンドでインスタンス個別の詳細情報を得ることができます。

$ nova show <uuid>

例えば、

# nova show 81db556b-8aa5-427d-a95c-2a9a6972f630
+-------------------------------------+-----------------------------------+
| Property                            | Value                             |
+-------------------------------------+-----------------------------------+
| OS-DCF:diskConfig                   | MANUAL                            |
| OS-EXT-SRV-ATTR:host                | c02.example.com                   |
| OS-EXT-SRV-ATTR:hypervisor_hostname | c02.example.com                   |
| OS-EXT-SRV-ATTR:instance_name       | instance-00000029                 |
| OS-EXT-STS:power_state              | 1                                 |
| OS-EXT-STS:task_state               | None                              |
| OS-EXT-STS:vm_state                 | active                            |
| accessIPv4                          |                                   |
| accessIPv6                          |                                   |
| config_drive                        |                                   |
| created                             | 2013-02-13T20:08:36Z              |
| flavor                              | m1.small (6)                      |
| hostId                              | ...                               |
| id                                  | ...                               |
| image                               | Ubuntu 12.04 cloudimg amd64 (...) |
| key_name                            | jtopjian-sandbox                  |
| metadata                            | {}                                |
| name                                | devstack                          |
| novanetwork_0 network               | 10.1.0.5                          |
| progress                            | 0                                 |
| security_groups                     | [{u'name': u'default'}]           |
| status                              | ACTIVE                            |
| tenant_id                           | ...                               |
| updated                             | 2013-02-13T20:08:59Z              |
| user_id                             | ...                               |
+-------------------------------------+-----------------------------------+


loading table of contents...