Skip to content

Instantly share code, notes, and snippets.

@mokemokechicken
Created November 9, 2012 05:45
Show Gist options
  • Save mokemokechicken/4043946 to your computer and use it in GitHub Desktop.
Save mokemokechicken/4043946 to your computer and use it in GitHub Desktop.
Chef勉強会下書き

Chefとは

  • インフラ・ミドルウェア・アプリケーション構成の設定・管理フレームワーク
  • CUIコマンドベースでなく、Rubyベースで記述する
  • 一度書けば、誰でも実行できたり、再利用できるのが嬉しい
  • 類似フレームワークとしては、Puppetが有名

Chefのメリット

  • 開発環境や本番環境の構築高速化・標準化ができる
    • ネットワークやユーザの設定、ミドルウェアのインストール、etc
    • VirtualBoxなら最終的には、Box作成から起動・環境構築まで、数コマンドで実行できる
    • EC2も似たような感じにできる(っぽい)

Chef用語

  • Node:構築する対象環境
  • Cookbook: ある構築設定の塊
    • Recipe: Cookbookの中にある実行手順
    • Attribute: Cookbookの中にあるパラメータ(色々なタイミングで変更可能)
    • Resource: 環境と対話するための抽象化されたAPI
  • ResourceのAPIをRecipeにペタペタ書いて、細かい部分はAttributeで調整 が基本

Chefには2タイプ

  • Client / Server 型
    • ServerでCookbookや各NodeのAttributeを管理して実行
  • Solo型
    • CookbookやAttributeを別途指定する形で実行
      • Local FileにCheckOutしておいたり

Install Chef

CentOS6.x

sudo rpm -Uvh http://rbel.frameos.org/rbel6
sudo yum install -y git openssl ruby rubygems ruby-devel ruby-ri ruby-rdoc \
			ruby-shadow gcc gcc-c++ automake autoconf make curl dmidecode
sudo gem install chef --no-ri --no-rdoc

Debian, Ubuntu

sudo apt-get update
sudo apt-get install -y ruby ruby-dev libopenssl-ruby rdoc ri irb \
			build-essential wget ssl-cert curl rubygems git openssl
sudo gem install chef --no-ri --no-rdoc

Chef-Solo Cookbooks Repositoryの準備

git clone git://github.com/opscode/chef-repo.git chef-solo   
cd chef-solo
curl -O https://raw.github.com/gist/4030555/config_solo.sh
sh config_solo.sh

Cookbookの作成と使用

  • Opscodeで公開されているcookbookがある

  • 例えばntpを取り込む

      knife cookbook site install ntp -c knife.rb
    
  • ntpを実行してみる

      sudo chef-solo -c solo.rb -o ntp    
    

    これでntpやntpdが起動されるが、これだとyumとかと大して変わらない。

  • /etc/ntp.conf を変更したい

      cat<<EOF>node.json
      {
        "ntp": {
          "servers": ["ntp.nict.jp"]
        }
      }
      EOF
      sudo chef-solo -c solo.rb -o ntp -j node.json
    

このnode.jsonでntpのAttributeを上書きしてみると、/etc/ntp.confが書き換わっている。

どういうAttributeが使われそうかは、cookbooks/ntp/attributes/default.rb などを見るとわかる。大抵は、 cookbooks/ntp/README.md などにどういう使い方をするか書いてある。

紳士協定で、["cookbook名"]["Attribute名"] という名前空間を大抵は使う。

この、cookbooks と node.json を Commitしておけば、他の環境でも

sudo chef-solo -c solo.rb -o ntp -j node.json

で実行できるようになるというわけである。

###Recipeのポイント

標準的なResource APIや、各Cookbookが提供するAPIを上手く利用するのがコツ。

Cookbookの読み方

他人が作ったCookbookを読むことも多いと思うので、Cookbookの構成について簡単に説明する。

  • 基本Cookbookは cookbooksディレクトリ以下にある

    • REPO/cookbooks/{many_cookbooks...}
  • 例えば、yum の cookbook には以下のDIRがある

    • recipes/
    • attributes/
    • templates/
    • providers/
    • resources/

recipes

  • Recipeは、実際に実行するコマンドの単位。
  • recipes/default.rb というのがデフォルトで実行されるファイルになる。
  • 例えば、 ntp というRecipeを実行すると、 cookbooks/ntp/recipes/default.rb が実行される
  • ntp::hoge というRecipeを実行すると cookbooks/ntp/recipes/hoge.rb が実行される

attributes

  • Attibuteは、外部から実行時に指定可能な値のセットになる。

  • attributes/default.rb というのがCookbookが標準で準備している値になる。例えばこんな感じ。

      default["apache"]["dir"]          = "/etc/apache2"
      default["apache"]["listen_ports"] = [ "80","443" ]
    

    もしくは

      default.apache.dir          = "/etc/apache2"
      default.apache.listen_ports = [ "80","443" ]
    

    と書ける。

  • rails/attributes/tunables.rb などは、 include_attribute "rails::tunables" などで読み込める

  • Attributeは node.apache.dir などという形でRecipeでは参照される。先ほどのAttributeは以下のようにも書ける。

      node.default["apache"]["dir"]          = "/etc/apache2"
      node.default["apache"]["listen_ports"] = [ "80","443" ]
    
  • 上書きのルールなどは結構複雑?なので、http://wiki.opscode.com/display/chef/Attributes を参考に。

templates

  • Templateは、設定ファイルなどを記述するときによく使う。

  • erb(Embedded Ruby)のフォーマットで書く。 例えば、以下のようなTemplateがあったとする。

      #
      # /etc/sudoers
      #
      # Generated by Chef for <%= node[:fqdn] %>
      #
       
      Defaults        !lecture,tty_tickets,!fqdn
       
      # User privilege specification
      root          ALL=(ALL) ALL
       
      <% @sudoers_users.each do |user| -%>
      <%= user %>   ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL
      <% end -%>
       
      # Members of the sysadmin group may gain root privileges
      %sysadmin     ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL
       
      <% @sudoers_groups.each do |group| -%>
      # Members of the group '<%= group %>' may gain root privileges
      %<%= group %> ALL=(ALL) <%= "NOPASSWD:" if @passwordless %>ALL
      <% end -%>
    

    Recipeからこんな感じで呼び出せる。

      template "/etc/sudoers" do
        source "sudoers.erb"
        mode 0440
        owner "root"
        group "root"
        variables({
          :sudoers_groups => node[:authorization][:sudo][:groups],
          :sudoers_users => node[:authorization][:sudo][:users]
        })
      end
    

resources AND providers

  • ResourceとProviderは、他のRecipeに提供するAPIのようなものである。
  • 例えば yum/{resources,providers}/repository.rb というファイルは、 yum_repository という Resource APIになる。
  • resourcesが宣言で、providersが実装みたいな位置づけ(たぶん)。

よく使うResource API

(ほぼ、Software Design 2012/10 より)

Command 意味
template erb 形式でテキストファイルを設置する
cookbook_file 任意のファイルを配置するときに使う
file 圧縮ファイルなど、主にバイナルファイルの配布に利用される
directory ディレクトリを設定する
user ユーザを設定する
group グループを設定する
package パッケージのインストール、アップデートなど
service サービスの起動・管理
ifconfig インターフェースの設定
cron cron の設定
script 指定したスクリプト言語(bash, perlなど) でコマンドを実行する
deploy ソースコード管理システムからのデプロイを行う
log Chefの実行時にログを出力する

標準APIリスト。例とかもあります。 http://wiki.opscode.com/display/chef/Resources

Cookbook作成の実演

簡単ですが、こんなシナリオで。

  1. VagrantでVirtualBox作成&起動
  2. zsh, screen の Install
  3. User作成 && Shell は zsh
  4. 10gen の yum repository を追加して、 mongodb2.2 を Install

[[Chef実演メモ]]

参考リンク

  • Vagrant
    • VirtualBoxをコマンドラインから制御するツール。gemで入る。
    • CookbookをVirtualBoxで検証したいときに便利
 vagrant my_chef_test up とかで起動&Chef実行ができたりする。
    • OSImageList: http://www.vagrantbox.es/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment