What is chef

  • 17,874 views
Uploaded on

OpscodeのChefとは何なのかを中級者以上向けに説明します。 …

OpscodeのChefとは何なのかを中級者以上向けに説明します。
普通のHow to とは方向性が違うので注意。

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
17,874
On Slideshare
0
From Embeds
0
Number of Embeds
7

Actions

Shares
Downloads
99
Comments
0
Likes
85

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. What is Chef? Infrastructure management framework ※中身は日本語です。Monday, March 4, 13
  • 2. Information • OpscodeのChefとは何なのかを中級者 以上向けに説明します http://www.opscode.com/chef/ • Author Yukihiko Sawanobori HiganWorks LLC(Japan)Monday, March 4, 13
  • 3. Index 1. Introduction 2. Inventory 3. Convergence 4. Resource Correction 5. Configration Management (Automaticaly/Configration first)Monday, March 4, 13
  • 4. 1.IntroductionMonday, March 4, 13
  • 5. Q. Chefってサーバの 自動セットアップツール ですよね?Monday, March 4, 13
  • 6. A. 違います。 環境のメタデータを管理し、 ノードの役割を収束させる OPSのフレームワークです。 ※別にただの自動ビルドツールとして扱っても構いませんMonday, March 4, 13
  • 7. Q. DevOpsってよく言うし DeveloperとOperaterが 仲良く作ったのかな?Monday, March 4, 13
  • 8. A. どちらかというと OPSの怒りが集積された ツールだと思います ※DevOpsの本質は特定のツールと関係ありません ※OhaiとChef::Providersのソースからは特に怨念を感じますMonday, March 4, 13
  • 9. Chef認識正誤集1 ✕ レシピで華麗にサーバを自動設定 ⃝ 泥臭いプラットフォーム判別と、地べ たを いずるようなリソース判定を元に 矯正を施します ✕ ChefServerはあまり必要ない ⃝ ChefServerのインベントリこそ全てMonday, March 4, 13
  • 10. Chef認識正誤集2 ✕ Cookbookにミドルウェアのサーバ別固有情報も書く ⃝ Role/NodeのOverride AttributeやChefServerへのク エリを使い、Cookbookは汎用的に書くべきです ✕ サーバ設定の変更をしたら別で作っているシステムの 構成管理台帳を更新する ⃝ サーバへの直接ログインを含め、ChefServer上の構 成管理だけで終わらせるのが理想です。Monday, March 4, 13
  • 11. 2.InbentoryMonday, March 4, 13
  • 12. まずはインベントリ収集から • Chef-Client(Chef-solo)が稼働するには 実行されたプラットホームの判別が最 も重要です。 • Chefのマルチプラットフォーム性を支 えるためには高度なインベントリの収 集力が必要!Monday, March 4, 13
  • 13. そこでOhaiです • Ohai (https://github.com/opscode/ohai) • quot: Ohai detects data about your operating system. • 参考資料:Chefの心臓、Ohaiのアトリビュ ート(以下略) http://qiita.com/items/ 5ce72101f8dee906ccb4 • OS/ディストリビューションをはじめ、動作 環境を泥臭く判別Monday, March 4, 13
  • 14. Ohaiのソース抜粋、 プラットフォーム判別の一部 #  platform  [  and  platform_version  ?  ]  should  be  lower  case  to  avoid  dealing  with  RedHat/Redhat/redhat  matching   if  File.exists?("/etc/oracle-­‐release")    contents  =  File.read("/etc/oracle-­‐release").chomp    platform  "oracle"    platform_version  get_redhatish_version(contents) elsif  File.exists?("/etc/enterprise-­‐release")    contents  =  File.read("/etc/enterprise-­‐release").chomp    platform  "oracle"    platform_version  get_redhatish_version(contents) elsif  File.exists?("/etc/debian_version")    #  Ubuntu  and  Debian  both  have  /etc/debian_version    #  Ubuntu  should  always  have  a  working  lsb,  debian  does  not  by  default    if  lsb[:id]  =~  /Ubuntu/i        platform  "ubuntu"        platform_version  lsb[:release]    else          if  File.exists?("/usr/bin/raspi-­‐config")            platform  "raspbian"        else            platform  "debian"        end        platform_version  File.read("/etc/debian_version").chomp    end elsif  File.exists?("/etc/redhat-­‐release")    contents  =  File.read("/etc/redhat-­‐release").chomp    platform  get_redhatish_platform(contents) まるで    platform_version  get_redhatish_version(contents) elsif  File.exists?("/etc/system-­‐release")    contents  =  File.read("/etc/system-­‐release").chomp    platform  get_redhatish_platform(contents) 薄氷を踏むような...    platform_version  get_redhatish_version(contents) elsif  File.exists?(/etc/gentoo-­‐release) 地道な虱潰し    platform  "gentoo"Monday, March 4, 13
  • 15. AWS(EC2)上かどうかだって 検出するよ! def  has_ec2_mac?    network[:interfaces].values.each  do  |iface|        unless  iface[:arp].nil?            if  iface[:arp].value?("fe:ff:ff:ff:ff:ff")                Ohai::Log.debug("has_ec2_mac?  ==  true")                return  true            end        end    end    Ohai::Log.debug("has_ec2_mac?  ==  false")    false end def  looks_like_ec2?    #  Try  non-­‐blocking  connect  so  we  dont  "block"  if      #  the  Xen  environment  is  *not*  EC2    hint?(ec2)  ||  has_ec2_mac?  &&  can_metadata_connect? (EC2_METADATA_ADDR,80) end if  looks_like_ec2?    Ohai::Log.debug("looks_like_ec2?  ==  true") やっぱり地道に。Monday, March 4, 13
  • 16. プラットフォームを判別すると • パッケージ管理システムがわかる • サービスの管理方法がわかる • 環境特有の落とし穴も事前に回避する • Ex) ec2ならipでなくpublic hostname を主な接続先に使うなどMonday, March 4, 13
  • 17. Cookbook DSLでの例 package ‘nginx’ do action :install end たとえばコレだけでも • Redhat系ならyum/rpmを使って • Debian系ならapt/debを使って • Solaris系ならpkgin/pkgを使って Chef::Runnerが標準パッケージシステムからnginxをイン ストールした状態にノードを収束させます。Monday, March 4, 13
  • 18. Inventory重要 • Chef-client/Chef-soloの動作に重要 • ChefServerに集約されたInventoryは SearchAPIによる自動環境構築に とってもユースフルMonday, March 4, 13
  • 19. 3.ConvergenceMonday, March 4, 13
  • 20. ✕ Build / Setup ⃝ ConvergenceMonday, March 4, 13
  • 21. Convergenceとは • Chefではサーバ設定の変更を Convergence(収束)と呼んでいます。 • (思想として)スクリプトを実行してサーバを セットアップするのではなく、Clientの実 行によってサーバの状態をレシピに書かれ ている通り収束させることを表現している ためです。Monday, March 4, 13
  • 22. どのような手法か • サーバの状態を取得し、レシピに書かれ た内容と比較。 • レシピと違えば「合わせる」、これの繰 り返しで設定を”収束”させます。 (※Cookbookは冪等に記述する) • 次のResouce Corectionでも説明します。Monday, March 4, 13
  • 23. 4.Resouce CorrectonMonday, March 4, 13
  • 24. レシピ適用で重要な Resouce/stateという考え方Monday, March 4, 13
  • 25. サーバの要素は全て RESOURCEとして定義 • 種類と要素=リソース • 例:パッケージ • インストール状態は? / バージョンは? • 例:サービス • 起動中? / 自動起動? • ファイル • パスは? / オーナーは? / 中身は?Monday, March 4, 13
  • 26. Curennt Resouceと New Resouce [New Resorce] 1. Client/Soloは目的のリ File ( :path => “/etc/hoge”, ソースを定義=New :owner => “root”, Converge! Resorce :mode => 0644, :content => “piyo”) 2. 現在のリソースを取得 =Current Resorce [Current Resorce] File ( 3. Current Resouce の 要素 :path => “/etc/hoge”, :owner => “root”, を変更 :mode => 0600, :content => “hoge”) ※プラットホーム別に 変更手段は違うMonday, March 4, 13
  • 27. Current Resouce取得例 パッケージマネージャ=PackManの場合 パッケージの状態を取得。。                    Chef::Log.debug("#{@new_resource}  checking  pacman  for  #{@new_resource.package_name}")                    status  =  popen4("pacman  -­‐Qi  #{@new_resource.package_name}")  do  |pid,  stdin,  stdout,  stderr|                        stdout.each  do  |line|                            line.force_encoding(Encoding::UTF_8)  if  line.respond_to?(:force_encoding)                            case  line                            when  /^Version(s?)*:  (.+)$/                                Chef::Log.debug("#{@new_resource}  current  version  is  #{$2}")                                @current_resource.version($2)                            end コマンド叩いてパース...Monday, March 4, 13
  • 28. New Resource適用例 パッケージをインストール状態に変更                def  install_package(name,  version)                    run_command_with_systems_locale(                        :command  =>  "pacman  -­‐-­‐sync  -­‐-­‐noconfirm  -­‐-­‐noprogressbar#{expand_options(@new_resource.options)}  #{name}"                    )                end これもまた泥臭い。。 Cronなんかもお勧めの溝さらい検出Source                if  @cron_exists                    unless  cron_different?                        Chef::Log.debug("Skipping  existing  cron  entry  #{@new_resource.name}")                        return                    end                    read_crontab.each_line  do  |line|                        case  line.chomp                        when  "#  Chef  Name:  #{@new_resource.name}"                            cron_found  =  trueMonday, March 4, 13
  • 29. Resouceと冪等性 • 地道なResouce Correction • CookBookレシピ=New Resource • Current Resouce を New Resourceと同じ Statusに収束させる。 • => Client/Solo は何度実行しても同じ結果、 同じ状態になるようにして、常に実行させてお くことが大事。Monday, March 4, 13
  • 30. 5.Configration Management (Automaticaly/ Configration First)Monday, March 4, 13
  • 31. 構成管理を自動化するMonday, March 4, 13
  • 32. 構成管理の自動化 ChefServer Inventory登録/更新(Ohai収集) Chef- •プラットホーム情報 Node Client •H/W情報 •N/W情報 Node Attribute Override Role付与・Runlist付与Monday, March 4, 13
  • 33. Env / Roleの割り当て例 Serverのインベントリを軸に設定更新 ChefServer Node Node Node Recipe[nagios-client] Recipe[nagios-server] ・Role[Nagis-Server]登録NodeのIP ・Role[Nagis-Client]登録NodeのIPを からのリクエストを許可 取得して監視する ・監視対象リソースのプラグインを ・監視対象NodeのAttributeから監視 インストール 項目を設定 Role[Nagios-Client] Role[Nagios-Server]Monday, March 4, 13
  • 34. 環境の構成管理をして サーバ構成を自動で合わせる (Configration Management First)Monday, March 4, 13
  • 35. 新しいNodeにRoleを割り当て =収束して環境に適応 ChefServer Roleに追加=Serverにイン New テキスト ベントリされる Node Node Node Node Nagiosのクライアント関 Recipe[nagios-client] 係設定が収束する Recipe[nagios-server] ・Role[Nagis-Server]登録NodeのIP ・Role[Nagis-Client]登録NodeのIPを からのリクエストを許可 取得して監視する ・監視対象リソースのプラグインを Role[Nagios-Server]はClient ・監視対象NodeのAttributeから監視 インストール のNodeの増減により自動で監 項目を設定 視対象の追加削除を行う Role[Nagios-Client] Role[Nagios-Server]Monday, March 4, 13
  • 36. 構成管理=環境構築 • Chef上の要素を変更=構成管理情報の 更新をしたら • Clientたちが適当に収束してくれる • 構成管理することが全てにつながるMonday, March 4, 13
  • 37. おわりに • Chefをただのワンショットビルドツール として扱うのは間違っちゃ無いが勿体無 い。 • Soloで更新をかけていくのも悪くはない が勿体無い。 これってActiveDirectoryなんじゃないの?と思った人、 大体あってますよ。Monday, March 4, 13