メニュー

chef-soloで使うrpmの配信サーバーを立ててみる

開発2部の吉岡です。

現在、開発環境をどんな感じで構築しようかと考え中ですが、各所で話題のchef-soloとVagrantを使って挑戦してみました。

なんだかんだで3回に分けて掲載していこうかと思います。

ひとまず、開発環境をとしては、下記のようなものが欲しいです。

  1. 各開発スタッフが手早く開発環境を使用できるようにする。思い立ったら即環境をゲット出来るようにしたいです。
  2. ミドルウェアの変更など、開発環境の変化も各スタッフで共有出来るようにする。各スタッフがなるべく同じ環境を使用できるようにしたいです。
  3. 本番環境も考えた環境を使用したい。ミドルウェアのバージョン等、本番で使用するものと出来るだけ同じにしたいです。
  4. プロジェクト終了後でも、環境を復旧できるようにする。納品後でも動作環境を保持しておいて、検証や問い合わせ対応等の作業を行いやすくしたいです。

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

この記事をシェアする

  • twitter
  • facebook
  • Google+
  • B!はてブ
  • pocket
トップへ戻る

CONTACT

ゲーム開発、Webサイト制作に関するご相談等ございましたら、お気軽にお問い合わせください。

ゲーム開発に関する
お問い合わせはこちら

Webサイト制作に関する
お問い合わせはこちら