Octopress Blog

自分のためのまとめブログ

(第31回)Python Mini Hack-a-thon

おのおのが好きな事を好きなようにやるハッカソン。 実際に自分の手を動かすのは楽しいですね。

ストレージ拡張自動化システム検討

日本人のみ相手に仕事をしている場合は、わからないことがあれば話をしながら進めることができるが、 海外も視野に入れると時差も休日も言語も違い、これを話しながら進めるのは現実的ではない。

Webフォームから値を入力するとバッチ処理で自動的にストレージ(NAS)の拡張ができるシステム構築を目指す。

  • Webサーバ
    Pythonのフレームワークを利用してWebの入力フォームを作成。 NAS名やボリューム名、拡張サイズを入力する。

  • バッチサーバ
    cronなどジョブスケジューラーを利用してWebフォームで入力された値に従ってバッチ処理を行う。
    fabricを利用予定。

  • NAS管理サーバ
    既存のNASを管理しているサーバ。こちらには新たに設定を追加せず、fabricを利用して バッチサーバからssh経由で送られてきたコマンドを自動で実行するようにしたい。

  • NASサーバ
    拡張対象のNASサーバ

バッチサーバ

fabricインストール

Amazon Linuxは以下でインストール可能

1
2
3
4
5
6
sudo su
yum -y install python python-devel gcc
curl http://python-distribute.org/distribute_setup.py | python
curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
pip install fabric fexpect
exit

Python自動実行スクリプト作成

まだfabricは絡んでおらず、printでコマンドを書き出しているのみ。

jsonファイル中身

NAS_param.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
    {
        "nas": "(NAS Name)",
        "volume": "(Volume Name)",
        "size": "(Volume size)"
    },
    {
        "nas": "nas_backup01",
        "volume": "apache_log",
        "size": "+5g"
    },
    {
        "nas": "nas_backup02",
        "volume": "tomcat_log",
        "size": "+500m"
    },
    {
        "nas": "nas_ecsite01",
        "volume": "item_image",
        "size": "+10g"
    }
]

これを読み込んで処理する。

read_NAS_param.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/python
# coding: utf-8

import json # jsonを扱うため
import sys  # モジュール属性 argv を取得するため

argvs = sys.argv  # コマンドライン引数を格納したリストの取得
argc = len(argvs) # 引数の個数

f = open("NAS_param.json")  # jsonファイルを読み込む
data = json.load(f)         # jsonデータを読み込んだファイルオブジェクトからPythonデータを作成
f.close()                   # ファイルを閉じる

num = len(data)             #ファイル数をカウント

if argc == 2 and argvs[1] == "--help":
  print( "sudo ssh {obj[nas]} vol resize {obj[volume]} {obj[size]}".format(obj = data[0]) )    # ヘルプを表示

if argc == 1:
  for i in range(num)[1:]:     # 配列の2列目から実行
      print( "sudo ssh {obj[nas]} vol resize {obj[volume]} {obj[size]}".format(obj = data[i]) )

 デバッグ等コメントは削除

ハッカソン中は引数が無いとエラーになっていたが、上記のようにargc == 2 andを追加するとうまく実行できるようになった。

以下実行結果

1
2
3
4
5
6
7
fukui-no-MacBook-Air:python_json ftakao2007$ ./read_NAS_param.py --help
sudo ssh (NAS Name) vol create (Volume Name) (Volume size)

fukui-no-MacBook-Air:python_json ftakao2007$ ./read_NAS_param.py
sudo ssh nas_backup01 vol create apache_log 5g
sudo ssh nas_backup02 vol create tomcat_log 500m
sudo ssh nas_ecsite01 vol create item_image 10g

Helpも実行結果も問題なく表示された。

Webサーバ

w3mインストール

動作確認用

1
yum install w3m

Bottle インストール

Djangoが難しかったのでこっちを使ってみた

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget https://pypi.python.org/packages/source/b/bottle/bottle-0.11.4.tar.gz
tar zxvf cd bottle-0.11.4.tar.gz
cd bottle-0.11.4
vi hello.py
==============================
from bottle import route, run

@route('/hello')
def hello():
  return "Hello World!"

run(host='localhost', port=8080, debug=True)
==============================
python hello.py &
w3m http://localhost:8080/hello

以下のようにするとPCのWebブラウザからリモートアクセスできた。

1
2
run(host='ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com', port=80, debug=True)
sudo python hello.py  #この場合はsudoで実行

※ 以下挫折中 ※

httpdインストール

1
2
sudo yum -y update
sudo yum -y install httpd

Django インストール

1
2
3
4
5
sudo yum install mod_wsgi
sudo pip install django
sudo mkdir /var/www/html/django
cd /var/www/html/django
sudo django-admin.py startproject mysite

開発用サーバの起動と確認

SGの設定で8080ポートを開けておく

1
2
3
4
5
cd mysite
python manage.py runserver 8080 &
w3m http://127.0.0.1:8080

※ 「It worked!」が出れば成功

〜つづく〜

その他

Zaimの家計簿自動入力スクリプトの作成もやりたかった。現在は認証のとろころで詰まってます。ググって自力でできるかなぁ。 できなかったら、次回はその辺やってみて有識者の知恵を拝借できればと思います。