インフラ池田(@mikeda)です。
今日はNaviPlusの開発環境について話します。
今回話すのは各開発者が自由にいじれる個人向けの開発環境についてです。
※ステージング環境、デモ環境は別途、DCにVMが常時起動しています。
ちなみに1年前はDCに共用開発サーバが何台かあって、それを取り合いながら開発していました。
このころはいくつか不便なことがありました。
- コストがかなりかかる
- 使うときの調整がめんどう(「dev01って今だれが使ってるんだっけ!?」みたいな)
- 共用なので好きにいじれない
インフラとしても『新しいミドルウェアを検証して終わったらポイ』みたいなのができなくて不便でした。
こういう『やってみたい』をすぐ実現できないのは機会損失の1つだと思ってるので、なんとかしないとですね。
というわけで『開発環境をもっとみんな好き勝手に作れるように』と、現在は以下の2つが整備されています。
- ローカル開発環境
- DC開発環境
それではこの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のレシピに開発チームからいろいろプルリクが来るようになりました。
- Rubyのバージョンアップ
- Apacheの設定調整
- muninの監視追加
- Redisのレシピ(現状は内部むけ管理画面で使用)
- …
DevOps!!!