個人的#ChefConf2013まとめ。
最近日本でも何かと話題になっているconfiguration management toolのchefですが、やっぱり海外のほうがDevOpsが進んでますね。
今回のカンファレンスは、導入事例とかベストプラクティスな感じの話が多かったです。
個人的に面白かったセッションを5つ、ログとして残しておきます。
Scaling Configuration Management
- phil Dibowitz -- facebook
- slide --> Scaling Configuration Management
- youtube --> ChefConf Keynote Session - Phil Dibowitz - YouTube
つい最近facebookでPrivate Chefを導入したとかニュースになってましたが、
初日のメインセッションでfacebookのchef導入事例の話をしてました。
facebookのサーバ管理メンバーが、目指すところは以下な感じです。規模感がすごいですね。
- 4 people
- Tens of thousands of heterogeneous systems
- Service owners own/adjust relevant settings
主にscalabilityなchefをどうやって実装するかについて話してました。
■node.save()問題
facebookでは15分ごとにconvergenceを実行してChef Serverにnode情報を送っているらしいんですが、15,000台ものnodeを管理するとなると、その通信データ量は馬鹿にならないみたいです。
そこで、
- 簡単にできる解決方法としてはohaiのpluginを無効にする方法があるが、ohaiのdataは欲しい。
- ただし、chef serverにnode情報はなくてもいい。
- つまり、node.save()機能を使うけど、サーバに送信しなければおk
ということで、
解決方法 = whitelist_node_attrs
opscode-cookbooks/whitelist-node-attrs · GitHub
このcookbookを使って、node.save()機能の送信するデータを制限して、結果的にサーバに送信するデータを1kb以下になるようにしたらしいです。
■method_missing問題
nodeのメソッドを使おうとしてそのメソッドの定義がない場合、
Chefは勝手にアトリビュートを作ってそこにハッシュ値を入れてしまうようです。
node.foo('bar')
- Ruby: "If there a method foo()?"
- Chef: "If not, is there an attribute foo?", "If not, create; assign bar"
- OK for...
node['foo'] = 'bar' node.foo = bar
- But imagine
node.has_key('foo') # want has_key?()
そこで、以下のようなメソッドを作ったみたいです。
class Chef::Node def method_missing(method, *args) Chef::Log.warn(“FB Chef Tweak: Not assuming missing method is an attr!”) Object.send(:method_missing, method, args) end end
■sysctlのcookbook
facebookで使っているsysctlのcookbookの例を紹介してました。
- fb_sysctl/attributes/default.rbにすべてのdefaultのパラメータを定義
- fb_sysctl/recipes/default.rbに、templateリソースを定義
- fb_sysctl/templates/default/sysctl.erbは、3行
# Generated by Chef, do not edit directly! <% node['fb']['fb_sysctl'].keys.sort.each do |key| %> <%= key %> = <%= node['fb']['fb_sysctl'][key] %> <% end %>
そのcookbookをさらにDBサーバのcookbookを作って、database/recipes/default.rbの中でattributeをオーバーライドして使うそうです。
node.default['fb']['fb_sysctl']['kernel.shmmax'] = 19541180416 node.default['fb']['fb_sysctl']['kernel.shmall'] = 5432001
■Open Source Chef (OSC)と Opscode Private Chef (OPC)の性能比較
OSCよりもOPCのほうが性能いいらしいです。
詳細は、スライドにグラフとか掲載しているのでそっちを参考にしてください。
OSCのほうは、カスタマイズして使っていて、scaleのために、Chef Serverのsearchとdatabags機能を使ってないらしいです。
Client監視用に取得する情報
- Last exception seen
- success/failure of run
- number of resources
- time to run
- time since last run
- other system info
Server sideの監視
- stats(postgres, authz[OPC], etc)
- Errors(nginx, erchef, etc)
- more...
server side の監視のためのutilsをgithubに公開してます。
facebook/chef-utils · GitHub
Cookbook refactoring & abstracting logic to Ruby(gems)
- Seth Vargo -- Opscode
- slide --> Cookbook Refactoring and Extracting Logic into Rubygems // Speaker Deck
/etc/hostsを設定するcookbookを例に、リファクタリングの話をしていました。
最初は一般的な、attributes, recipes, templatesの構成ですが、どんどんリファクタリングをしていって、最終的にはcookbookをgemにするところまでやっててすんごいなぁと思いました。そこまでする必要があるかどうかは、賛否が分かれるところです。
1. attributes, recipes and templates
2. attributes -> data bags
2. Provider and Resources for simple
3. Libraries for speed and test
4. pure ruby (gem) for multi-environment
最終的なhostsfile cookbookは、githubに公開しています。
customink-webops/hostsfile · GitHub
Writing a Knife Plugin for your shiny new VMWarevCloud Director
- Chirag Jog -- Chief Technology Officer at Clogeny
- slide --> ChefConf 2013 Talk: Writing a Knife cloud plugin for your shiny VMW...
VMWarevCloud Director用のknifeプラグインを作ったという話でした。
個人的にknifeのpluginよりも、中で使っているFogというMulti-Cloud Service Libraryが気になりました。
特にvmwareのAPIをrubyでたたけるので、まじですごいです。すんごい使えそうです。
ちなみに、vagrantのaws pluginもこのfog使ってます。
Fog - Multi-Cloud Service Library
fog - The Ruby cloud services library
The Berkshelf Way
- Jamie Winsor -- Software Engineer at Riot Games
- slide --> Berkshelf
- youtube --> ChefConf Evening Keynote Session - Jamie Winsor - YouTube
Berkshelf作った人が、berkshelfの話をしてくれました。
プレゼンテーションの仕方がうまくて面白くて、楽しんで聞けました。
■berkshelfの名前の由来
もともとは、bookshelfにしようと思ったけど、googleで検索しても他のものが検索されるので、berkshelfにしたらしいです。berkはアメリカで有名なネタ画像をもとにしたらしいです。
■berkshelfを使ったcookbookの使い方
roleは使わないで、cookbookをラップするcookbookを作ってroleの代わりにする使い方がいいらしいです。
roleは、バージョン管理できないし、パッケージとして配布できないし、namespaceが厳密ではないし、組織レベルのデータしか扱えないから。
■testについて
testはvagrantを使って、berkshelfのvagrant pluginがあるので、それを使ってテストしてるそうです。
How A Mouse Became a Chef - Disney
- Chris Putonen -- Senior Manager, System Engineering at The Walt Disney Co.
- Brian Scott -- Staff Systems Engineer at The Walt Disney Company
- Steven Wagner -- Staff Systems Engineer at The Walt Disney Company
Disneyのchef導入事例の話です。
導入するときの話から、かなり具体的なcookbookの書き方やテストについてまで、とてもためになりました。
- トップダウンでchefを導入していった。
- Devsのアジャイルが進んでいって、Opsもそれについていかなくてはならない
- Picking a tool + Changing our culture
- start small and simple, lean start approach
- pluginも自分たちで作っている。例、knife-servicedesk, ohai network_location
- f5とNexusなどネットワーク機器もchefで管理
- ChefのTest環境、Remy、Test as a Serviceを提供しようとしている。
- ChefのTest環境は、jenkinsとvagrantとopnstackを使ってる。virtual boxよりもopnstackのほうが早い。