読者です 読者をやめる 読者になる 読者になる

tkak's tech blog

This is my technological memo.

個人的#ChefConf2013まとめ。

f:id:keepkeptkept:20130429101710j:plain

最近日本でも何かと話題になっているconfiguration management toolのchefですが、やっぱり海外のほうがDevOpsが進んでますね。
今回のカンファレンスは、導入事例とかベストプラクティスな感じの話が多かったです。

個人的に面白かったセッションを5つ、ログとして残しておきます。

#ChefConf 2013

Scaling Configuration Management

つい最近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)

/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

VMWarevCloud Director用のknifeプラグインを作ったという話でした。
個人的にknifeのpluginよりも、中で使っているFogというMulti-Cloud Service Libraryが気になりました。
特にvmwareAPIrubyでたたけるので、まじですごいです。すんごい使えそうです。
ちなみに、vagrantのaws pluginもこのfog使ってます。

Fog - Multi-Cloud Service Library
fog - The Ruby cloud services library

opscode/knife-vcloud · GitHub

rlane/rbvmomi · GitHub


The Berkshelf Way

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のほうが早い。