NaviPlus Engineers' Blog

NaviPlusの開発環境

インフラ池田(@mikeda)です。
今日はNaviPlusの開発環境について話します。

今回話すのは各開発者が自由にいじれる個人向けの開発環境についてです。
※ステージング環境、デモ環境は別途、DCにVMが常時起動しています。

ちなみに1年前はDCに共用開発サーバが何台かあって、それを取り合いながら開発していました。
このころはいくつか不便なことがありました。

インフラとしても『新しいミドルウェアを検証して終わったらポイ』みたいなのができなくて不便でした。
こういう『やってみたい』をすぐ実現できないのは機会損失の1つだと思ってるので、なんとかしないとですね。

というわけで『開発環境をもっとみんな好き勝手に作れるように』と、現在は以下の2つが整備されています。

それではこの2つの構築手順を紹介します。

※サーバ構築環境の細かい設定などについては『NaviPlusのサーバ構築』を参照して下さい。

ローカル開発環境

Vagrantを使って個人マシン(だいたいみんなMac)に本番と同じ環境を作れるようにしています。
開発、chefのレシピのテストは主にこれを使っています。

VirtualBoxとVagrantインストールする

手順は省略

Vagrantfileを作る

みんないろいろカスタマイズしてるみたいですが、自分のはこんな感じです。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant::Config.run do |config|
  config.vm.box = "centos6_naviplus"
  config.vm.box_url = "http://192.168.1.100/vbox/centos6_naviplus.box"

  config.vm.define :myreco do |config|
    config.vm.network :hostonly, "192.168.33.11"
    config.vm.customize ["modifyvm", :id, "--name", "myreco"]
    config.vm.customize ["modifyvm", :id, "--cpus", "2"]
    config.vm.customize ["modifyvm", :id, "--memory", "2048"]
    config.vm.customize ["modifyvm", :id, "--nictype1", "virtio"]
    config.vm.customize ["modifyvm", :id, "--nictype2", "virtio"]
  end

  config.vm.define :mysearch do |config|
    condig.vm.network :hostonly, "192.168.33.12"
    condig.vm.customize ["modifyvm", :id, "--name", "mymunin"]
    condig.vm.customize ["modifyvm", :id, "--cpus", "2"]
    condig.vm.customize ["modifyvm", :id, "--memory", "2048"]
    condig.vm.customize ["modifyvm", :id, "--nictype1", "virtio"]
    condig.vm.customize ["modifyvm", :id, "--nictype2", "virtio"]
  end
end

書き方が古いよって警告が出るので修正しないとなぁ・・・

VMイメージは、本番環境でOSインストール&初期設定が完了したのと同じになるようにカスタマイズしたものを使っています。
※昔、veeweeを使って作ったのですが、かなりマゾかった・・・

VMを起動する

vagrant upするとVirtualBox上にVMが作成されます。

$ vagrant up myreco

chef-solo実行

VMが起動したら、管理ユーザでログインしてchef-soloを実行します

$ sudo chef-solo -c ~/chef/solo/solo.rb -j ~/chef/nodes/XXX.json

手動構築したい時用に、最低限のレシピのみを記述したnode定義も作成しています。

$ sudo chef-solo -c ~/chef/solo/solo.rb -j ~/chef/nodes/default.json

これでOS、MW系のセットアップが完了します。
あとは必要に応じてアプリのdeploy、migrateとかをやってきます。

DC開発環境

DC上の開発用のKVMホスト上に、だれでも自由にVMを作っていいことにしています。
常時起動やみんなで共有が必要な場合はこっちを使います。

Redmine上のVM使用リストを更新

ドキュメントやローカルDNSの更新が面倒なので、ホスト名とIPは基本決め打ちで使いまわしてます。

VM作成

VM作成スクリプトを調整して

[root@dev-vmhost01 ~]# vim vm_create.sh  
#!/bin/bash

HOSTNAME=test02
IP=192.168.1.202
VCPUS=2
RAM=2048
DISK=30
...

VM作成

[root@dev-vmhost01 ~]# ./vm_create.sh

しばらく待つとOSのインストールと初期設定が完了します。

ちなみにVM作成スクリプトはこんな感じ

#!/bin/bash

HOSTNAME=test04
IP=192.168.1.204
VCPUS=2
RAM=4096
DISK=20

LOCATION="http://192.168.1.100/mrepo/centos6-x86_64/disc1/"
LV=/dev/vm_vg/lv_${HOSTNAME}

if [ -b $LV ];then
  echo 'LV is already exists'
  exit
fi

lvcreate -L ${DISK}G -n lv_${HOSTNAME} vm_vg

virt-install \
  --name $HOSTNAME \
  --ram $RAM \
  --vcpus=$VCPUS \
  --disk path=${LV} \
  --os-variant=rhel6 \
  --hvm \
  --nographics \
  --accelerate \
  -w bridge:br0 \
  --location="${LOCATION}" \
  --extra-args="ks=http://192.168.1.100/ks/ks_kvm.php?cfg=centos6.cfg__${HOSTNAME}__${IP} console=tty0 console=ttyS0,115200n8"

chef-solo実行

ローカル開発環境と同じです。

まとめ

というわけで、NaviPlusの個人向け開発環境についてでした。

基本的に『本番環境を構築しているのと同じ手順で、だれでも自由に開発環境を作れる』ようにしています。
これは冒頭の目的に加え、少人数のチームでサービスを運用していくにあたってサーバ構築、特にMWの管理と知識をできる限りインフラチームに閉じたものにしたくなかったからです。
これらの環境を整備してから、githubで管理されているchefのレシピに開発チームからいろいろプルリクが来るようになりました。

DevOps!!!