What is chef
Upcoming SlideShare
Loading in...5
×
 

What is chef

on

  • 18,933 views

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

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

Statistics

Views

Total Views
18,933
Views on SlideShare
18,218
Embed Views
715

Actions

Likes
83
Downloads
94
Comments
0

15 Embeds 715

http://bikkuri.me 477
https://twitter.com 145
https://mj89sp3sau2k7lj1eg3k40hkeppguj6j-a-sites-opensocial.googleusercontent.com 30
http://ath.cicei.com 19
http://local.cfdg.com 14
http://s.deeeki.com 9
http://tweetedtimes.com 5
http://borovikov.1gb.ru 4
http://ab-sn5.tumblr.com 4
http://nuevospowerpoints.blogspot.com.es 2
http://localhost 2
https://web.tweetdeck.com 1
http://safe.txmblr.com 1
http://www.onlydoo.com 1
http://b.hatena.ne.jp 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

What is chef What is chef Presentation Transcript

  • What is Chef? Infrastructure management framework ※中身は日本語です。Monday, March 4, 13
  • Information • OpscodeのChefとは何なのかを中級者 以上向けに説明します http://www.opscode.com/chef/ • Author Yukihiko Sawanobori HiganWorks LLC(Japan)Monday, March 4, 13
  • Index 1. Introduction 2. Inventory 3. Convergence 4. Resource Correction 5. Configration Management (Automaticaly/Configration first)Monday, March 4, 13
  • 1.IntroductionMonday, March 4, 13
  • Q. Chefってサーバの 自動セットアップツール ですよね?Monday, March 4, 13
  • A. 違います。 環境のメタデータを管理し、 ノードの役割を収束させる OPSのフレームワークです。 ※別にただの自動ビルドツールとして扱っても構いませんMonday, March 4, 13
  • Q. DevOpsってよく言うし DeveloperとOperaterが 仲良く作ったのかな?Monday, March 4, 13
  • A. どちらかというと OPSの怒りが集積された ツールだと思います ※DevOpsの本質は特定のツールと関係ありません ※OhaiとChef::Providersのソースからは特に怨念を感じますMonday, March 4, 13
  • Chef認識正誤集1 ✕ レシピで華麗にサーバを自動設定 ⃝ 泥臭いプラットフォーム判別と、地べ たを いずるようなリソース判定を元に 矯正を施します ✕ ChefServerはあまり必要ない ⃝ ChefServerのインベントリこそ全てMonday, March 4, 13
  • Chef認識正誤集2 ✕ Cookbookにミドルウェアのサーバ別固有情報も書く ⃝ Role/NodeのOverride AttributeやChefServerへのク エリを使い、Cookbookは汎用的に書くべきです ✕ サーバ設定の変更をしたら別で作っているシステムの 構成管理台帳を更新する ⃝ サーバへの直接ログインを含め、ChefServer上の構 成管理だけで終わらせるのが理想です。Monday, March 4, 13
  • 2.InbentoryMonday, March 4, 13
  • まずはインベントリ収集から • Chef-Client(Chef-solo)が稼働するには 実行されたプラットホームの判別が最 も重要です。 • Chefのマルチプラットフォーム性を支 えるためには高度なインベントリの収 集力が必要!Monday, March 4, 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
  • 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
  • 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
  • プラットフォームを判別すると • パッケージ管理システムがわかる • サービスの管理方法がわかる • 環境特有の落とし穴も事前に回避する • Ex) ec2ならipでなくpublic hostname を主な接続先に使うなどMonday, March 4, 13
  • Cookbook DSLでの例 package ‘nginx’ do action :install end たとえばコレだけでも • Redhat系ならyum/rpmを使って • Debian系ならapt/debを使って • Solaris系ならpkgin/pkgを使って Chef::Runnerが標準パッケージシステムからnginxをイン ストールした状態にノードを収束させます。Monday, March 4, 13
  • Inventory重要 • Chef-client/Chef-soloの動作に重要 • ChefServerに集約されたInventoryは SearchAPIによる自動環境構築に とってもユースフルMonday, March 4, 13
  • 3.ConvergenceMonday, March 4, 13
  • ✕ Build / Setup ⃝ ConvergenceMonday, March 4, 13
  • Convergenceとは • Chefではサーバ設定の変更を Convergence(収束)と呼んでいます。 • (思想として)スクリプトを実行してサーバを セットアップするのではなく、Clientの実 行によってサーバの状態をレシピに書かれ ている通り収束させることを表現している ためです。Monday, March 4, 13
  • どのような手法か • サーバの状態を取得し、レシピに書かれ た内容と比較。 • レシピと違えば「合わせる」、これの繰 り返しで設定を”収束”させます。 (※Cookbookは冪等に記述する) • 次のResouce Corectionでも説明します。Monday, March 4, 13
  • 4.Resouce CorrectonMonday, March 4, 13
  • レシピ適用で重要な Resouce/stateという考え方Monday, March 4, 13
  • サーバの要素は全て RESOURCEとして定義 • 種類と要素=リソース • 例:パッケージ • インストール状態は? / バージョンは? • 例:サービス • 起動中? / 自動起動? • ファイル • パスは? / オーナーは? / 中身は?Monday, March 4, 13
  • 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
  • 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
  • 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
  • Resouceと冪等性 • 地道なResouce Correction • CookBookレシピ=New Resource • Current Resouce を New Resourceと同じ Statusに収束させる。 • => Client/Solo は何度実行しても同じ結果、 同じ状態になるようにして、常に実行させてお くことが大事。Monday, March 4, 13
  • 5.Configration Management (Automaticaly/ Configration First)Monday, March 4, 13
  • 構成管理を自動化するMonday, March 4, 13
  • 構成管理の自動化 ChefServer Inventory登録/更新(Ohai収集) Chef- •プラットホーム情報 Node Client •H/W情報 •N/W情報 Node Attribute Override Role付与・Runlist付与Monday, March 4, 13
  • 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
  • 環境の構成管理をして サーバ構成を自動で合わせる (Configration Management First)Monday, March 4, 13
  • 新しい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
  • 構成管理=環境構築 • Chef上の要素を変更=構成管理情報の 更新をしたら • Clientたちが適当に収束してくれる • 構成管理することが全てにつながるMonday, March 4, 13
  • おわりに • Chefをただのワンショットビルドツール として扱うのは間違っちゃ無いが勿体無 い。 • Soloで更新をかけていくのも悪くはない が勿体無い。 これってActiveDirectoryなんじゃないの?と思った人、 大体あってますよ。Monday, March 4, 13