開発2部の吉岡です。
現在、開発環境をどんな感じで構築しようかと考え中ですが、各所で話題のchef-soloとVagrantを使って挑戦してみました。
なんだかんだで3回に分けて掲載していこうかと思います。
ひとまず、開発環境をとしては、下記のようなものが欲しいです。
- 各開発スタッフが手早く開発環境を使用できるようにする。思い立ったら即環境をゲット出来るようにしたいです。
- ミドルウェアの変更など、開発環境の変化も各スタッフで共有出来るようにする。各スタッフがなるべく同じ環境を使用できるようにしたいです。
- 本番環境も考えた環境を使用したい。ミドルウェアのバージョン等、本番で使用するものと出来るだけ同じにしたいです。
- プロジェクト終了後でも、環境を復旧できるようにする。納品後でも動作環境を保持しておいて、検証や問い合わせ対応等の作業を行いやすくしたいです。
chef-solo・Vagrant
で、chef-soloとVagrantとは何かと言うと、
- chef-solo:サーバーの構成管理ツールです。どのようにサーバーを構築するのか定義し、管理しておけます。
各種の設定パラメータを環境毎に定義したりと、何かと便利な機能が満載です。 - Vagrant:開発サーバーを手軽に扱えるようにするツール群、と言った感じでしょうか。
構築したサーバー環境を配布したり、また破棄したりということが簡単に出来ます。
すごくざっくりな説明ですが、詳細な説明は色々なところで掲載されているので省略します。
chef-soloのレシピについて
いつchefを動かしても、同じバージョンのミドルウェアがインストールされるようにしたいので、基本的にrpmでインストールすることにしました。
まず最初に各ミドルウェアのrpmをダウンロードしておき、これを保管しておくことで同じ環境を再現するという感じです。
各rpmは次のようにyumのオプションを指定することでダウンロード出来ます。
# yum install --downloadonly --downloaddir=/tmp/ httpd
yumコマンドに「–downloadonly」というオプションを付け、「–downloaddir」で保存先を指定します。
downloadonlyなんてオプションねーよ、とyumに怒られる場合は
# yum install yum-plugin-downloadonly
と試してみてください。
rpmはどこに置く?
と、rpmをかき集めるのは良いのですが、それをどこに置くかが問題になります。
そこで、社内LAN上に簡易なWebサーバーを立ち上げて、rpmのファイル名を指定すればダウンロード出来るようにしてみました。
こういう時に役に立つのがTornadoです。
python製のWebサーバーフレームワークですが、簡単にサーバーを立ち上げることが出来ます。
というわけで、作ってみたWebサーバーのコードは↓です。
web.py
# -*- coding: utf-8 -*-
import re
import os
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
BASE_DIR = os.getcwd()
HTTP_PORT = 8095
######
class Output(tornado.web.RequestHandler):
def get(self, middleware_package, rpm):
try:
self.set_header('Content-Type', 'application/octet-stream')
self.set_header('Content-Disposition', 'attachment; filename=' + rpm)
buf_size = 4096
file_name = '%s/%s/%s/%s' % ( BASE_DIR , 'rpm', middleware_package, rpm)
with open(file_name, 'r') as f:
while True:
data = f.read(buf_size)
if not data:
break
self.write(data)
self.finish()
except Exception, e:
self.write(e.message)
######
class Application(tornado.web.Application):
def __init__(self):
handlers=[
(r"^/rpm/([a-z0-9\-]+)/(.+.rpm)$",Output),
]
settings=dict(
debug=False,
)
tornado.web.Application.__init__(self,handlers,**settings)
######
define("port", default=HTTP_PORT, type=int)
if __name__=="__main__":
tornado.options.parse_command_line()
http_server=tornado.httpserver.HTTPServer(Application())
http_server.listen(options.port)
io_loop = tornado.ioloop.IOLoop.instance()
io_loop.start()
ディレクトリ構成としては
┳web.py ┗rpm ┣httpd ┃┗ダウンロードしたrpmファイル ┣php ┃┗ ダウンロードしたrpmファイル ┗mysql ┗ ダウンロードしたrpmファイル
という感じです(httpd、php、mysqlのrpmを提供する場合)。
「rpm」ディレクトリの中にミドルウェア名のディレクトリがあり、rpmファイルを格納しています。
# pip install tornado
して、
rpm/ミドルウェア名/ ディレクトリの下にrpmファイルを格納し
$ python ./web.py
すれば、webサーバーが立ち上がります。
あとは、
http://ホスト名:8095/rpm/ミドルウェア名/rpmファイル名
を指定すればrpmがダウンロードされるという感じです。
例えば
http://127.0.0.1:8095/rpm/httpd/apr–1.3.9–5.el6_2.x86_64.rpm
という感じです。
pythonはド素人状態ですが、望んでいるものはなんとか出来ました…
次回はChefのレシピ作成を行っていきたいと思います!























ピックアップ
