Chef Solo入門を読んだ

  • 37
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Vagrant

  1. Virtual Boxをインストール/起動
  2. OSイメージをDL(結構時間かかる)

    vagrant box add *vm_template_name* *vm_template_URL*  
    

    このページにVagrantに適したOSイメージが有り。

  3. OSの起動ファイルの作成

    vagrant init 
    
  4. (必要があれば)仮想マシンの設定ファイルを設定

     emacs Vagrantfile
    
  5. 仮想マシンの起動

    vagrant up  
    
  6. 仮想マシンの終了

     vagrant halt  
    
  7. 仮想マシンの削除

     vagrant destroy  
    
  • 仮想マシンへのSSH(必要ならマシン名も記述)

    vagrant ssh [*host_name*]
    
  • 仮想マシンへのSSHアクセスをログイン不要にする

    vagrant ssh-config --host *host_name* >> ~/.ssh/config
    

Vagrantfileの設定

Vagrant::Config.run do |config|  
    config.vm.define :*vm_name* do |cfg|  
        cfg.vm.box = "*vm_template_name*"  
        fg.vm.network :hostonly, :"192.168.100.100"  
        cfg.vm.host_name = "*host_name*"  
    end  
    同じように他のホストの定義を行う
end

Chef

Chef Soloのインストール

  1. knife-soloのインストール

    ver 0.2

    sudo gem install knife-solo
    

    ver 0.3

    git clone git://github.com/matschaffer/knife-solo.git  
    cd knife-solo  
    rake install  
    
    • ver0.3の場合下記を~/.chef/knife.rbに追加

      knife[:solo_paht] = "/tmp/chef-solo"

Chef-Soloの利用準備から実行まで

  1. 新規リポジトリのひな形作成

    knife solo init chef-repo
    cd chef-repo
    git init
    git add .
    git commit -m "first commit"
    
  2. クックブックの作成・編集

    knife cookbook create *cook_book_name* -o cookbooks
    emacs cookbooks/*cook_book_name*/recipes/default.rb
    
  3. ホストの設定の変更

    emacs nodes/*host_name*.json
    
  4. 環境の準備()

    knife solo prepare [*user_name@*]*vm_name*
    git add .
    git commit -m "add node json file"
    
  5. Chef Solo実行

    knife solo prepare
    knife solo cook [*user_name@*]*host_name*
    git add .
    git commit -m "Add *cook_book_name* recipe"
    
  • 複数ホストへの実行

    echo user@node1 user@node2 user@node3 | xargs -n 1 knife solo cook  
    

サードパーティのChefクックブック

設定

  1. Opscode Communityから秘密鍵のDL

    サインアップ → Get a new private key → ダウンロード

    ダウンロード先:/Users/rasenn/.chef/rasenn.pem
    
  2. knifeの設定
    ~/.chef/knife.rb を下記の通り編集

    client_key '/Users/rasenn/.chef/rasenn.pem'
    cookbook_path   ["./cookbooks"]
    

利用

  1. gitをコミット状態にする

    git init
    git add .
    git commit -m "commit"
    

2.yumクックブックの取得

    knife cookbook site vendor yum

レシピ等の書き方

デフォルトでは、cookbooks/レシピ名/recipes/default.rbに書くといいと思われます。

  • グループ作成

    group "*group_name*" do
        group_name "*group_name*"
        gid          403
        action [:create]
    end
    
  • ユーザ作成

    user "*user_name*" do 
        uid         403
        group       "*group_name*"
        home        "/var/run/"
        password    nil
        supports    :manage_home => true
        action      [:create, :manage]
    end
    

    passwordをnilにすることで、ログイン出来ないユーザを作成している

  • ohaiデータの利用
    ノード毎の情報(IPアドレスやパッケージのインストール状態等)の取得には、Ohaiというライブラリを利用している。
    下記コマンドにて実行できる。

    ohai
    
  • テンプレートからファイル作成

    テンプレートファイルはcookbooks/レシピ名/templates/に保存しておく。下記の例だと、cookbooks/レシピ名/templates/to.conf.erbに置くといい

    template "/etc/path/to.conf" do
        mode "0644"
        source "to.conf.erb"
        notifies :reload, 'service[*service_name*]'
    end
    

    /etc/path/to.confは配置先のパス、to.conf.erbはrecipeにあるファイル
    notifiesはtemplateを実行した後に、service[service_name]をreloadする。
    erbファイルなので変数が利用できる。IPアドレスの部分を変数にして、マシンごとに設定する、なんて事が可能。変数はホスト名.jsonで設定できるとのこと。
    下記のようなJSONファイルがあり、

    {
        "nginx": {
            "port" : 80
        },
        "run_list":
        [
        ]
    }
    

    下記のようなテンプレートファイルがある場合、

    <server><port><%= node[:nginx][:port] %></test></server>
    

    該当のマシンでは、

    <test>abc</test>
    

    上記のように変換される。このへんはRailsの変数がJSONファイルに移動しただけ、という感じ。

  • サービス起動

    service "*service*" do 
        action [:enable, :start]
        subscribes :restart, resources(:template => "/etc/path/to.conf")
        supports :status => true, :restart => true, :reload => true
    end
    

    :status,restart,reloadが利用可能。:restart => trueが設定されていない場合、stop+startで代用してしまう。
    subcribesは、テンプレートのnotifiesの逆、templateが更新されたら、serviceをrestartする。

  • パッケージのインストール

    package "*package_name*" do 
        action :install
        source "/tmp/tar-x.y.z.rpm"
        provider Chef::Provider::Package::Rpm
    end
    

    :installを:upgradeにすると、最新のパッケージに差し替わる。source,provideは省略可能
    削除の仕方は、下記の通り。

    package "*package_name*" do 
        action :remove
    end
    
  • rubygemsのインストール

    gem_package "rake" do 
        action :install
    end
    
  • Cookbook File

    ファイルをリモートマシンに転送する。"File"ってのもあるらしいけども、ファイルを1から作成する場合のものらしい。tarファイルとかrpmファイルを転送するのは、cookbook_fileらしい。

    cookbook_file "/tmp/supervisor.rpm" do 
        source "abc"
        mode 0644
    end
    

    改ざんとか、破損とか確認するためにチェックサムを確認できるらしい。(遊びでチェックサムは付けないかなぁ)

  • ディレクトリ作成

    directory "/test/directory" do 
        owner "rasenn"
        group rasenn
        mode 0755
        action :create
    end
    
  • 任意のシェルスクリプトを実行する。

    bash "install xyz" do
        user "rasenn"
        group "rasenn"
        cwd "/home/rasenn"
        environment "HOME" => '/home/rasenn'
        code <<-EOC
            curl -kL http://----- | bash
        EOC
        creates "/home/rasenn/----"
    end
    

    cwdはカレントディレクトリ、environmentは環境変数を設定するオプション。createsはそのファイルがあったら実行しないオプション。このコードが作るであろうファイルを指定する。
    not_ifonly_ifもあるらしい。not_ifは偽なら実行。only_ifは真なら実行。not_ifはunless,only_ifはifって感じですね。
    サンプルで、下記が書いてありましたが、これはかなり使えるんじゃないでしょうか?パスがどうなってるか分かりませんが。

    note_if 'which ruby-build'
    
  • Cron

    cron "test" do 
        hour 1
        weekday 6
        mailto admin@master.com
        action :create
    end
    
  • Deploy

    なんかあるらしい。githubとか利用できるって。

  • http_request

    こんな感じで使うのかな?
    http_resuest "google access" do
    url "http://test/regist/ip/adress"
    action :get
    end

  • Ifconfig
    IPアドレス設定時に利用できるとのこと

    ifconfig "192.168.1.100" do
        device "eth0"
    end
    
  • Link

  • Mount

  • Route

  • ruby_block

RunListの書き方

    {
        "run_list" : [
            "recipe[name::subname]",
            "recipe[apache2]",
            "recipe[apache2::mod_ssl]",
            "role[webserver]"
        ]
    }

上記の場合、下記の構成にすると、apaches::mod_sslが読み込まれる
apache2/
recipes/
default.rb
mode_ssl.rb

  • 他のレシピの読み込み方
    include_recipe "build-essential::default"

  • Resourceの自分での定義の仕方

変数の設定の仕方

AttributeとData Bagの2つがあるらしい。
Attributeは前に書いたとおり、JSONファイルに記述する。各ノードごとに利用。
Data Bagは複数のユーザーを全ノードで作る等、各ノードで複数の条件でレシピを実行したい場合に作成する。

Attribute

デフォルト変数ファイルの作成の仕方
cookbook/レシピ名/attributes/default.rbに記述する。記述方法はrubyのハッシュの書き方。

Data Bag

Databagは配列のように扱うことができるファイル。クックブック中ではidを参照とするようで、IDが必須の模様。

data_bags/
    users/
        userA.json
        userB.json

上記のデータ構造で

# userA.json
{
    "id" : "userA",
    "user_name" : "userA",
    "home" : "/home/userA"
}

上記の感じのIDを含むJSONファイルを作成する。
んでもって、レシピファイルで下記のように参照できる

# 〜〜/recipes/default.rb
data_ids = data_bag('users') # data_bags以下のフォルダ名
data_ids.each do |d_id|
    u = data_bag_item("users", ids)
    # ここからChef記述
    user u['usernane'] do 
        home u["home"]
    end
end

Role

かなり重要。いろいろレシピ作っておいて、webserver,databaseserverとか種類によってインストールするパッケージとかを変更できる。
Hadoopとかに適用しようとしたら、namenode,datanodeとかそういう設定にすれば、とかかなり使えるんじゃないかと。
サンプルで書いてあったのは、下記。ファイルパスはroles/webserver.json

    {
        "name" : "webserver",
        "default_attributes" : {},
        "override_attributes" : {},
        "json_class": "Chef::Role",
        "description": "",
        "chef_type": "role",
        "run_list": [
            "recipe[yum::epel]",
            "recipe[nginx]",
            "recipe[ruby]"
        ]
    }

run_listで設定してあるレシピを実行できるので、サーバーによってインストールする機材を変更できる。

Berkshelf

Bundler風に管理するライブラリ(?)。Rails使ってる人なら、bundler使わない人はいないよね。そんな感じに設定できるものらしいです。
もう疲れたので今日はここまで。

    # Gemfile
    source :rubygems
    gem 'berkshelf'

    bundle --path vendor/bundle

    # Berksfile
    site :opscode
    cookbook 'yum'
    cookbook 'nginx'

    bundle exec berks --path cookbooks

BerkshelfとVagrant連携

berks cookbook sandbox