開発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のレシピ作成を行っていきたいと思います!