chef
vagrant

Chef Solo入門を読んだ

More than 5 years have passed since last update.


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