【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)


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