Your SlideShare is downloading. ×
開発エンジニアがChefで テスト駆動サーバー設定してみた #biglobetechtalk
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

開発エンジニアがChefで テスト駆動サーバー設定してみた #biglobetechtalk

2,444
views

Published on

第1回 BIGLOBE Tech Talk 「初めての Chef」

第1回 BIGLOBE Tech Talk 「初めての Chef」

Published in: Technology

0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,444
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
14
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 開発エンジニアがChefでテスト駆動サーバー設定してみたシステムサイエンス研究所 : 西村 友裕13年6月15日土曜日
  • 2. 自己紹介(@tomNishimura)• ㈱システムサイエンス研究所 という独立系の開発会社の 8年目• 春からNECビッグローブさんのお世話に• 普段は組み込みアプリケーション(昔ITRON等、現在Android中心)をやっている事が多い• Webのフロントエンドも去年くらいから少々13年6月15日土曜日
  • 3. 開発エンジニアとしてChefを使う理由•アジャイル開発を行う上で必要な開発環境をクラウド上に自分たちで構築している•これからそういう環境をどんどん建てたいので自動化したい13年6月15日土曜日
  • 4. 今日お話する内容1. なぜChefのレシピをTDDで書くのか?2. どんなツールを使うか3. TDDでレシピを作ろう13年6月15日土曜日
  • 5. 1. なぜChefのレシピをTDDで書くのか?•Chefのレシピを(自動)テストする理由•TDDでやる理由13年6月15日土曜日
  • 6. Chefのレシピを(自動)テストする理由• レシピが想定通りに動くことを確認したい• 環境が想定通りに設定されていることを確認したい• 将来の変更時にもともと書いていた部分が正しく動くことを確認できるように自動テストを整備したい13年6月15日土曜日
  • 7. TDDでやる理由• 最初にテストを書くことで、Chefでやりたい設定内容を具体的に記述する事が出来るため• 正直「出来るっぽいからやろう」とカッとなってやった• 良い設計を促す効果は……あんまりないかも?• 出来るのはChefのレシピで定義された手続きの実行結果に対するテストなので、書き方への拘束力がない13年6月15日土曜日
  • 8. 2.どんなツールを使うか•今回実際にやってみること•使用するツールの紹介13年6月15日土曜日
  • 9. 今回実際にやってみることChefのcookbookを、TDDで作成する具体的な手順を紹介する※cookbook= 特定のパッケージのインストール・設定手順くらいの粒度の設定手続きを定義したもの13年6月15日土曜日
  • 10. 検証に用いるツール•serverspec (0.6.0) : サーバーのテストに用いる、Rspecベースのツール•foodcritic (2.1.0) : cookbookの書き方の良し悪しをチェックしてくれるlintツール13年6月15日土曜日
  • 11. 便利なツール•Berkshelf (2.0.3) : cookbookの管理に使えるツール•今回はcookbookのひな形生成に使用•Vagrant (1.2.2) : 仮想のサーバー環境をコマンドで簡単に用意できるツールで、Chefのテスト環境の管理に便利13年6月15日土曜日
  • 12. 注•今回はワークフローの紹介を主に行うので、ツールの導入や設定方法はやりません。•月単位や週単位で使い方が変わったりするので、やろうと思った時に改めてググってください。13年6月15日土曜日
  • 13. 3.レシピをTDDで書くよ!• cookbookの初期設定• cookbookのテスト作成し、失敗を確認• 設定内容を手動確認し、テストを成功させる• 設定内容をcookbook / レシピに記述して実行し、テストを成功させる• foodcriticで書き方をチェックして修正し、再度テストを成功させる13年6月15日土曜日
  • 14. 作成するcookbookの内容• 名前は hello-cookbook• apache2をインストールする• DocumentRootにhello.txtというファイルを配置する• 内容は Hello, Chef• 対応OSはcentos6.3以上13年6月15日土曜日
  • 15. cookbookの初期設定•berkshelfでひな形生成•cookbookのmetadataを書こう13年6月15日土曜日
  • 16. cookbookのひな形生成$ berks cookbook hello-cookbook•./hello-cookbookディレクトリ配下にcookbookで必要になるファイルがひと通り生成される•Vagrantの設定も自動生成される13年6月15日土曜日
  • 17. 生成したVagrantの設定内容(hello-cookbook/Vagrantfile)$ vagrant upというコマンドの実行で、• 仮想マシン立ち上げて• chef-soloでレシピを実行しますよという内容になっている。# -*- mode: ruby -*-# vi: set ft=ruby :Vagrant.configure("2") do ¦config¦config.vm.hostname = "hello-cookbook-berkshelf"config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal"<省略 (Vagrantで立てる仮想マシンの内容)>config.vm.provision :chef_solo do ¦chef¦<省略 (サーバーのログイン設定等)>chef.run_list = ["recipe[hello-cookbook::default]"]endend レシピ実行しますよ部分13年6月15日土曜日
  • 18. cookbookのmetadataを書こう•metadataに書くべき内容•maintainer, license, versionなどの基本的なレシピの説明•依存するcookbook•サポートするOS13年6月15日土曜日
  • 19. metadataに追記(hello-cookbook/metadata.rb)•サポートするOSを追記+ %w{ centos >= 6.3 }.each do ¦os¦+ supports os+ end13年6月15日土曜日
  • 20. 3.レシピをTDDで書くよ!cookbookの初期設定• cookbookのテスト作成し、失敗を確認• 設定内容を手動確認し、テストを成功させる• 設定内容をcookbook / レシピに記述して実行し、テストを成功させる• foodcriticで書き方をチェックして修正し、再度テストを成功させる13年6月15日土曜日
  • 21. 設定内容を手動確認しつつテストを作成する• まずは手動で設定内容を確認する• 普段はwebのインターフェースから設定してるのでコマンドラインからはどうやったらいいのか分からない、等の理由で、まず具体的な設定手順を調査・検討しなければならない場合も多い• 確認しつつ、テストを作成する13年6月15日土曜日
  • 22. 作成するcookbookの内容(おさらい)•apache2をインストールする•DocumentRootにhello.txtというファイルを配置•内容は Hello, Chef13年6月15日土曜日
  • 23. 手動で設定確認するための環境の準備$ vagrant up• 仮想マシンが立ち上がり、Chef Soloによる設定処理が実行される• 今はまだレシピに何も書いてないので、Chefは実行自体はされるが何も設定しない• Vagrantfileが存在するディレクトリで行うこと(今回はhello-cookbook配下)$ vagrant sshVagrantfileで定義された仮想サーバーにsshで入ることが出来る13年6月15日土曜日
  • 24. 手動で設定確認$ sudo yum install httpd:Is this ok [y/N]: y<Enter>:$ sudo chkconfig httpd on$ sudo service httpd start$ echo Hello, Chef > hello.txt$ sudo mv hello.txt /var/www/html/13年6月15日土曜日
  • 25. テストのひな形生成$ serverspec-initSelect a backend type:1) SSH2) Exec (local)Select number: 1<Enter>Vagrant instance y/n: y<Enter>Input vagrant instance name: hello-cookbook-berkshelf<Enter>+ spec/hello-cookbook-berkshelf/+ spec/hello-cookbook-berkshelf/httpd_spec.rb任意13年6月15日土曜日
  • 26. テストのひな形生成• serverspec-initコマンドによって• テスト実行のためのRakefileが作成される• サンプルとして以下のテストが作成される。• spec/<host名>/httpd_spec.rb• 今回はこのhttpd_spec.rbを編集して使う13年6月15日土曜日
  • 27. テストの記述(httpd_spec.rb)require spec_helperdescribe package(httpd) doit { should be_installed }enddescribe service(httpd) doit { should be_enabled }it { should be_running }enddescribe port(80) doit { should be_listening }enddescribe file(/var/www/html/hello.txt) doit { should be_file }it { should contain Hello, Chef }endテストの初期処理の呼び出し13年6月15日土曜日
  • 28. テストの記述(httpd_spec.rb)require spec_helperdescribe package(httpd) doit { should be_installed }enddescribe service(httpd) doit { should be_enabled }it { should be_running }enddescribe port(80) doit { should be_listening }enddescribe file(/var/www/html/hello.txt) doit { should be_file }it { should contain Hello, Chef }endapache2のパッケージがインストールされているかのテスト (1件目)13年6月15日土曜日
  • 29. テストの記述(httpd_spec.rb)require spec_helperdescribe package(httpd) doit { should be_installed }enddescribe service(httpd) doit { should be_enabled }it { should be_running }enddescribe port(80) doit { should be_listening }enddescribe file(/var/www/html/hello.txt) doit { should be_file }it { should contain Hello, Chef }endサービスの自動起動が設定されていて、実行中であるかのテスト(2-3件目)13年6月15日土曜日
  • 30. テストの記述(httpd_spec.rb)require spec_helperdescribe package(httpd) doit { should be_installed }enddescribe service(httpd) doit { should be_enabled }it { should be_running }enddescribe port(80) doit { should be_listening }enddescribe file(/var/www/html/hello.txt) doit { should be_file }it { should contain Hello, Chef }end80番が開いてるかのテスト(4件目)13年6月15日土曜日
  • 31. テストの記述(httpd_spec.rb)require spec_helperdescribe package(httpd) doit { should be_installed }enddescribe service(httpd) doit { should be_enabled }it { should be_running }enddescribe port(80) doit { should be_listening }enddescribe file(/var/www/html/hello.txt) doit { should be_file }it { should contain Hello, Chef }endtxtが配置されていて、内容が想定したものかのテスト(5-6件目)13年6月15日土曜日
  • 32. 一旦環境をまっさらに戻す$ vagrant destroyAre you sure you want to destroythe default VM? [y/N] y<Enter>• 仮想マシンのデータが削除される13年6月15日土曜日
  • 33. まっさらにした環境に対しテストを行う• 設定前の環境で失敗することを確認$ vagrant up$ rake spec:Finished in *.* seconds6 examples, 6 failures:13年6月15日土曜日
  • 34. 手動で設定した環境にテストを行う• 先ほど確認した設定内容を手動で実施• 再度テストを実施し、成功を確認する。• 終わったらまた一旦仮想マシンのデータを破棄する。$ rake spec:Finished in *.* seconds6 examples, 0 failures$ vagrant destroy13年6月15日土曜日
  • 35. 3.レシピをTDDで書くよ!cookbookの初期設定cookbookのテスト作成し、失敗を確認設定内容を手動確認し、テストを成功させる• 設定内容をcookbook / レシピに記述して実行し、テストを成功させる• foodcriticで書き方をチェックして修正し、再度テストを成功させる13年6月15日土曜日
  • 36. レシピの記述(hello-cookbook/recipes/default.rb)• apache2をインストールし、サービス有効にして立ち上げたいぞ、という内容を記述+ package "httpd" do+ action :install+ end+ service "httpd" do+ supports :status => true, :restart => true, :reload => true+ action [ :enable, :start ]+ end13年6月15日土曜日
  • 37. 試しにこの時点でcookbookを適用してテスト$ vagrant up$ rake spec:Finished in *.* seconds6 examples, 2 failuresFailed examples:rspec ./spec/hello-cookbook-berkshelf/httpd_spec.rb:17 # File "/var/www/html/hello.txt"rspec ./spec/hello-cookbook-berkshelf/httpd_spec.rb:18 # File "/var/www/html/hello.txt"apache2の設定関係の4件が成功テキスト置いて云々のテストは失敗13年6月15日土曜日
  • 38. ( ) 。o(変更したレシピを試す時、いちいちvagrant destroyするのめんどい……)• このコマンドで、立ち上がっている仮想マシンはそのままで、chefの実行だけを再度行うことが出来る• Vagrantfileでprovison(設定処理)として定義されているchefの処理が実行される、という感じ• ただ「2回実行するとなんか動くんすけどねー」みたいな不可思議なレシピが誕生することも無くはないので、節目節目でdestroy -> upして確認するのが良いと思われる$ vagrant provision13年6月15日土曜日
  • 39. ファイルの配置処理をcookbookに定義• hello-cookbook/files/default/hello.txt を作成• 内容は Hello, Chef• レシピに以下を追記 (ファイルの配置処理)+ cookbook_file "/var/www/html/hello.txt" do+ mode 00644+ end13年6月15日土曜日
  • 40. cookbookの適用後にテストを行い、成功を確認$ vagrant provision$ rake spec:Finished in *.* seconds6 examples, 0 failures13年6月15日土曜日
  • 41. 3.レシピをTDDで書くよ!cookbookの初期設定cookbookのテスト作成し、失敗を確認設定内容を手動確認し、テストを成功させる設定内容をcookbook / レシピに記述して実行し、テストを成功させる• foodcriticで書き方をチェックして修正し、再度テストを成功させる13年6月15日土曜日
  • 42. foodcriticで書き方をチェックする$ foodcritic hello-cookbookFC008: Generated cookbookmetadata needs updating: hello-cookbook/metadata.rb:313年6月15日土曜日
  • 43. 指摘された内容•hello-cookbook/metadata.rb:3 の内容•maintainer_email YOUR_EMAIL•「metadataちゃんと書けよ!自動生成された内容のままになってるじゃないか!例えばこの maintainer_emailのところとか!」と怒られています13年6月15日土曜日
  • 44. foodcriticの指摘に対応•hello-cookbook/metadata.rb- maintainer YOUR_NAME- maintainer_email YOUR_EMAIL+ maintainer Tomohiro Nishimura+ maintainer_email <ちゃんとしたメールアドレス>13年6月15日土曜日
  • 45. foodcriticに怒られなくなったことを確認$ foodcritic hello-cookbook(問題なければ出力なし)13年6月15日土曜日
  • 46. 変更したので、再度テストして成功を確認$ vagrant provision$ rake spec:Finished in *.* seconds6 examples, 0 failures※今回はmetadataの修正だけだったので、これで動かなくなることは多分あんまりないです。13年6月15日土曜日
  • 47. レシピをTDDで書けたね!(多分)cookbookの初期設定cookbookのテスト作成し、失敗を確認設定内容を手動確認し、テストを成功させる設定内容をcookbook / レシピに記述して実行し、テストを成功させるfoodcriticで書き方をチェックして修正し、再度テストを成功させる13年6月15日土曜日
  • 48. まとめ13年6月15日土曜日
  • 49. 自動テストをきちんと書きましょう•設計を意識することができます•レシピを変更した時に、振る舞いが変わっていない事をすぐに再確認出来ます13年6月15日土曜日
  • 50. 付録:Chefのテストについての今回扱わなかったトピック• レシピの継続的インテグレーション : JenkinsやTravisCI等を使って出来る• gitリポジトリからcookbookを持ってきて、仮想サーバーにchefを実行した後にテストをする、という内容のタスクを定期的に実行する• マルチプラットフォーム(OS違い、バージョン違い等)でのテスト : test-kitchenを使うと、複数環境でのChefの実行とテストが並行して出来る• Nodeのテスト:本番環境もテストしよう13年6月15日土曜日
  • 51. 質問タイム?13年6月15日土曜日
  • 52. ご清聴ありがとうございました13年6月15日土曜日