クラウド コンピューティング EXPO【秋】にいってきました

先週にクラウドコンピューティングEXPOに行ってきました。

この日行くのが少し遅れてしまい、京葉線の電車遅延があったため
海浜幕張駅に向かうのをあきらめ総武線を使っての幕張本郷駅から
バスで幕張メッセへ向かいました。

幕張本郷駅についてバス乗り場に向かったらメッセに向かう同じような
人たちがたくさんいましたね。
バスは朝のラッシュ時のように長蛇の列でした。

バスに乗車でき、やっとの事でメッセにつきましたよ~
何年ぶりでしょうか(汗)


受付を済ませメッセの中に入ったものの呼び込みと来場者の多さで怯んで
しまいました。

クラウドと一概に言っても各メーカーのスタンスはかなり違うと感じますね。

私がクラウドで感じたのは
・マルチデバイスのアクセス
・様々な回線からのアクセス
・多要素認証
・複数のクラウドの認証の一元化(シングルサインオン)
・クラウドならでのグループウェアなどのSaaSサービス

特に最後に紹介したSaaSにサービスに関してですが、様々な課金されていた
サービスが今日は無償化されており、クラウドサービスによるユーザ囲い込み
合戦が繰り広げられていますね。

KDDIブースでは興味あったSSO(シングルサインオン)について聞けました。
SSOの利点はユーザの利便性とパスワードが一元化出来ることによる管理の
容易さだと思います。
なんどアンケートに答えるとコーヒー無料のため、まつぼっくりは2杯も
飲んじゃいました。KDDIさん、すいません。


コンパニオンの方々もいらっしゃいますね。。。
ガンダムのマチルダさんの看板がありました。



今日は雑誌などでも情報は多く得られますが、メーカーの方から様々な話を聞けたり、
現場で多くの空気を吸えるのは大事だと思いますので、行ってみてよかったと
思います。


以上、簡単でありますがクラウド コンピューティング EXPOの参加レポートとなります。



【OpenStack】 Icehouse 導入編 #3

最近ベンダー試験の勉強で結構疲れてます。まつぼっくりです。
LPICレベル3 304の学習を進めていますが、OpenStackで登場するKVMなどの
サーバー仮想化の勉強が出来ますのでお勧めです。

みなさん是非ともチャレンジしてみてくださいね。
さて前回から引き続きインストールを進めていきます。

引き続きブラウザからhorizonにアクセスします。
http//ipaddress/dashboard

ユーザ名:admin
パスワード:<adminのパスワード>

■イメージの作成
OSのイメージをダウンロードします。
今回はfedoraのqcow2イメージをダウンロードしています。

イメージとスナップショット→イメージの作成
 名前       :fedora19(任意)
 イメージファイル:
  http://cloud.fedoraproject.org/fedora-19.x86_64.qcow2
 形式       :QCOW2
 パブリック    :チェック(チェックをつけないと他のテナントから使用できません)

■プロジェクト、ユーザの作成
これまでの手順でdemoユーザが作られずadminしかない場合は
demoユーザを作成しておきます。

管理→プロジェクト→プロジェクトの作成
 名前:demo
 説明:demo_project
 有効可:チェック

管理→ユーザ→ユーザの作成
 ユーザ名:demo
 パスワード:
 プロジェクト:demo
 ロール:_member_

ここでログオフしてdemoユーザでログインし直します。

http//ipaddress/dashboard
ユーザ名:demo
パスワード:<demoのパスワード>

■セキュリティグループの設定

アクセスとセキュリティ-セキィリティグループ-セキィリティグループの作成
 名前:demo_group
 ルールの編集ボタンを押す
  ルール :IPプロトコル SSH / 接続元 CIDR 0.0.0.0

キーペア:demo_key
  キーはローカルパソコンにダウンロードしておきます。
 floutingIP
  セキィリティグループで使用できるIPをfloutingIPプールから取得します。

■インスタンスの起動
インスタンス→インスタンスの起動

詳細タグ
  インスタンスのソース:イメージ
  イメージ:fedora19
  インスタンス名:fedora19-01(任意)
  インスタンスタイプ: m1.medium (フレーバーと呼ばれます)
  インスタンス数:1
アクセスとセキュリティタグ
  キーペア
   demo_key
セキィリティグループ
   demo_group
ネットワーク
   demo_private
→起動ボタンをクリック。インスタンスが立ち上がります。

 ■floatingIPの割り当て
作成したインスタンスのアクションからfloating IPの割り当て
にて外部のアドレスを割り当てます。

これで物理IPにてアクセスが可能となりました。

■SSHにて仮想サーバに接続
TeraTermなどで仮想SVのfloatingIPに接続します。
サーバへのログインには作成した秘密鍵で公開鍵認証を行います。

仮想サーバはインスタンス起動時に設定したサーバ名や公開鍵がイメージに
登録され、パスワードなしでSSHログインが出来るようになっています。

導入編はこれにて終了です。
お疲れ様でした。


【OpenStack】 Icehouse 導入編 #2

風邪の方がちらほら見られるようになってきましたが、私もそのうちの一人です。
健康にはお気を付け下さい。

前回はOpenStackのダッシュボードへのアクセス確認まで行いました。
今回はOpenStackにサーバが接続するネットワークを作成します。

※もしインストーラにてネットワークのサンプルが作られている場合はあらかじめ
  削除して進めてください。


まずはadminユーザでログインを行い作業します。

■adminプロジェクト(テナント)での作業
外部ネットワーク(通常のLAN)と接続するネットワークを作成します。

 管理 → システムパネル → ネットワーク
 名前        public_net
 プロジェクト    admin
 管理状態      チェック
 共有        チェック
 外部ネットワーク チェック

外部ネットワークにチェックを入れることで外のLANとつながります。
共有にチェックを入れておかないとadminユーザ以外は使用できないので注意です。

先ほど作った外部ネットワークにサブネット(IPアドレスのサブネットアドレス)を作成し割り当てます。

 publicのリンクをクリック → サブネットの作成をクリック
 サブネット名         public_subnet
 ネットワークアドレス     br-exで利用しているネットワークアドレス
 ゲートウェイIP        外部のアドレスで使っているGWのIPアドレス
 DHCP有効          チェック
 IPアドレス割り当てプール 仮想サーバに割り当てる外部IPプール
                floating IPといいます

 サブネットのアドレスは例えばクラスCであれば192.168.5.0/24のようなアドレスです。


ここまで設定したらダッシュボードから一旦adminユーザをログアウトして、
ユーザdemoでログインをして作業を行います。

■demoプロジェクト(テナント)での作業
ここからはダッシュボードからdemoユーザで接続します。
デモユーザのサーバがつながるネットワークを作成します。
ネットワークはテナント毎に分かれており、このネットワークはdemoユーザのみしか
閲覧、使用は出来ません。

 プロジェクト→ネットワーク → ネットワークからネットワーク作成
 名前          demo_private
 管理状態       チェック
 サブネット名      demo_private_subnet
 ネットワークアドレス 任意のプライベートIPアドレスの範囲
 ゲートウェイIP     192.168.111.1 (ルーターのIPアドレス)
 DHCP有効      チェック

ネットワークが出来たらpublic_netとdemo_private_subnetを接続するためにルーターを作成して、各々のネットワークに接続します。

 プロジェクト → ネットワーク → ルーターのdemo_privateから
 ルーターの作成を実施
  名前:demo_router

 ルータを外部ネットワークに接続
 作成されたルータの右上よりゲートウェイの設定ボタンを押し、
 ルーターのゲートウェイを設定します。
 外部ネットワークで「public_net」を選び「ゲートウェイの設定」ボタンを押します。

 ルータを内部ネットワークに接続
 ルーターの名称のリンクをクリックし、ルーターの詳細画面を表示します。
 「インターフェースの追加」 ボタンを押し、サブネットからdemo_private_subnetを
 選択し「インターフェースの追加」ボタンにて接続を行います。

これで想定するネットワークが構築できたと思います。

ネットワークは以下から確認可能です。
 プロジェクト → ネットワーク → ネットワークトポロジ

次回はOpenStack上に仮想サーバを構築するところまで進めます。

【OpenStack】 Junoリリース!!

先日OpenStack の新バージョンJunoがリリースされました。

機能はあまり大きく変わっていないようなのでIcehouse R2のような感じですが
以下の点が変わったようです。

・Saharaの追加
  Hadoopの機能追加
・Swiftのバージョンアップ
  Swiftが2.0になりました
・Neutron IPv6サポート改善
  IPv6環境のサポート改善がされた模様です。
・ネットワーク機能仮想化(NFV)
  ネットワーク仮想化NFVがサポートされました

変更が少なくなってきたので熟成してきたという事でしょうか?
NFVのサポートは大きなポイントだと思います。


また、10月18日(土)にオープンソースカンファレンスが行われました。
参加の予定を考えていたのですが情報処理試験の前とのこともあって
参加は見送りましたが、Ustreamから自宅で閲覧致しました。

Junoについても少し触れていましたね。
OpenStackの検証は大変ですがまた実施をしてみたいと思います。

【OpenStack】 Icehouse 導入編 #1

みなさまいかがお過ごしでしょうか。

まつぼっくりは先日休み中に旅行に出かけておりまして、今回台風が来る前に帰れましたが、皆様ご無事でしたでしょうか?

OpenStackのSDKのPythonプログラミングを目指しておりますが、
OpenStackの構築環境が無い方のために導入方法についてご紹介したいと思います。
※OpenStackは2014年冬にリリース予定のJunoがありますが、今回は現時点で最新のIcehouseでの導入手順となります。


■OpenStackの登場人物
OpenStackで出てくる主要な役割について以下にまとめました。

Keystone:認証やエンドポイント(サービスにアクセスするURL など)を提供します。
Nova :仮想サーバを立てるためのサーバです。VMwareESXiなどに当たります
Glance :テンプレートイメージを提供します。保存先にはSwiftなどを使用します。
Cinder  :ブロックストレージの役割となります。iSCSIなどの接続を提供し、
PCのHDDのように使用するために使います。
Swift :オブジェクトストレージの役割をします。
オブジェクトストレージとはWEBにアップロードするようにAPIを使っての
アップロード方法にてデータを格納します。
Neutron :ネットワーク系を担当します。
Horizon :WEBでの管理インターフェースを管理者、エンドユーザへ提供します。
Ceilometer:利用状況の情報を提供します。
Heat :設定自動化(オーケストレータ)の機能になります。


■OS導入(CentOS 6.5)
CentOS 6.5のインストーラをDVDメディアなどで起動します。

インストーラ起動後言語設定があります。
Japanese(日本語)」を選択します。

キーボード選択画面が表示されます。
日本語」を選択します。

ストレージ選択画面が表示されます。
基本ストレージデバイス」を選択します。

※未フォーマットディスクが認識された場合。
はい。含まれていません。・・・」を選択して進めます。

ホスト名の入力画面が表示されます。
任意のホスト名を入力します。

同じ画面にて「ネットワークの設定ボタン」をクリックしてNICの設定をします。
※今回の環境はeth0のみ使用するため、eth0のみに「自動接続するにチェック」をいれてあります。

eth0の「IPv4のセッティング」を開きます。
方式を「手動」にしてIPアドレス情報を入力します。

タイムゾーン選択画面が表示されます。
アジア/東京」を選択します。

システムクロックでUTCを使用のチェックを外しておきました。

ルートの任意のパスワードを設定します。

どのタイプのインストールをしますか?と表示されます。
すべての領域を使用する」を選択します。

※このまま進めるとCinderで使用するブロックボリュームが作成できないため、/homeを削除して領域を確保されます。
homeはパーティションとしては作成されませんが、/(ルート)パーティションにディレクトリとして作成されることになります。

内容を確認し、「変更をディスクに書き込む」を選択します。

インストールタイプの確認があります。
Minimal」を選択し進めます。

インストールの完了を待ち、表示にしたがい再起動を行います。

------
OSインストール後に「cinder-volumes」という名前でボリュームを作成します。
※追加するディスクパーティションはlsblkコマンドなどで確認してください。
作成コマンド例
# pvcreate /dev/sda4
# vgcreate cinder-volumes /dev/sda4

yumコマンドでパッケージ全体を更新してきます。
# yum -y update
# reboot


■OpenStack(icehouse)インストール
ここからはOpenStackのインストールに入ります。
OpenStackのインストール方法はAll-In-Oneオプションで導入せず、answer-fileを使った方法を採用しています。
※answer-fileを使った方が後々拡張できます。


初めにリポジトリ(rdoの格納場所)登録しておきます。
# yum install -y http://rdo.fedorapeople.org/rdo-release.rpm

packstack(openstackインストールツール)導入
# yum install -y openstack-packstack

※バージョン指定が無いと最新のバージョンが入るので、下記のようにバージョン指定すると確実にicehouseが入るかと思います。
# yum install -y openstack-packstack-2014.1.1-0.25.dev1208

packstackではallinoneインストールという手軽な方法があるのですが、
今回は導入のカスタマイズができるよう設定を書いたanswerfileを使用しました

アンサーファイルひな形作成
# packstack --gen-answer-file=answer.conf

sedコマンドでanswer.conf内のIPアドレスをすべてサーバのIPで置換します。
# sed -i -e 's/172.16.x.xx/192.168.33.254/g' answer.conf

既定で作成されるのネットワークを無効
answer.confファイルのCONFIG_PROVISION_DEMOを「n」にしておきます。

PackStackを実行。インストールを行います。
# packstack --answer-file=answer.conf

○Open vSwich設定
PackStack完了後はbr-exにeth0の割り当てが自動で行われないので、以下の手順を実施します。

br-ex(ブリッジ)インターフェースの追加
# ovs-vsctl add-br br-ex

br-exへeth0を追加
# ovs-vsctl add-port br-ex eth0
追加した状態を確認
# ovs-vsctl show

結果以下のようになるはずです。
※ならない場合は手動で編集してください。
--------------------------------------------
/etc/sysconfig/network-scripts/ifcfg-br-ex
DEVICE=br-ex
TYPE=OVSBridge
DEVICETYPE=ovs
ONBOOT=yes
BOOTPROTO=static
IPADDR=172.16.x.xx
NETMASK=255.255.255.0
--------------------------------------------
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=xxxxxxxxx
TYPE=OVSPort
UUID=xxxxxxxxx
ONBOOT=yes
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
--------------------------------------------
※念のためnetworkを再起動しておきましょう。
# service network restart


○ダッシュボードパスワード設定
Horizoに入る初期パスワードを設定します。

adminユーザのパスワード変更】
# source /root/keystonerc_admin
# keystone user-password-update admin
New Password: XXXXXXX
Repeat New Password: XXXXXXX

一行目のkeystonerc_adminファイルをsourceコマンドを使って環境変数に読み込んでいます。keystonerc_adminにはユーザadminの初期パスワードなどの情報が含まれます。

このファイルを読み込ませることでkeystoneにアクセスが可能となります。
またその後にkeystoneコマンドを使うことでパスワードを変更しています。
OpenStackにはPythonSDKを使っての操作以外にコマンドを使っての操作があります。


初期パスワードはkeystonerc_adminファイルを書き換えておきます。

 # vi /root/keystonerc_admin
export OS_USERNAME=admin
export OS_TENANT_NAME=admin
export OS_PASSWORD=XXXXXXX   ←ここを変更後のパスワードに変更
export OS_AUTH_URL=http://172.16.x.xx:35357/v2.0/
export PS1='[\u@\h \W(keystone_admin)]\$ '


admin同様、demoユーザのパスワードも変更しておきましょう。
# source /root/keystonerc_admin
 ※管理者adminでログインしてdemoユーザのパスワードを変えている。
# keystone user-password-update demo
New Password: XXXXXXX
Repeat New Password: XXXXXXX

# vi /root/keystonerc_demo
export OS_USERNAME=demo
export OS_TENANT_NAME=demo
export OS_PASSWORD=XXXXXXX   ←ここを変更後のパスワードに変更
export OS_AUTH_URL=http://172.16.x.xx:5000/v2.0/


keystonerc_adminファイルとkeystonerc_demoファイルを見ると、
keystoneにアクセスするTCPポート番号が異なっていることが判るかと思います。
管理者は35357を用い、一般ユーザは5000を用います。


○ダッシュボード(Horizon)へのログイン
サーバのIPアドレスでWEBブラウザからアクスしてログインできるか確認します。
http://172.16.x.xx/dashboard


基礎的なインストールまで完了しました。
続きはダッシュボードにログインして環境作成となります。

長文を読んで頂きありがとうございました。

iptablesの動き

先日の台風はみなさん通勤、通学いかがだったでしょうか。
朝の忙しい時間帯だったので、大変なおもいをされた方も多いかと思います。
まつぼっくりも5時ごろ目が覚めてテレビやインターネットで祈るように(電車止まれ!?)見ておりましたが、7時ごろあきらめ会社に向かいました。

このブログは今までOpenStackのプログラミングを取り上げてきましたが、
環境設定のところでiptablesの設定を色々と変更致しました。

「iptablesとはなんぞや?」という人とか
「iptables?知ってるよ!でもちゃんと書いたことは無いけどね!」という人も
「LPICで勉強したよ!」という方もう一度おさらいしてみませんか?


iptablesの概要図をご覧ください。ここではfilterとNATテーブルの内容を中心に記載しています。


iptablesは大きく4つのテーブル(役割)に分けられており、iptablesで一番代表的なファイアーウォールの機能はfilterテーブル内で行われています。
他にIPアドレスなどの変換はNATテーブルで行っています。

このようにiptablesは役割別に大きくテーブルの区分けがされており、テーブル内の動作毎にチェーン(Chain)が設定されていると考えると判りやすいと思います。
なお、Chainはその中の細かなルールです。


さて先日OpenStackのプログラム環境の作成時に以下のiptablesの設定を入れましたね。
設定内容を分解してみましょう。
--------------------------------
-A INPUT -s 172.16.0.22/32 -p tcp -m multiport --dports 9292 -m comment --comment "002 glance incoming glance_172.16.0.22" -j ACCEPT
--------------------------------

・「-A」はこのルールを追加することを意味しています。
・次にテーブル名を意味する「-t filter」が入るはずなのですが、filterの場合のみ省略可能です。
  NATの場合は「-t NAT」が入ります。
・「INPUT」はパケットの入力するチェーンを指定しています。
・「-s」は送信元のIPアドレスです。
・「-p」はプロトコルです。
・「-m」は特別で、カーネルモジュールをロードして様々なパケットマッチを行うことができます。
・「--dports」は送信先ポートです。
・ 「-j」は条件に合ったときのアクション


iptablesの内容は「iptables -L」コマンドで確認する事ができます。
-----------------------------------------------------
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
-----------------------------------------------------

INPUT、FORWARD、OUTPUTのChainがあることがわかります。

Chain横の括弧内に書かれているのはデフォルトのポリシーといって、Chain内にある全てに該当しない場合に適用されます。

iptablesはコマンドで「/etc/sysconfig/iptables」に書き込みができます。

以下のようにすると追加したルールはチェーンの一番下に追加されます。
# iptables -A INPUT -s 172.16.0.22/32 -p tcp -m multiport --dports 9292 -j ACCEPT

ルールは上部からマッチしたところで解釈されてしまうため、チェーンの一番最後に追加されると不都合が生じることがあります。
追加する行番号を指定する場合は以下のようにすればよいでしょう
# iptables -I INPUT 3 -s 172.16.0.22/32 -p tcp -m multiport --dports 9292 -j ACCEPT

不要なルールを削除するときは「-D」を入れて実行します。
# iptables -D INPUT -s 172.16.0.22/32 -p tcp -m multiport --dports 9292 -j ACCEPT

完了したら保存し、サービスを再起動します。
/etc/init.d/iptables save
service iptables restart


OpenStackのようにiptablesが書き込まれているときはエディタで「/etc/sysconfig/iptables」を直接編集した方が早いし楽かもしれません。
保存したらiptablesのサービス再起動です。

【OpenStack】 Python SDK コーディング #4

先日肩をもうれつに痛めてしまい四十肩疑惑をもたれているまつぼっくりです。

最近気温が急激に下がったためか、運動不足がたたったのか判りませんが、
毎日鎮痛剤の貼り薬を付けながら我慢して仕事に向かっています。

さて、前回のOpenStackのスクリプトの続きです。
残っているネットワーク機能のneutronとブロックストレージのcinderについての動作確認です。

ネタバレをすると2つのサービスともiptablesでブロックされているため、
glanceの時同様エラーとなり、ポートの開放をしております。

OpenStackコントローラーの/etc/sysconfig/iptablesに以下2つを追加しました。
RDOではneutron、cinder共に自分自身のIPアドレスのフィルタールールがあると思いますので、そちらのすぐ後にそれぞれ挿入して下さい。

-A INPUT -s 172.16.0.22/32 -p tcp -m multiport --dports 9696 -m comment --comment "002 neutron server incoming neutron_server_172.16.0.22_172.16.0.22" -j ACCEPT
-A INPUT -s 172.16.0.22/32 -p tcp -m multiport --dports 3260,8776 -m comment --comment "002 cinder incoming cinder_172.16.0.22" -j ACCEPT


$ cat neutron_netlist.py
#!/usr/bin/python
from open_conn_demo import neutron

nnet = 'demo_private'

for nets in neutron.list_networks(name=nnet):
        print nets

実行結果
$ ./neutron_netlist.py
networks


$ cat cinder_vollist.py
#!/usr/bin/python

from open_conn_demo import cinder

for vol in cinder.volumes.list():
        print vol

実行結果
$ ./cinder_vollist.py
<Volume: 1a8650be-36d1-4e52-a12b-6c885da3b521>


おそらくneutron、cinderの2つとも情報を取得できているはずです。
一旦はAPI取得スクリプトの動作検証は終わりです。

これら以外にもOpenStackにはswiftやceilometerなどの機能があるのですが、
おいおいやっていきましょう!(あまり検証できていなかったりする)
これからの記事このAPIを使ってOpenStackを操作したいと考えております。


マイクロソフトのセミナーに行ってきました。

先日マイクロソフトのmstepセミナーに行ってきました。
品川で降りてマイクロソフトに向かいます。

品川駅もすごくきれいになりましたよね。
駅の通路に液晶ディスプレイがたくさん並んでいます。



会場には結構早く着いたので朝食の時間が取れました。
コンビニでサンドイッチを買って広い中庭で過ごせました。

今回のセミナーはAzure ActiceDirectory(AzureAD)とSaaSの連携の話でした。

恥ずかしながら私はAzureADというのを知らずに受講してしまったのですが、
Azure ADはクラウド上にオンプレミスで作っていたActiveDirectoryをたてると
いうのでは無く、Office365やSalesForce、GoogleAppsなどのSaaSアプリケーションに対するID認証(Identity)を行える全く異なるものとの事でした。

これまでのOUのような階層構造は取っておらずフラット構造を取り、
グループポリシーなどもありません。

これまでの企業組織のADとAzureADは連携することもできるので、その連携方法によってはADFS(フェデレーションサービス)を使って、認証を企業のオンプレミスADにて行い、認可をクラウド上のAzureADにて行うといったことも出来ます。

※認証認可を簡単に説明すると認証はパスワード等によるログオン、認可は権限付与という意味になります。

認証部分をオンプレミスにすることによりパスワードをクラウドに持たせない運用が行えます。

しかしこれではオンプレミスADの障害時にクラウドのサービスが認証できなくなるので、
パスワードのハッシュのみをAzureADに持たせる事が可能との事です。
パスワード自体はクラウドにコピーせずともオンプレミスのADの障害時は認証にて
入力したパスワードのハッシュ値とAzureAD上に保存されたハッシュパスワードを
比較し、ログオンが可能という仕組みです。

一日コースだったので他にもたくさんの機能の説明があったのですが、クラウド分野の
MSの本気を感じました。Azure関連の検証も今後やってみたいと思っております。

さて、少し寄り道となりましたが次回はOpenstackのneutron、cinderの残りの動作確認を書きたいと思います。

読んでいただきありがとうございました。

【OpenStack】 Python SDK コーディング #3

来月、クラウドコンピューティングEXPO秋が幕張で行われます。
まつぼっくりも観覧に行く予定ですので、その際には現場の空気を
レポートいたします。お楽しみ下さい。

前回Keystoneの動作を確認しましたね。

ついでといってはなんですが、Keystoneにてユーザを作成する
スクリプトを載せておきます。

$ cat keystone_userlist.py
#!/usr/bin/python

from open_conn_admin import keystone

keystone.users.create(name="nssadmin",
        password="secretword",
        tenant_id="2783e814686846a398f69763c906b6cb")


実行結果
$ ./keystone_userlist.py
(結果抜粋)
-----------
nssadmin
ddf69a5f55f4419b9f3908d7243ae737
None
-----------

上記のスクリプトで読み込んでいるopen_conn_adminは第一回で
作成したスクリプトです。
Keystoneを呼び出し、usersのcreateメソッドを呼び出しnssadminを
作成しています。
このようにオブジェクトさえ取得してしまえば案外簡単に操作をすることができます。


さて、これからはKeystone以外のサービスを確認しますよ。
次は仮想サーバのサービスのNovaです。

$ cat nova_vmlist.py
#!/usr/bin/python

from open_conn_demo import nova

for sv in nova.servers.list():
        print sv

実行結果
$ ./nova_vmlist.py
<Server: test>
案外簡単に仮想マシンのリストが取得できました。


次はテンプレートイメージを管理するglanceです。
$ cat glance_imagelist.py
#!/usr/bin/python

from open_conn_admin import glance

for image in glance.images.list():
        print image

実行結果
$ ./glance_imagelist.py
Traceback (most recent call last):
  File "./glance_imagelist.py", line 5, in <module>
    for image in glance.images.list():
  File "/usr/lib/python2.6/site-packages/glanceclient/v1/images.py", line 174, in paginate
    images = self._list(url, "images")
  File "/usr/lib/python2.6/site-packages/glanceclient/common/base.py", line 53, in _list
    resp, body = self.api.json_request('GET', url)
  File "/usr/lib/python2.6/site-packages/glanceclient/common/http.py", line 266, in json_request
    resp, body_iter = self._http_request(url, method, **kwargs)
  File "/usr/lib/python2.6/site-packages/glanceclient/common/http.py", line 235, in _http_request
    raise exc.CommunicationError(message=message)
glanceclient.exc.CommunicationError: Error communicating with http://172.16.0.10:9292 [Errno 113] No route to host


イメージのリストを取得するスクリプトですが、おや、大量にエラーを吐きました。
まつぼっくりの環境では管理端末からOpenStackへ命令を送っているのですが、
出力されたエラーを見るとその通信に問題が発生したようです。

glanceの通信がOpenStackコントローラー側のiptablesにてTCPポート9292の
通信が切断されている可能性がありますね。
試しにOpenStackのiptablesを停止して確認してみます。


OpenStackコントローラーにて実行
[root@sv01 ~]# service iptables stop
iptables: チェインをポリシー ACCEPT へ設定中filter nat mangle [  OK  ]
iptables: ファイアウォールルールを消去中: [  OK  ]
iptables: モジュールを取り外し中: iptable_filter iptable_nat iptable_filter iptable_nat ip_tables[失敗]

サービス停止中に[失敗]したのはiptable_natですが、OpeStackコントローラー内部にてアドレス変換のNAT処理が行われているため、その停止が出来なかったようです。
サービス停止でフィルターは停止したため、
この状態でglanceのスクリプトを実行してみましょう。


実行結果
$ ./glance_imagelist.py
<Image {u'status': u'active', 
u'virtual_size': None, 
u'name': u'fedora', 
u'deleted': False, 
u'container_format': u'bare', 
u'created_at': u'2014-09-04T21:45:55', 
u'disk_format': u'qcow2', 
u'updated_at': u'2014-09-04T21:48:57', 
u'properties': {}, 
u'owner': u'e7e70b90c404447184784b1b2108edac', 
u'protected': True, u'min_ram': 0, 
u'checksum': u'511d9d3235079f1c381d39eb5a9fda1e', 
u'min_disk': 0, u'is_public': True, 
u'deleted_at': None, 
u'id': u'486897ff-ff66-4287-ada6-45735285c2b4', 
u'size': 239534080}>
※結果は見やすいよう生成しています


無事イメージのリストが取得できたようです。
このままiptablesを停止したままにしてはおけないのでglanceの通信が通るためのフィルタールールを追加します。

iptablesの設定ファイルを見ると以下のルールがありました。
/etc/sysconfig/iptables
-A INPUT -s 172.16.0.10/32 -p tcp -m multiport --dports 9292 -m comment --comment "001 glance incoming glance_172.16.0.10" -j ACCEPT

管理端末からのTCP9292を開けてあげれば良さそうです。
ちょっと無理やりですが、上記のルールの直下にviエディタで以下のルールを一行追加します。

-A INPUT -s 172.16.0.22/32 -p tcp -m multiport --dports 9292 -m comment --comment "002 glance incoming glance_172.16.0.22" -j ACCEPT
※172.16.0.22は管理端末のIPアドレスです。

iptablesを再起動します。
[root@sv01 ~]# service iptables restart

再度スクリプトを管理端末から実行し、フィルターが正しく設定されたことを確認します。
$ ./glance_imagelist.py


あとneutron、cinderの接続確認があるのですが、エラーが発生してしまい
記事の説明が長くなってしまったので次回とさせていただきます。

ごきげんよう。

【OpenStack】 Python SDK コーディング #2

最近はすっかり秋めいてきました。
暑い中の楽しいビールが味わえなくなってくるのはさみしいものです。


さて前回はOpenStackへ接続を行うための初期スクリプトを作成しました。

スクリプトの中にパスワードを直書きにしてしまっていますが、
テスト環境ということで先に進み後ほど直そうかと思います。

今回は作成したスクリプトを実行してみます。

pythonのファイルを実行するには以下のようにすれば実行可能です。

$ python 実行ファイル名.py

スクリプトファイルの文頭に「#!/usr/bin/python」や「#!/usr/bin/env python」
のように書かれている場合はファイルのパーミッションに実行権限を加えることで
スクリプトを直接実行可能です。

$ chmod 550 実行ファイル名.py
$ ./実行ファイル名.py

特に何もエラーが出なければモジュールのインポートは問題なくされていますので
次に進みます。
エラーが出た場合はエラー行数やエラー文字を確認して誤りを修正して下さい。


以下のスクリプトはOpenStackの登録されているユーザのリストの一覧を得るスクリプトです。
open_conn_admin.pyを呼び出すため同じディレクトリに置いてください。

$ cat keystone_userlist.py
#!/usr/bin/python

from open_conn_admin import keystone

for user in keystone.users.list():
        print "-----------"
        print(user.name)
        print(user.id)
        print(user.email)


このスクリプトは管理者であるopen_conn_admin.pyからkeystoneのオブジェクトを
インポートしています。
keystoneのオブジェクトからユーザのリストを取得し、一人づつ情報を出力してます。

ユーザの一覧を取得するには一般(demo)ユーザでは権限がなく失敗するようで管理者のスクリプトを使います。
keystoneとは簡単に言うとユーザのアカウント情報や各サービスのエンドポイント(URL)の情報を持っており、各サービスに情報を提供しています。


コマンドを実行すると以下のような結果が得られればkeystoneの部分に関しては問題無いと言えます。

$ ./keystone_userlist.py
-----------
tester
117537ab3cec4d9494a11e8112dfc1f5
None
-----------
cinder
3c55f0a46e00455e924852d8d5d9c552
cinder@localhost
-----------
swift
54dffaddbc464a9098c1640ba7f2fe75
swift@localhost
-----------
nova
62cceb6f7f444a1597777777cf34b590
nova@localhost
-----------
dummy
7512066e0bad4ab58dc154a714eae4cf
dammy@example.org
-----------
admin
9194cbebe1ff4eb9b6acadc39d9e2b7f
test@test.com
-----------
ceilometer
b660191798424c8c963654aa7bd22377
ceilometer@localhost
-----------
demo
b69e41f4d94f4b3d9a1c14859fe3d20f
None
-----------
glance
df0d05c0c86145a8a0d40b181b9ce648
glance@localhost
-----------
neutron
f96cb2e94eea42808b29c08c956c06ca
neutron@localhost


今回はKeystoneの動作確認となります。

【OpenStack】 Python SDK コーディング #1

こんにちは、まつぼっくりと申します。

9月の3連休も終わってしまいましたね~
ずっと実家にいたのですが、あっというまに過ぎてしまいました。


さて、本題ですが世間ではつい先ほどに仮想化の波がきたかと思ったら今度は
プライベートクラウドの導入の波が来ているようです。

プライベートクラウドとは社内でAmazonAWSのようなIaaSを構築するというもの
ですが、有名どころではOpenStackやCloudStack、最近ではマイクロソフトからも
Azure Packという見た目がAzureの社内IaaSが出てきており、どれが主流となるかと
わくわく、ドキドキしております。

クラウドの展開と共に現在は運用の自動化が良くテーマに上がっており、今後は
プログラムが行える運用・構築エンジニアが勝ち残るのかなと感じており、実機
での検証を中心にコーディングを記事にしたいと思っています。

コーディングだけでなく箇所々々で基礎的な解説も入れつつゆっくり進んでいけたら
と考えております。



まずは仮想化OSとして有名なOpenStackにおけるPython SDKのコーディングです。


OpenStack(icehouse)は一台構成ですでに構築済みとなっております。




構築方法については今後どこかで紹介を入れたいと思います。


OpenStackSDKはOpenStackのサーバに導入されているため、
サーバ本体にPythonのスクリプトを置いて直接実行することができますが、
今回は別のクライアントを用意してスクリプトを実行し、OpenStackのコントローラーに命令を送ります。


クライアントはCentOS6.5を用意いたしました。
クライアントにOpenStackのPythonSDKを入れることでPythonスクリプトを用いて
OpenStackのコントローラーへアクセスすることが可能となります。

CentOSであればyumコマンドを用いて導入することが可能です。
yumが使えない場合はPythonのpipなどを用いてSDKをインストールして下さい。


<keystoneのSDKの導入例>
# yum install python-keystoneclient

  <OpenStack SDK>
  python-cinderclient
  python-novaclient
  python-keystoneclient
  python-glanceclient
  python-neutronclient
  python-swiftclient


SDKにて接続するためにはSDKをインポートし、認証先を入力してオブジェクトを
取得する必要があります。
以下2つのスクリプトを今後ほかのスクリプトで読み込みオブジェクトに対して
情報取得や命令を実施します。
ここではadminユーザ用とdemoユーザ用を用意しています。
スクリプトの保存場所はどこでも構いません。

admin用:open_conn_admin.py
demo用 :open_conn_demo.py


$ cat open_conn_admin.py
import keystoneclient.v2_0.client as ksclient
import novaclient.v1_1.client as nvclient
import cinderclient.v1.client as ciclient
import glanceclient.v1.client as glclient
from neutronclient.neutron import client as neclient

c_url = 'http://172.16.0.10:35357/v2.0'
n_url = 'http://172.16.0.10:9696/'
c_user = 'admin'
c_pass = 'xxxxxxxx'
c_tenant = 'admin'

keystone = ksclient.Client(auth_url=c_url,
                           username=c_user,
                           password=c_pass,
                           tenant_name=c_tenant)

nova = nvclient.Client(auth_url=c_url,
                           username=c_user,
                           api_key=c_pass,
                           project_id=c_tenant)

cinder = ciclient.Client(auth_url=c_url,
                           username=c_user,
                           api_key=c_pass,
                           project_id=c_tenant)

glance = glclient.Client(keystone.service_catalog.url_for(
                        service_type='image',
                        endpoint_type='publicURL'),
                        token=keystone.auth_token)

neutron = neclient.Client('2.0',
                        endpoint_url=n_url,
                        token=keystone.auth_token)


$ cat open_conn_demo.py
import keystoneclient.v2_0.client as ksclient
import novaclient.v1_1.client as nvclient
import cinderclient.v1.client as ciclient
import glanceclient.v1.client as glclient
from neutronclient.neutron import client as neclient

c_url = 'http://172.16.0.10:5000/v2.0'
n_url = 'http://172.16.0.10:9696/'
c_user = 'demo'
c_pass = 'xxxxxxxx'
c_tenant = 'demo'

keystone = ksclient.Client(auth_url=c_url,
                           username=c_user,
                           password=c_pass,
                           tenant_name=c_tenant)

nova = nvclient.Client(auth_url=c_url,
                           username=c_user,
                           api_key=c_pass,
                           project_id=c_tenant)

cinder = ciclient.Client(auth_url=c_url,
                           username=c_user,
                           api_key=c_pass,
                           project_id=c_tenant)

glance = glclient.Client(keystone.service_catalog.url_for(
                        service_type='image',
                        endpoint_type='publicURL'),
                        token=keystone.auth_token)

neutron = neclient.Client('2.0',
                        endpoint_url=n_url,
                        token=keystone.auth_token)


次回はこのスクリプトを使って正常に動作するかの確認を行います。