What is Chef?Infrastructure management framework
※中身は日本語です。
Monday, March 4, 13
Information
• OpscodeのChefとは何なのかを中級者以上向けに説明しますhttp://www.opscode.com/chef/
• Author Yukihiko SawanoboriHiganWorks LLC(Japan)
Monday, March 4, 13
Index
1. Introduction2. Inventory3. Convergence 4. Resource Correction5. Configration Management
(Automaticaly/Configration first)
Monday, March 4, 13
1.Introduction
Monday, 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の怒りが集積されたツールだと思います
※OhaiとChef::Providersのソースからは特に怨念を感じます※DevOpsの本質は特定のツールと関係ありません
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.Inbentory
Monday, 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 endelsif 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") falseend
def looks_like_ec2? # Try non-‐blocking connect so we don't "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での例
たとえばコレだけでも
• Redhat系ならyum/rpmを使って
• Debian系ならapt/debを使って
• Solaris系ならpkgin/pkgを使って
Chef::Runnerが標準パッケージシステムからnginxをインストールした状態にノードを収束させます。
package ‘nginx’ do action :installend
Monday, March 4, 13
Inventory重要
• Chef-client/Chef-soloの動作に重要
• ChefServerに集約されたInventoryはSearchAPIによる自動環境構築にとってもユースフル
Monday, March 4, 13
3.Convergence
Monday, March 4, 13
✕ Build / Setup◯ Convergence
Monday, March 4, 13
Convergenceとは• Chefではサーバ設定の変更を
Convergence(収束)と呼んでいます。
• (思想として)スクリプトを実行してサーバをセットアップするのではなく、Clientの実行によってサーバの状態をレシピに書かれている通り収束させることを表現しているためです。
Monday, March 4, 13
どのような手法か
• サーバの状態を取得し、レシピに書かれた内容と比較。
• レシピと違えば「合わせる」、これの繰り返しで設定を”収束”させます。(※Cookbookは冪等に記述する)
• 次のResouce Corectionでも説明します。
Monday, March 4, 13
4.Resouce Correcton
Monday, March 4, 13
レシピ適用で重要なResouce/stateという考え方
Monday, March 4, 13
サーバの要素は全てRESOURCEとして定義
• 種類と要素=リソース
• 例:パッケージ
• インストール状態は? / バージョンは?
• 例:サービス
• 起動中? / 自動起動?
• ファイル
• パスは? / オーナーは? / 中身は?
Monday, March 4, 13
Curennt ResouceとNew Resouce
1. Client/Soloは目的のリソースを定義=New
Resorce
2. 現在のリソースを取得=Current Resorce
3. Current Resouce の 要素を変更※プラットホーム別に 変更手段は違う
[New Resorce]File (:path => “/etc/hoge”,:owner => “root”,:mode => 0644,:content => “piyo”)
[Current Resorce]File (:path => “/etc/hoge”,:owner => “root”,:mode => 0600,:content => “hoge”)
Converge!
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 = true
Monday, 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
Node
Node
Chef-Client
Inventory登録/更新(Ohai収集)
•プラットホーム情報•H/W情報
•N/W情報Attribute OverrideRole付与・Runlist付与
Monday, March 4, 13
Role[Nagios-Client]
Env / Roleの割り当て例Serverのインベントリを軸に設定更新
ChefServer
NodeNode
Role[Nagios-Server]
Node
Recipe[nagios-server]・Role[Nagis-Client]登録NodeのIPを取得して監視する・監視対象NodeのAttributeから監視項目を設定
Recipe[nagios-client]・Role[Nagis-Server]登録NodeのIP
からのリクエストを許可・監視対象リソースのプラグインをインストール
Monday, March 4, 13
環境の構成管理をしてサーバ構成を自動で合わせる(Configration Management
First)
Monday, March 4, 13
Role[Nagios-Client]
新しいNodeにRoleを割り当て=収束して環境に適応
ChefServer
NodeNode
Role[Nagios-Server]
Node
Recipe[nagios-server]・Role[Nagis-Client]登録NodeのIPを取得して監視する・監視対象NodeのAttributeから監視項目を設定
Recipe[nagios-client]・Role[Nagis-Server]登録NodeのIP
からのリクエストを許可・監視対象リソースのプラグインをインストール
NewNode
テキストRoleに追加=Serverにインベントリされる
Nagiosのクライアント関係設定が収束する
Role[Nagios-Server]はClient
のNodeの増減により自動で監視対象の追加削除を行う
Monday, March 4, 13
構成管理=環境構築
• Chef上の要素を変更=構成管理情報の更新をしたら
• Clientたちが適当に収束してくれる
• 構成管理することが全てにつながる
Monday, March 4, 13
おわりに
• Chefをただのワンショットビルドツールとして扱うのは間違っちゃ無いが勿体無い。
• Soloで更新をかけていくのも悪くはないが勿体無い。
これってActiveDirectoryなんじゃないの?と思った人、大体あってますよ。
Monday, March 4, 13