twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル Go で OpenStack を使う

Go で OpenStack を使う

原文はこちらです。
 
ここまでで学んだ OpenStack APIに関する知識 (OpenStackAPI 入門 (和訳はこちら) と OpenStack API を使ってサーバーを立ち上げる (和訳はこちら)) を用いて、OpenStack SDK を使いましょう。
 
API は、OpenStack の基盤を使うための基本インタフェースです。API を使って、REST フル呼び出しをします。プログラムの中から libcurl などのライブラリを使用するか、少し面倒ですが、HTTP 呼び出しを直接使うことができます。さまざまな言語用に、たくさんのライブラリが用意されていて、OpenStack API を簡単に利用できます。これらのライブラリを SDK と呼びます。そのひとつを見てみましょう。
 
今回は、Go 言語を使います。非常に楽しく使いやすい言語であるとともに、OpenStack で使われている Python とは異なる言語を利用したかったからです。(OpenStack グループは、Python 用の SDK のみを正式に提供しています。Go を含む他言語用は非公式のものです)。
 
以前に説明したように、私は、例として Rackspace を利用します (一番始めのチュートリアルを見てください)。

Go 言語

Go 言語用の SDK は、いくつかあります。ここでは、Gophecloud という Rackspace が開発したものを使用します。すでに Go をインストール済みで、GOPATH が適切に設定されているものとします。
Gophercloud をインストールして、使ってみましょう。
 
まず、github.com/rackspace/gophercloud に行きます。
 
好みのエディターで、テキスト ファイルを作成します。まず、test1.go を作成します。読者が完全にできるように、ファイルの内容の断片ではなく、全部を掲載します。これをそのままタイプしたり貼り付けたりできます。
 package main

 import (
 "fmt"
 "github.com/rackspace/gophercloud"
 "github.com/rackspace/gophercloud/openstack"
 "github.com/rackspace/gophercloud/pagination"
 "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
 )


 func main() {

 opts := gophercloud.AuthOptions{
 IdentityEndpoint: "https://identity.api.rackspacecloud.com/v2.0",
 Username: "RackspaceUsername",
 Password: "RackspacePassword",
 }
 provider, err := openstack.AuthenticatedClient(opts)
 
 if err != nil {
 fmt.Println("AuthenticatedClient")
 fmt.Println(err)
 return
 }
 
 client, err := 
 openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
 Region: "IAD",
 }) 
 if err != nil {
 fmt.Println("NewComputeV2 Error:")
   fmt.Println(err)
   return
 }
 
 opts2 := servers.ListOpts{}
 pager := servers.List(client, opts2)
 
 pager.EachPage(func(page pagination.Page) (bool, error) {
 serverList, err := servers.ExtractServers(page)
 
 if err != nil {
 return false, err
 }
 
 for _, s := range serverList {
 
 fmt.Println(s.ID, s.Name, s.Status)
 // servers.Delete(client, s.ID);


 }
 return true, nil
 })
 
 }


コード内の RackspaceUsername を読者のユーザー名に、RackspacePassword をパスワードに置き換えてください。

Rackspace コンソールにログインし、サーバーを作成します。(コードを使ってサーバーを作成することもできますが、ここでは簡単にするために、実行中のサーバーをリストします)。同一のリージョン内にサーバーを 2 つ作成します。上記のコード内の IADをリージョンの略称に置き換えます。
 
次の文の test1.go を、作成したファイル名に置き換え、実行します。
go run test1.go
jeff@JeffLinuxMint16 ~/dev/tests/openstack/go $ go run test1.go 
dce631ce-71ff-4b9a-89f0-0ea7bf4a6770 Cloud-Server-02 BUILD
5500e1d6-2782-4971-9045-72c9b744d482 Cloud-Server-01 ACTIVE

最初のサーバーのビルドが終わり、アクティブになった後、test1.goプログラムを実行しました。2 番目のサーバーは、ビルドの途中でした。このリスト内で、1 つは BUILD、他方は ACTIVE と表示されています。

コードを読む

コードの詳細を見ていきましょう。import セクションで、必要な外部パッケージを指定します。gophercloud パッケージとともに fmt を利用しますので、指定しておきます。ここは、若干トリッキーです。ドキュメントを読んで、本当に必要な gophercloud パッケージだけを指定します。API の違うパートでは、違うライブラリが必要になるからです。
 
main 関数の最初の部分で、authentication オプション オブジェクトを作成します。オブジェクトに、ユーザー名、パスワードと authentication に使う URL を指定します。authentication を API で行うためには、ユーザー名とパスワードを URL に付加する必要があります。authentication トークンが戻ってきます。裏ではいろいろ行われていますが、構造体に情報を格納するコードだけです。エラーかトークンが戻るため、トークン情報を provider 変数に格納します (Gophercloud ドキュメントの例にならって、変数名を provider としました)。エラーの場合は、表示して終了します。エラーがなければ続けます。
 
次に、provider 変数と endpoint を引数として NewComputeV2 呼び出しを使って、Compute サービスを使用します。2 つ目の引数 EndpointOpts 構造体は、呼び出しの endpoint を意味します。endpoint には、IAD もしくは使用中のリージョンを指定します。NewComputeV2 呼び出しは、エラーか、Computeサービスを指すオブジェクトを戻します。このオブジェクトを使って、今後の呼び出しを実行します。
 
servers.list 呼び出しを行って、後の関数呼び出しの準備をします。この部分は、オブジェクト指向プログラムには見えません。サーバーをリストするため、Compute サービスのメソッドを呼び出すのではなく、サーバー パッケージ (ファイルの最初でインポートしました) にあるメソッドを呼び出します。引数に、Compute サービスのオブジェクトを指定します。
 
サーバーのリストを見ることができます。API で入手できる情報量には制限があるため、全部の情報を得るまで、情報入手の追加呼び出しをする必要があります。そのため、pager オブジェクトの EachPage 関数を呼びます。この関数は、引数としてコールバック関数を指定します。コールバック関数には、現在のページが引数となります。このページ データから、サーバー情報を入手します。最終的に、ページから得たサーバー リストを見ることができます。各サーバーの ID、名称、ステータスが入手できます。
 
ID、名称、ステータスの入手方法、その他の引数などの情報は、ドキュメントを見ました。ドキュメントの URL は、import 文の URL と符合します。godoc.org の情報です。import 文の URL は以下です。
 
 github.com/rackspace/gophercloud/openstack/compute/V2/servers
 
まず、http://godoc.org/ を見て、ブラウザで開いておきましょう。
 
 
下記が、サーバー パッケージのドキュメントを表示したスクリーンショットです。
OpenStack API
画面の中程あたりに、List 関数と ServiceClient とオプションを含んだ構造体を引数とする説明があります。関数は、Pager オブジェクトを戻します。画面の下には Server タイプの説明があります。ここで、Server オブジェクトのメンバーに名称などがあることがわかります。またそのほかに、AccessIPv4 と HostID という重要な引数があることもわかります。

エラー テスト

OpenStack API 2
引数を変えると、いろいろなエラーが返ってきます。たとえば、NewComputeV2 のリージョン変数を、次のように存在しないリージョンに変えてみます。
Region: "ABCDEF"

次のような出力が得られます。

NewComputeV2 Error:
No suitable endpoint could be found in the service catalog.
Shutting Down the Servers

ただちにサーバーを止めないと、月末の支払いが予想より多くなります。上記のコードにサーバー停止を組み込みます。(このテスト用に、リージョン引数を変更していたら、元に戻してください)。ドキュメントのサーバー ページを見ると、Delete 関数が見つかります。引数として、ServiceClient と id を取ります。出力直後にサーバーを削除するコードを組み込みます。

Warning! Warning! This will delete all the servers in your account for that region. If that's not what you want, don't run this. Instead, delete them manually from the Rackspace web console!

次のようにして、サーバーを削除します。上記コードでは、コメントアウトしていますので、コメントを外してください。
servers.Delete(client, s.ID);

こうしたら、プログラムを再実行してください。今度は、情報表示後、サーバーを削除してくれます。サーバーを削除するのに数秒かかります。プログラムを再実行すると、サーバーが残っていないことが確認できます。

全部のドキュメントを見つける

godoc サーバー上でドキュメントを見つけることができます。ここから始めて、さまざまなサービス用のドキュメントを見つけることができます。基本的な入門書もあります。画面の一番下の Directories セクションには、使用可能なサービスとオブジェクトが掲載されています。

結論

OpenStack SDK を使うことで、OpenStack API の使用が簡単になります。異なる言語用にたくさんの SDK が用意されています。いくつかの言語用のものは、不完全です (例えば、C++)。あるものには、複数のSDKの選択肢があります。言語を選んだら、SDK を使う前に、API を理解してください。理解することにより、SDK を活用できます。ここまでで、OpenStack の API と SDK の入門を終わります。もっと、知りたいことがあれば、コメントをお寄せください。
 
以前のチュートリアル情報です。
 
 
Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/10/09 2018年 10月 08日
  2. Today's Linux 2018/10/10 2018年 10月 09日
  3. Today's Linux 2018/10/12 2018年 10月 11日
  4. Today's Linux 2018/10/17 2018年 10月 16日
  5. Today's Linux 2018/10/18 2018年 10月 17日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!