今日は “OpenStack Advent Calendar 2012 JP” というイベントのために記事を書きた いと思います。Advent Calendar とはキリスト生誕を祝うため 12/25 まで毎日誰かがブログ 等で特定の話題について述べるもの、らしいです。CloudStack さん, Eucalyptus さん も今年はやっているそうですね。

イベントサイト : http://atnd.org/events/34389

では早速!(ただ..CloudStack の Advent Calendar とネタがかぶり気味です..。)

御存知の通り OpenStack は API を提供していてユーザがコードを書くことで OpenStack のコマンド・Horizon で出来ることは全て可能です。API を叩くのに幾つか フレームワークが存在します。

  • fog
  • libcloud
  • deltacloud

などです。

ここでは内部で fog を使っている knife-openstack を利用して API に触れてみよう かと思います。API を叩くことを想像してもらって、インフラエンジニアの仕事内容の 変化まで述べられたらいいなぁと思っています。

OpenStack 環境の用意

予め OpenStack 環境は揃っているものとしますです。お持ちでなければ

http://jedipunkz.github.com/blog/2012/11/10/openstack-folsom-install/

この記事を参考に環境を作ってみて下さい。あ、devstack でも大丈夫です。

chef, knife-openstack の用意

chef, knife-openstack を入れるのは OpenStack 環境でも、別のノードでも構いません。

chef が確か 1.9.2 ベースが推奨だったので今回は 1.9.2-p320 使います。 ruby は rbenv で入れるのがオススメです。knife-openstack, chef のインストールは…

% sudo apt-get install libreadline-dev libxslt1-dev libxml2-dev
% gem install chef --no-rdoc --no-ri
% gem install knife-openstack --no-rdoc --no-ri
% rbenv rehash # rbenv を使っている際に実行..

次に knife.rb を用意します。情報として下記を

  • OS_USERNAME : :openstack_username
  • OS_PASSWORD : :openstack_password
  • OS_AUTH_URL : :openstack_auth_url
  • OS_TENANT_NAME : :openstack_tenant

追加します。例として下記を参考にしてください。

% mkdir .chef
% ${EDITOR} .chef/knife.rb

knife[:openstack_username] = "demo"
knife[:openstack_password] = "demo"
knife[:openstack_auth_url] = "http://172.16.1.11:5000/v2.0/tokens"
knife[:openstack_tenant] = "service"

ここで注意なのが OS_AUTH_URL がいつもコマンドラインで扱うものと違い /tokens が 付いています。fog を直に扱う時も同じですがこれが必要です。

ssh keypair の用意

ssh keypair が必要になってくるので用意します。

% nova keypair-add testkey01 > testkey01

knife-openstack の操作方法

いよいよ knife-openstack を使って OpenStack を操作してみましょう。

まずは flavor のリストを取得します。

% knife openstack flavor list
ID  Name       Virtual CPUs  RAM       Disk
1   m1.tiny    1             512 MB    0 GB
2   m1.small   1             2048 MB   20 GB
3   m1.medium  2             4096 MB   40 GB
4   m1.large   4             8192 MB   80 GB
5   m1.xlarge  8             16384 MB  160 GB

image リストを取得します。id が必要になります。

% knife openstack image list
ID                                    Name
436deba5-8fab-4bb7-9205-41e33fe22744  Cirros 0.3.0 x86_64

VM を生成してみましょー。

% knife openstack server create -f 1 -I 436deba5-8fab-4bb7-9205-41e33fe22744 -S testkey01 -N knifetest01
Instance Name: knifetest01
Instance ID: 1e20850d-9572-46c8-a41e-fdf56f4f65a7
SSH Keypair: testkey

Waiting for server............
Flavor: 1
Image: 436deba5-8fab-4bb7-9205-41e33fe22744

出来たかどうか、チェック。

% knife openstack server list
Instance ID                           Name         Public IP  Private IP  Flavor  Image                                 Keypair   State
1e20850d-9572-46c8-a41e-fdf56f4f65a7  knifetest01                         1       436deba5-8fab-4bb7-9205-41e33fe22744  hogehoge  active

できました。逆に VM を削除するには

% knife openstack server delete 1e20850d-9572-46c8-a41e-fdf56f4f65a7
Instance ID: 1e20850d-9572-46c8-a41e-fdf56f4f65a7
Instance Name: knifetest01
Flavor: 1
Image: 436deba5-8fab-4bb7-9205-41e33fe22744

Do you really want to delete this server? (Y/N) y
WARNING: Deleted server 1e20850d-9572-46c8-a41e-fdf56f4f65a7
WARNING: Corresponding node and client for the 1e20850d-9572-46c8-a41e-fdf56f4f65a7 server were not deleted and remain registered with the Chef Server

です。

残念なところとしては knife-openstack 自体はまだまだ機能が充実していません。VM の基本的な操作くらいしか出来ないので、追加実装したいという方がいらっしゃいまし たら Pull リクエスト送ると良いのではないでしょうか。

knife-openstack 公式サイト : https://github.com/opscode/knife-openstack

まぁ、ここまで書いてアレですが.. 気がついた方もいらっしゃると思います。 knife-openstack で出来ることは openstack コマンド群で全て出来るのであまり意味 はないですよね。ただ fog を使って API を叩くことを想像して欲しくて..( -_- )

Fog 単体で操作してみる

今日はまだまだ書ける!

knife-openstack では基本的な操作しか出来ませんでしたが fog はより多くの機能を実装しています。(2012/12/08 現在 quantum 周りの開発は未 完成らしいです。floating-ip 周りがぁ。誰かコミットして。)

fog 単体で OpenStack API を操作するには、下記の通り実行します。fog をインストー ルし…

% gem install fog --no-rdoc --no-ri
% rbenv rehash

環境変数を入力し… (情報は例です)

% cat env
export OS_TENANT_NAME=service
export OS_USERNAME=demo
export OS_PASSWORD=demo
export OS_AUTH_URL="http://172.16.1.11:5000/v2.0/"
export OS_AUTH_URL_FOG="http://172.16.1.11:5000/v2.0/tokens"
% source env

コードを下記のように記述すると VM の生成が行えます。

    #!/usr/bin/env ruby
    
    require 'fog'
    require 'pp'
    
    conn = Fog::Compute.new({
      :provider => 'OpenStack',
      :openstack_api_key => ENV['OS_PASSWORD'],
      :openstack_username => ENV["OS_USERNAME"],
      :openstack_auth_url => ENV["OS_AUTH_URL_FOG"],
      :openstack_tenant => ENV["OS_TENANT_NAME"]
    })
    
    flavor = conn.flavors.find { |f| f.name == 'm1.tiny' }
    
    image_name = 'Cirros 0.3.0 x86_64'
    image = conn.images.find { |i| i.name == image_name }
    
    puts "#{'Creating server'} from image #{image.name}..."
    server = conn.servers.create :name => "fogvm-#{Time.now.strftime '%Y%m%d-%H%M%S'}",
                                 :image_ref => image.id,
                                 :flavor_ref => flavor.id,
                                 :key_name => 'testkey01'
    server.wait_for { ready? }

実行 !

% ruby <CODENAME>.rb
Creating server from image Cirros 0.3.0 x86_64...
%

出来ました。VM が生成されたか先ほどの knife-openstack で確認してみましょう。

% knife openstack server list
Instance ID                           Name         Public IP  Private IP  Flavor  Image                                 Keypair   State
1e20850d-9572-46c8-a41e-fdf56f4f65a7  knifetest01                         1       436deba5-8fab-4bb7-9205-41e33fe22744  hogehoge  active
f5c314a3-e32f-498f-984f-b79078d76a5a  fogvm-20121207-104743                         1       aedef2a1-f820-43a6-96cd-f5361d27df3f  testkey01  active

まとめと 考察

今回は API をみんな叩いてるねん!ってことに気がついて欲しくて、こんな記事を書 いてみました。実は OpenStack のコマンドも –debug を付けて (Quantum だけは -v) 実行すると OpenStack の API を叩いているメッセージが出力されると OpenStack ユー ザ会の方から聞きました。是非やっていてください。

% nova --debug list
% quantum -v net-list

API を実装するのか、ツールを実装するのか?といった話題が以前の OpenStack Summit で常に話題になっていたらしいですが、最近は API で決まり、といったと ころでしょうか。コードを書いてインラフを定義する時代に突入です。ちなみに fog は AWS も扱えます。また Opscode Chef や Puppet, JuJu 等のデプロイフレームワー クを使えば VM 上のサービス構築もコードを書くことで出来ます。また、以前ブログに 書いたのですが OpenFlow といった技術を使うとネットワークをコードを書くことで設 計出来る、かもしれない。

http://jedipunkz.github.com/blog/2012/11/21/openflow-trema-handson-report/

つまり、コードを書くことで

  • サーバ構築
  • ネットワーク構築
  • サービス構築

を一貫して行えることになります。

インフラエンジニアの僕としては時代の変化に着いて行かねば!という焦りで一杯です。 もちろんレガシなインフラエンジニアも生き残るのでしょうが、働く場所が限られてき そう。より高度な(低レイヤからの深い?)技術を有している人が限定された場所で成果 を上げていく印象。僕らの様な一般的なインフラエンジニアは OpenStack, AWS, HP Cloud, CloudStack の様なクラウドインフラを相手にコードを書く、もしくは抽象化さ れた技術をより扱いやすいソフトウェアを介して構築・管理していくことになるのでしょ うか。これから覚えることは山積みですが、楽しい時代です。