NSEG #39 で発表した時のスライドです。
おひとりさま環境でのChef-solo 使用例NSEG #39 2013.05.11@thinkAmi
View Slide
自己紹介• @thinkAmi• hatenaID: thinkAmi• C#, Python, Ruby• 自社インフラ管理• NSEG, GDG信州• りんご好き• 食べたりんごの内訳を表示するアプリを作成とか• http://ringo-tabetter.herokuapp.com/
PR• 5/25(土) DevFestJapan2013 信州会場– 塩尻インキュベーションプラザ (SIP)– 5/15~17に開かれるGoogle I/Oの報告会• セッションの解説・得られた情報の報告 etc• Google+ ハングアウトで日本の7会場を結び交流– 珍しいガジェットも登場予定• NexusQ, Pebble, etc (Glassは希望的観測)– Google Developer Expertの方々も参加
PR• 5/25(土) DevFestJapan2013 信州会場– 詳細は...• イベントページ– https://sites.google.com/site/devfestjapan2013/• DevFest Japan 2013 信州会場 紹介pdf– https://docs.google.com/file/d/0B-jPssOUp2xCNEx5aWt0ZXVrQ0U/edit?usp=sharing• GDG信州のハッシュタグ #gdgshinshu– 5/15深夜、Google I/O Extend 信州会場?!– http://www.zusaar.com/event/654003
アジェンダ• ある環境のおはなし• Chef-solo, knife-solo, Vagrant• その先へ• デモ
その前に• デモの準備に時間がかかるため、 事前に仕込んでいます• 準備が終わったら、手元の携帯電話に 連絡がきますが、気にしないでください
ある環境のおはなし• 某おひとりさま– Windows使い– 某社内インフラで利用
ある環境のおはなし• 仮想マシン登場前– 物理サーバーを用意・インストール• サーバーを買ってもらうのが大変...• 再インストールや類似環境の構築が手間...
ある環境のおはなし• 仮想マシン登場後– 物理サーバー1つで、複数の環境を構築– スナップショットやVMファイルのコピーで、環境の複製などが容易に– がんがん仮想マシンを作るようになった
ある環境のおはなし• そのうちに...– あれ、どのVMが最新版だっけ...– そもそも何が入っているっけ...– 手順はどこだっけ...
ある環境のおはなし• ひどいことに
ある環境のおはなし• デジャヴ
ある環境のおはなし• 解決方法を考える– 変更履歴を残す• 履歴を書き忘れる...– 環境の内容を残す• 環境を書き忘れる...– バージョン管理• ファイルサイズが大きいとか...• ...どれもダメっぽい
ある環境のおはなし• 動かないドキュメントより、それだけで動く何かがほしい!!
Chef (シェフ)• サーバーのシステム構築・運用を管理・自動化するフレームワーク– Puppetみたいなもの• Rubyで設定を書く• Chef-ServerとChef-soloがある
Chef• 用語– Cookbook• Recipe• Template• Attribute– Node– Role– etc
Chef• まずはこれだけ– Cookbook• Recipe• Attribute• Template– Node– Role– etc
Chef• Cookbook– 環境設定の定義を、まとめたもの– 環境設定の定義• Recipe• Template• Attribute• etc
Chef• Recipe– インストールや設定などの実行手順を記載
Chef• 例) Apache2のRecipe– インストールpackage "apache2" doaction :installend– 起動service "apache2" doaction :startend
Chef• Chefの管理・運用は手間...
knife(ナイフ)• Chefの管理・運用を行うためのツール– cookbookのひな形を作成– cookbookを転送してサーバーに適用– etc• Chefに同梱• プラグインあり– knife-soloとか
knife-solo(ナイフソロ)• Chef-solo用にknifeを拡張するもの• Windowsでも動く– Windowsにはrsnyc(アールシンク)がないことから、cookbookの転送は小細工する必要あり• Issue #167に上がっているので、希望を持つhttps://github.com/matschaffer/knife-solo/issues/167– rsyncがないとはいえ、Windowsにおいても他の設定を自力でやるよりは、はるかにマシ
ところで• 某おひとりさま環境– 仮想環境の構築で使いたいんだが...
Vagrant (ベイグラント)• VirtualBoxのVMを設定・操作するツール– Rubyで設定を書く• Chefと連携可能– Chefのcookbooks, Recipe等を指定
Vagrant• 用語– VagrantBox– Vagrantfile
Vagrant• VagrantBox– 仮想マシンのひな形 (OSイメージ)– 公開されているものを利用 or 自作• 公開: Vagrantbox.es にて– 公開Boxが安全かどうかは自己責任» dropboxで公開されているものとかあるし...• 自作: veewee を使う
Vagrant• Vagrantfile– 仮想マシンの設定を行うファイル• ネットワークやGUI表示 etc– Rubyで記述– Chef連携は、このファイルに記載• Windowsでは、(今のところ)ここで連携...– Cygwinがあれば、ここでなくても転送できるらしい– 他に良い情報があれば、ぜひ!
VagrantfileVagrant.configure("2") do |config|# VagrantBox名config.vm.box = "hoge"# knife soloで 使 用 す る SSHの た め の IPア ド レ ス 設 定config.vm.network :private_network, ip: "192.168.33.10"# Recipeの 実 行config.vm.provision :chef_solo do |chef|chef.cookbooks_path = "./chef-repo/cookbooks"chef.add_recipe "piyo"endend
3つのツールの連携• 某おひとりさま環境– knife-soloで環境準備– Chef-soloでcookbook準備– Vagrantで仮想マシンへcookbook転送し 自分がほしい仮想マシンをGet!• 普通はChefのcookbookのテストとかで使うかと
仮想マシンを手に入れる流れ• 流れの前に– 各ツールのインストールやcookbook,Vagrantfileなどの構築は省略します• 書籍やBlogで数多くあるため
仮想マシンを手に入れる流れ• 1.VagrantBoxを元にした仮想マシン起動– vagrant up• cookbook適用しないようVagrantfileへ記述– Chef-soloの準備を先にやらないと、途中で失敗する
仮想マシンを手に入れる流れ• 2.Chef-soloを利用するための準備– knife solo prepare[email protected] -P vagrant• これでcookbook適用の準備OK
仮想マシンを手に入れる流れ• 3.Chefのcookbook適用のため、再起動– vagrant reload• vagrant provision でchefのみ動作でもいいけれど、念のため• 4.仮想マシンのできあがり!
その他のコマンド• 仮想マシンの停止– vagrant halt• 仮想マシンが不要なら削除– vagrant destroy
というわけで
ある環境のおはなし• ビフォー
ある環境のおはなし• ビフォーアフター
ある環境のおはなし(再掲)• そのうちに...– あれ、どのVMが最新版だっけ...– そもそも何が入っているっけ...– 手順はどこだっけ...
ある環境のおはなし• そのうちに...– あれ、どのVMが最新版だっけ... 解決– そもそも何が入っているっけ... 解決– 手順はどこだっけ...• インストール・設定順はrecipeでOKだけど、どのrecipeを使っていたんだっけ...– 微妙な課題• そこら辺を自動化して履歴をとりたい
そこでJenkins project - http://jenkins-ci.org/
Jenkins (ジェンキンス)• CI (継続的インテグレーション)ツール• 一般的な環境ではプログラムのビルドやテストの自動化で使う• 某おひとりさま環境では、自動実行と 履歴の保管に使ったりする
Jenkins• 使ってみて良いと感じたところ– 仮想マシンの作成を自動化• 夜中に放置できる– コマンド実行の履歴が残る• あとで見返すことができる– Jenkinsのジョブを再度実行すれば、 何回でも同じ仮想マシンが手に入る
Jenkins• どんなふうに使ったか– Chef-solo, knife-solo, Vagrantの実行をPowerShellに記述し、Jenkinsで実行– そのために、いくつか準備• PowerShellのセキュリティポリシーを変更• JenkinsにPowershellプラグインを導入• Jenkinsの実行ユーザは自分のアカウント• 環境変数を設定– 「VBOX_USER_HOME」「VAGRANT_HOME」
PowerShellの内容• タイムスタンプ名のディレクトリを用意• Gitリポジトリから、clone・copy• Vagrantfile, chefのcookbook– 必要に応じてブランチ指定– 本当は、“knife solo cook”したい...• Chef-solo, knife-solo, Vagrantを実行• ジョブの終了をTwilioから電話連絡
PowerShellソース# タイムスタンプのフォルダ作成&移動$datetime = Get-Date -format yyyyMMddhhmmsscd d:\mkdir $datetimecd $datetime# ChefのGitリポジトリ(d:\chef-repo)のうち、該当するブランチをクローンgit clone -b nseg39 d:\chef-repo# VagrantのGitリポジトリからコピー# *基本的に変更がないので、最新のものをコピーをするという手抜きcopy d:\chef-vagrant\Vagrantfile .# VMの起動cmd /C "vagrant up"
PowerShellソース# Chefの準備cmd /C "knife solo prepare [email protected] -P vagrant"# VMの再起動とrecipeの実行cmd /C "vagrant reload"# 仮想環境構築が完了したため、シャットダウンcmd /C "vagrant halt"# 終わったので、Twilioにて連絡$webRequest = [System.Net.WebRequest]::Create($URL)$webRequest.ContentType = "text/html"$webRequest.ContentLength = 0$webRequest.Method = "POST"$response = $webRequest.GetResponse()
ご注意• やりすぎ感があったので、他の方法があれば、ぜひ教えてください!!
デモ• Jenkins + PowerShellで以下を実行– Ubuntuの仮想マシンを作成– UbuntuにApacheをインストール・起動– 仮想マシンは一度停止• VirtualBoxで仮想マシンを起動• ブラウザにて「It works」を確認
参考文献• naoyaさんの「入門Chef Solo」– http://tatsu-zine.com/books/chef-solo• Software Design 2012年10月号– http://gihyo.jp/magazine/SD/archive/2012/201210– 今なら総集編に含まれています• 自分のところ– http://d.hatena.ne.jp/thinkAmi/20130407/1365310673