Your SlideShare is downloading. ×
0
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
ChefとPuppetの比較
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

ChefとPuppetの比較

18,807

Published on

Published in: Technology
0 Comments
50 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
18,807
On Slideshare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
120
Comments
0
Likes
50
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とPuppetの比較 ~Puppetユーザから見たChef~(仮) クックパッド株式会社 菅原 元気
  • 2. 自己紹介 菅原 元気 (@sgwr_dts / id:winebarrel) 白金台のほうから来ました ● クックパッド株式会社勤務 ● インフラエンジニア ● Ruby・AWS関連ツールを公開しています ○ https://bitbucket.org/winebarrel/ ○ https://github.com/winebarrel/
  • 3. 本日の趣旨 Chefをディスりに来ました
  • 4. 本日の趣旨      *      *   *     +  うそです      n ∧_∧ n  + (ヨ(* ´∀`)E)       Y     Y    *
  • 5. 『Puppetの優れている部分を話せ(意訳)』 といわれて横浜まで来ました 本日の趣旨 吉田 真吾 14:49 ... Puppetのほうがこんなに便利だ、という趣旨でお話できることなどはございま せんでしょうか?(中略)Puppetでないとできない(より便利な)ことも多いのではな いかと思っているのですが。
  • 6. 本日の趣旨 プレゼンをきいてPuppetに 乗り換える方はいないと思いますが… ● Puppetにも良い機能があるので、要望・機能拡 張でChefの改善にもつながるかな ● これからPuppet or Chefを選択する人は、選参 考になるかな …という感じです
  • 7. 弊社とPuppetのおつきあい 2009年 一部サーバにPuppetを導入 大嫌いでした ● 適用時にエラーがいっぱい ● リソース競合の解消がめんどくさい ● サーバとの認証でエラーがでる ● 外部DSLがわかりにくい etc.
  • 8. 弊社とPuppetのおつきあい 2010年 AWSの検証開始 とりあえずpuppetを選択
  • 9. 弊社とPuppetのおつきあい 2011年 AWSに移行 現在とおおむね同じPuppetの構成 ● ENCは未使用(ノードの更新は手動) ● manifestの書き方がめちゃくちゃ (スタイルガイドがなかった?)
  • 10. 弊社とPuppetのおつきあい 2011年 Puppetに嫌気が差していたので Chefに移行しようとしていた …が、諸事情により断念
  • 11. 弊社とPuppetのおつきあい 2012年 VPCに移行 Puppetまわりも刷新 ● ENCの導入 ● スタイルガイドに従ってリファクタリング ● 各種プラクティスに従って設計を変更 (継承廃止!)
  • 12. 現在のサーバ構成 ● クライアントサーバ構成 ● サーバ台数は500〜600台 ● 基本的にすべてpuppetで管理
  • 13. クライアント側の機能の比較
  • 14. クライアント側の機能の比較 ディレクトリ構成 Puppet(クックパッドの場合) ├── lib ├── manifests ├── modules │ ├── apache │ │ ├── files │ │ ├── manifests │ │ └── templates │ ├── nginx │ ├── roles │ ├── app_server │ │ ├── files │ │ ├── manifests │ │ └── templates │ ├── db_server │ │ ├── manifests │ │ └── templates │ └── types Chef ├── cookbooks │ ├── apache │ │ ├── attributes │ │ ├── definitions │ │ ├── files │ │ ├── libraries │ │ ├── providers │ │ ├── recipes │ │ ├── resources │ │ └── templates │ └── nginx │ ├── attributes │ ├── definitions │ ├── files │ ├── libraries │ ├── providers │ ├── recipes │ ├── resources │ └── templates ├── data_bags ├── nodes │ ├── app-001.json │ └── db-001.json ├── roles │ ├── app.json │ └── db.json ├── site-cookbooks └── solo.rb
  • 15. クライアント側の機能の比較 ディレクトリ構成 ● PuppetにChefのような 決められたディレクトリ構成はない ● ベストプラクティスを追求すると 似たような構成になると思います
  • 16. クライアント側の機能の比較 モジュール(クックブック)とロール Puppet # manifest class nginx { package { 'nginx': ensure => '1.2.2.1', } service { 'nginx': ensure => running, enable => true, require => Package['nginx'], } file { '/etc/nginx/enginx.conf': ensure => present, source => template('...'), owner => 'root, ... notify => Service['nginx'], } } # role class app { include nginx file { '/etc/hosts': ... } } Chef # recipe package 'nginx' do action :install version '1.2.2.1' end service 'nginx' do action { :enable, :start } end template '/etc/nginx/nginx.conf' do source 'nginx.conf.erb' owner 'root' mode 0644 notifies :reload , 'service[nginx]' end  # role: app.json { "run_list": [ "role[nginx]" ] }
  • 17. クライアント側の機能の比較 モジュール(クックブック)とロール Puppet # カスタムタイプ define sysctl($value) { exec { "exec_sysctl_$name": command => "sysctl -w $name=$value}", unless => "sysctl -n ${name} | fgrep -q $value", path => '/bin:/sbin:/usr/sbin:/usr/bin', } # ... sysctl { 'kernel.domainname': value => 'example.com', } Chef # カスタムリソース define :sysctl do bash "exec-sysctl-#{params[:name]}" do code <<-EOS sysctl -w #{params[:name]=#{params[:value]} EOS not_if <<-EOS sysctl -n ${params[:name]} | fgrep -q #{params[:value]} EOS end end # ... sysctl 'kernel.domainname' do value 'example.com' end
  • 18. クライアント側の機能の比較 モジュール(クックブック)とロール ● 基本的にはほとんど同じだと思います ○ 見えない人は3回瞬きしてください ● ChefのRuby DSLはうらやましいです ○ PuppetのRuby DSLはお亡くなりになります ○ 既存のDSLを拡張するようですが(何故…) ● ビルドインのリソースは Chefのほうが充実しているかも
  • 19. クライアント側の機能の比較 モジュール(クックブック)とロール ● Puppetのロールの実態はモジュールです ○ 単にモジュールをまとめるモジュールというだけ ● ロールにリソースを定義できるので、Chefよりも やや柔軟かも
  • 20. クライアント側の機能の比較 モジュール(クックブック)とロール ● ohaiの代わりにfacterというツールで システム情報を収集します
  • 21. クライアント側の機能の比較 モジュール(クックブック)とロール ● Puppetはリソース毎に依存性を定義します ○ 未定義の場合順番はランダム ○ 上から順に適用して欲しいこともあります… ● Chefは記述順に適用 ○ リソース毎に依存性を定義できるのかは、 分かりませんでした(あったら教えてください)
  • 22. クライアント側の機能の比較 Puppet独自の機能 Ruby DSLが使えないのは大変残念ですが いくつかPuppet独自の機能があります (便利かどうかはさておき)
  • 23. クライアント側の機能の比較 継承 Puppet Style Guide "Inheritance should be avoided." class freebsd inherits unix { File['/etc/passwd'] { group => 'wheel' } File['/etc/shadow'] { group => 'wheel' } }
  • 24. クライアント側の機能の比較 継承 ● 一言でいえば「使うな」 二言で言えば「死んでも使うな」 ● 使って良いことはありません ○ リソース競合の解決が難しくなります ○ 仮想リソースという解決策もありますが… ■ http://gihyo.jp/admin/serial/01/puppet/0013
  • 25. クライアント側の機能の比較 Parameterised Classes ● モジュールをテンプレートとして使えます ● Chefだとロールに属性を定義して クックブックに渡す感じでしょうか? # module class apache($version) { ... class contents ... } # role class webserver { class { 'apache': version => '1.3.13' } }
  • 26. クライアント側の機能の比較 Run Stage ● 適用順を制御できます ● Chefで必要になる機能ではないですね… stage { 'first': before => Stage['main'] } stage { 'last': require => Stage['main'] } class { 'apt-keys': stage => first; 'sendmail': stage => main; 'apache': stage => last; }
  • 27. クライアント側の機能の比較 Function server-idを設定する関数 module Puppet::Parser::Functions newfunction(:mysql_server_id, :type => :rvalue) do |args| ip_addr = lookupvar('ipaddress') ip_addr = IPAddr.new(ip_addr) # IPアドレスは下位 16ビットを整数値として使う ip_addr = (ip_addr.to_i & 0xFFFF) server_id = '%02d%03d%05d' % [ 0, # 0〜41の連番 392, # 国コード(http://ja.wikipedia.org/wiki/ISO_3166-1_numeric) ip_addr, ] # 先頭の0は削除 server_id.sub!(/A0+/, '') return server_id end end # my.cnf.elb ... server-id = <%= scope.function_mysql_server_id %> ...
  • 28. クライアント側の機能の比較 Function ● 共通で使う関数を定義できます ○ マニフェスト・テンプレート、どこでも使えます ● シンタックスは例に漏れずダサいです ● Chefはグローバル関数の定義場所が よく分からなかったです…
  • 29. クライアント側の機能の比較 まとめ ● Puppetは「Ruby DSLを使えないのがイけてな い」に尽きると思います ● とはいえ似たような感じです ● Puppet独自の機能がありますが、だからといっ てPuppetに優位性があるかは微妙です ● ある程度の機能差はそのうち埋まる気がします
  • 30. クライアント側の機能の比較 たぶん両方で使えるTips ● モジュール(クックブック)は細かく分けましょう ● ミドルウェアのバージョンは極力書きましょう ● ミドルウェアのメジャーバージョンはモジュール を分けましょう ● 設定ファイルの抽象化はロール単位でやるとよ いです
  • 31. クライアント側の機能の比較 たぶん両方で使えるTips ● まめに適用しないと腐ります ● オンラインで適用できるようにしておくと腐敗を 防げます ○ restart等を避けるなど ● Puppet configuration PatternsはChefでも参 考になると思います ● Chef/Puppetよりさらに前の処理を行うツールを 作っておくといろいろ捗ります
  • 32. 運用の機能の比較
  • 33. 運用の機能の比較 chef-solo ● puppet-applyというコマンドで同じようなことが できます ● マニフェスト(レシピ)単位で指定するのでちょっ と感じが違うかも $ puppet apply -l /tmp/manifest.log manifest.pp $ puppet apply --modulepath=/root/dev/modules -e "include ntpd::server" $ puppet apply --catalog catalog.json
  • 34. 運用の機能の比較 knife ● knifeの代わりとしてcapistoranoでサーバへの 登録(というかデプロイ)を行います ● Puppetのサーバはファイル管理なので、デプロ イの実装は簡単です
  • 35. 運用の機能の比較 knife-solo ● 同様の機能はPuppetにはありません… ● 手元のちょっとした修正を適用できるのが良さ そうですね ○ knife-solo: レシピ修正→適用テスト→git push ○ puppet(C/S): レシピ修正→git push→適用テスト
  • 36. 運用の機能の比較 chef-server Puppetのキラー機能 その① puppet-master (サーバ) ● 情報をファイルで管理 ● ファイルをサーバにただ置くだけ ● 変更はサーバが自動検知 ● gitでそのままファイルを 管理・デプロイできる!
  • 37. chef-server gitで設定を管理すると… ● 特別なツールがいらない ● 他のツールと組み合わせやすい ● GitHubと組み合わせて レビュー・pull reqできる! 運用の機能の比較
  • 38. 運用の機能の比較 chef-server chef-server ● 情報をDBで管理 ● 変更はknife経由だけ? ● バージョン管理はできるようですが… ○ diffとかとれるんでしょうか? ● gitとの組み合わせ事例も一応ありますね
  • 39. 運用の機能の比較 ノード管理 Puppetのキラー機能 その② ENC(External Node Classifiers) ● ノード情報を動的に定義 ● 変数(Chefの属性)も動的に定義 ● EC2のAPIを使うことで ノード管理をAWSに委譲できる!
  • 40. 運用の機能の比較 ノード管理 Chefの場合… ● 動的なノード定義の情報を探したのですが見つ からず… ● EC2でサーバが増減する場合、どのように管理 しているのでしょうか?(cronで定期的に更 新?)
  • 41. 運用の機能の比較 chef-server+gitとENCについて Opscodeが本気になれば、すぐに実装される気が します。ただ、chef-serverは総合的なサーバ管理 ツールを目指しているように見受けられるので、ポ リシー的にすぐに実装はされないかなーと
  • 42. 運用の機能の比較 chef-server+gitとENCについて knife-soloで運用するのも手ですが、すべての情 報がrsyncで転送されるのが気になります… (サーバ100台に適用、とか困りそうです)
  • 43. 運用の機能の比較 どなたかgitの使えるの 軽量chef-serverを 作るとよいと思います
  • 44. 運用の機能の比較 その他 ● 「dry-runできないんだ、やーい」と思ってたら、 とっくに実装されてました… ● PuppetにもWeb UIはありますが、あんまり使っ たことはないです ● Puppetでもそうなんですが、クライアントをデー モン化してる方はいるんでしょうか?ものすごく 怖いのですが…
  • 45. おまけ
  • 46. おまけ さくっと実装できそうだったので chef-solo-encというのをつくりました chef-soloでENC的な機能を実現します
  • 47. おまけ DEMO

×