tools

2 minute read

こんにちは。@jedipunkz です。

自分は Ruby を普段使うのでいつも Fog というライブラリを使って OpenStack, AWS を操作していました。Fog を使うとクラウドの操作が Ruby のネイティブコードで行え るのでシステムコマンド打つよりミス無く済みます。

Fog より後発で Aviator というライブラリが登場してきたので少し使ってみたのです がまだ未完成なところがあるものの便利な点もあって今後に期待だったので紹介します。

認証情報を yaml ファイルに記す

接続に必要な認証情報を yaml ファイルで記述します。名前を ‘aviator.yml’ として 保存。この時に下記のように環境毎に認証情報を別けて書くことができます。こうする ことでコードの中で開発用・サービス用等と使い分けられます。

production:
  provider: openstack
  auth_service:
    name: identity
    host_uri: <Auth URL>
    request: create_token
    validator: list_tenants
  auth_credentials:
    username: <User Name>
    password: <Password>
    tenant_name: <Tenant Name>

development:
  provider: openstack
  auth_service:
    name: identity
    host_uri: <Auth URL>
    request: create_token
    validator: list_tenants
  auth_credentials:
    username: <User Name>
    password: <Password>
    tenant_name: <Tenant Name>

シンタックス確認 +++

次に aviator のシンタックスを確認します。Fog に無い機能で、コマンドラインでシ ンタックスを確認できてしかも指定可能はパラメータと必須なパラメータと共にサンプ ルコードまで提供してくれます。公式サイトに’サーバ作成’のメソッドが掲載されてい るので、ここでは仮想ディスクを作るシンタックスを確認してみます。

% gem install aviator
% aviator describe openstack volume # <-- 利用可能な機能を確認
Available requests for openstack volume_service:
v1 public list_volume_types
v1 public list_volumes
v1 public delete_volume
v1 public create_volume
v1 public get_volume
v1 public update_volume
  v1 public root
% aviator describe openstack volume v1 public create_volume # <-- シンタックスを確認
:Request => create_volume

Parameters:
 +---------------------+-----------+
 | NAME                | REQUIRED? |
 +---------------------+-----------+
 | availability_zone   |     N     |
 | display_description |     Y     |
 | display_name        |     Y     |
 | metadata            |     N     |
 | size                |     Y     |
 | snapshot_id         |     N     |
 | volume_type         |     N     |
 +---------------------+-----------+

Sample Code:
  session.volume_service.request(:create_volume) do |params|
    params.volume_type = value
    params.availability_zone = value
    params.snapshot_id = value
    params.metadata = value
    params.display_name = value
    params.display_description = value
    params.size = value
  end

このように create_volume というメソッドが用意されていて、指定出来るパラメータ・ 必須なパラメータが確認できます。必須なモノには “Y” が REQUIRED に付いています。 またサンプルコードが出力されるので、めちゃ便利です。

では create_volume のシンタックスがわかったので、コードを書いてみましょう。

コードを書いてみる +++

#!/usr/bin/env ruby

require 'aviator'
require 'json'

volume_session = Aviator::Session.new(
              :config_file => '/home/thirai/aviator/aviator.yml',
              :environment => :production,
              :log_file    => '/home/thirai/aviator/aviator.log'
            )

volume_session.authenticate

volume_session.volume_service.request(:create_volume) do |params|
  params.display_description = 'testvol'
  params.display_name = 'testvol01'
  params.size = 1
end
puts volume_session.volume_service.request(:list_volumes).body

6行目で先ほど作成した認証情報ファイル aviator.yml とログ出力ファイル aviator.log を指定します。12行目で実際に OpenStack にログインしています。

14-18行目はサンプルコードそのままです。必須パラメータの display_description, display_name, size のみを指定し仮想ディスクを作成しました。最後の puts … は 実際に作成した仮想ディスク一覧を出力しています。

結果は下記のとおりです。

{ volumes: [{ status: 'available', display_name: 'testvol01', attachments: [],
availability_zone: 'az3', bootable: 'false', created_at:
description = 'testvol', volume_type:
'standard', snapshot_id: nil, source_volid: nil, metadata:  }, id:
'3a5f616e-a732-4442-a419-10369111bd4c', size: 1 }] }

まとめ +++

サンプルコードやパラメータ一覧等がひと目でわかる aviator はとても便利です。ま だ利用できるクラウドプラットフォームが OpenStack しかないのと、Neutron の機能 がスッポリ抜けているので、まだ利用するには早いかもです…。逆に言えばコントリ ビューションするチャンスなので、もし気になった方がいたら開発に参加してみるのも いいかもしれません。

1 minute read

こんにちは。@jedipunkz です。

今日も軽めの話題を。

Gmail を Emacs + Mew で読み書きする方法を何故かいつも忘れてしまうので自分のた めにもメモしておきます。Gmail はブラウザで読み書き出来るのに!と思われるかもし れませんが、Emacs で文章が書けるのは重要なことです。:D

対象 OS

比較的新しい…

  • Debian Gnu/Linux
  • Ubuntu

を使います。

手順

Emacs, Mew, stunnel4 をインストールします。Emacs は好きな物を入れてください。

% sudo apt-get install emacs24-nox stunnel4 mew mew-bin ca-certificates

openssl コマンドで mail.pem を生成します。生成したものを /etc/stunnel 配下に設 置します。

% openssl req -new -out mail.pem -keyout mail.pem -nodes -x509 -days 365
% sudo cp mail.pem /etc/stunnel/

stunnel はインストール直後、起動してくれないので ENABLE=1 に修正します。

% sudo ${EDITOR} /etc/default/stunnel4
ENABLE=1 # 0 -> 1 へ変更

stunenl.conf のサンプルを /etc/stunnel 配下に設置します。

% sudo cp /usr/share/doc/stunnel4/examples/stunnel.conf-sample /etc/stunnel/stunnel.conf

$HOME/.mew.el ファイルを生成します。自分のアカウント情報などを入力します。

; Stunnel
(setq mew-prog-ssl "/usr/bin/stunnel4")
; IMAP for Gmail
(setq mew-proto "%")
(setq mew-imap-server "imap.gmail.com")
(setq mew-imap-user "example@gmail.com")
(setq mew-imap-auth  t)
(setq mew-imap-ssl t)
(setq mew-imap-ssl-port "993")
(setq mew-smtp-auth t)
(setq mew-smtp-ssl t)
(setq mew-smtp-ssl-port "465")
(setq mew-smtp-user "example@gmail.com")
(setq mew-smtp-server "smtp.gmail.com")
(setq mew-fcc "%Sent") ; 送信メイルを保存する
(setq mew-imap-trash-folder "%[Gmail]/ゴミ箱")
(setq mew-use-cached-passwd t)
(setq mew-ssl-verify-level 0)

$HOME/.emacs.d/init.el に Mew の記述を追記します。

(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)
(setq mew-fcc "+outbox") ; 送信メールを保存
(setq exec-path (cons "/usr/bin" exec-path))

Emacs + Mew を起動します。

% emacs -e mew

まとめ

以上です。他の distro だと ca-certificate とか無いので、大変だなぁといつも思っ てしまいます。

2 minute read

OpenStack をコードで管理するためのフレームワークは幾つか存在するのだけど Ruby で記述出来る Fog が良い!と隣に座ってるアプリエンジニアが言うので僕も最近少し 触ってます。

Fog を使った OpenStack を管理するコードを書くことも大事なのだけど、Fog のコン トリビュートってことで幾つかの機能を付け足して (Quantum Router 周り) ってこと をやってました。まだ取り込まれてないけど。

その開発の中で pry の存在を教えてもらいその便利さに驚いたので少し説明します。 バリバリ開発系の人は既に知っているだろうけど、インフラ系エンジニアの僕にとって は感激モノでした。

pry は irb 代替な Ruby のインタラクティブシェルです。下記の URL から持ってこれ ます。

https://github.com/pry/pry

シンタックスハイライトされたり json のレスポンスが綺麗に成形されたり irb 的に 使うだけでも便利なのだけど ‘?’ や ‘$’ でコードのシンタックスを確認したりコード 内容を確認したり出来るのがアツい!

ちょうど今回追加した Fog の機能を使って説明していみます。

Fog のコードを require して OpenStack に接続するための情報を設定し OpenStack Quantum に接続します。これで準備完了。

[38] pry(main)> require '/home/jedipunkz/fog/lib/fog.rb'
[49] pry(main)> @connection_hash = {
[49] pry(main)*   :openstack_username => 'demo',
[49] pry(main)*   :openstack_api_key => 'demo',
[49] pry(main)*   :openstack_tenant => 'service',
[49] pry(main)*   :openstack_auth_url =>
'http://172.16.1.11:5000/v2.0/tokens',
[49] pry(main)*   :provider => 'OpenStack',
[49] pry(main)* }
[50] pry(main)> @quantum = Fog::Network.new(@connection_hash)

試しに Router 一覧を取得します。list_routers メソッドです。

[54] pry(main)> @quantum.list_routers()
=> #<Excon::Response:0x00000003da3560
 @body=
  "{\"routers\": [{\"status\": \"ACTIVE\", \"external_gateway_info\": {\"network_id\": \"b8ef37a9-9ed1-4b6d-862d-fe9e381a2f2a\"}, \"name\": \"router-admin\", \"admin_state_up\": true, \"tenant_id\": \"5e9544d4823a44d59f3591144049f691\", \"id\": \"35c65e2c-5cd8-4eb5-87a8-c370988c101a\"}]}",
 @data=
  {:body=>
    {"routers"=>
      [{"status"=>"ACTIVE",
        "external_gateway_info"=>
         {"network_id"=>"b8ef37a9-9ed1-4b6d-862d-fe9e381a2f2a"},
        "name"=>"router-admin",
        "admin_state_up"=>true,
        "tenant_id"=>"5e9544d4823a44d59f3591144049f691",
        "id"=>"35c65e2c-5cd8-4eb5-87a8-c370988c101a"}]},
   :headers=>
    {"Content-Type"=>"application/json",
     "Content-Length"=>"259",
     "Date"=>"Wed, 06 Mar 2013 06:53:22 GMT"},
   :status=>200,
   :remote_ip=>"172.16.1.11"},
 @headers=
  {"Content-Type"=>"application/json",
   "Content-Length"=>"259",
   "Date"=>"Wed, 06 Mar 2013 06:53:22 GMT"},
 @remote_ip="172.16.1.11",
 @status=200>

綺麗に色付けされてレスポンスがあります。

次に ‘cd @quantum’ して cd します。そして ‘? メソッド名’ するとメソッドのシン タックスを確認出来ます。試しに Router を生成する create_router メソッドを見て みます。

[56] pry(main)> cd @quantum
[59] pry(#<Fog::Network::OpenStack::Real>):1> ? create_router

From: /home/jedipunkz/fog/lib/fog/openstack/requests/network/create_router.rb @ line 6:
Owner: Fog::Network::OpenStack::Real
Visibility: public
Signature: create_router(name, options=?)
Number of lines: 1

そして ‘$ メソッド名’ するとコードが確認出来ます。

[64] pry(#<Fog::Network::OpenStack::Real>):1> $ create_router

From: /home/jedipunkz/fog/lib/fog/openstack/requests/network/create_router.rb @ line 6:
Owner: Fog::Network::OpenStack::Real
Visibility: public
Number of lines: 27

def create_router(name, options = {})
  data = {
    'router' => {
      'name' => name,
    }
  }

  vanilla_options = [
    :admin_state_up,
    :tenant_id,
    :network_id,
    :external_gateway_info,
    :status,
    :subnet_id
  ]

  vanilla_options.reject{ |o| options[o].nil? }.each do |key|
    data['router'][key] = options[key]
  end

  request(
    :body     => Fog::JSON.encode(data),
    :expects  => [201],
    :method   => 'POST',
    :path     => 'routers'
  )
end

あとは ‘puts @quantum’ 等するとオブジェクトの内容が確認出来たり、’ls @quantum’ すると @quantum オブジェクトのメソッド一覧が確認出来たり。

開発の効率が上がるなぁと感激。

春なので OpenStack もそろろろ次期リリースの時期。それぞれのコンポーネントの機 能が拡張されているようなので Fog 等のフレームワークにコントリビュートする機会 もますます増えそう。Fog やその他のクラウドフレームワークはなんだかんだ言って AWS のフューチャがメインなので OpenStack の機能追加に追いついていない感がある。 もし興味持っている人が居たら是非一緒に OpenStack 界隈を盛り上げましょう。