Chef Solo入門読んだメモ

Chef Solo入門を読んだ

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

  8. 仮想マシンへのSSH(必要ならマシン名も記述)

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

      vagrant ssh-config --host *host_name*
    

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 cook [*user_name@*]*host_name*
     git add .
     git commit -m "Add *cook_book_name* recipe"
    
  6. 複数ホストへの実行

      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
    

    aa

  • ユーザ作成

      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"
          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は複数のユーザーを全ノードで作る等、各ノードで複数の条件でレシピを実行したい場合に作成する。 デフォルト変数ファイルの作成の仕方 cookbook/レシピ名/attributes/default.rbに記述する。記述方法はrubyのハッシュの書き方。

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使わない人はいないよね。そんな感じに設定できるものらしいです。 もう疲れたので今日はここまで。

東京Ruby会議10 感想

2013/1/13-14に東京Ruby会議10というRubyのカンファレンスに参加してきました。

こういう言語のカンファレンスは初めてだったのですが楽しく充実した時間をすごせました。

Rubyの話ばかりで普段Rubyを業務で使えない人間としてはたまらない感じの会ですね。

その中で雑感を幾つか。

 

 

まず、すごいと感じたのが、運営から発表者まですべて有志が行なっていたことです。(多少お金は出るんでしょうけど、会場設営から何から相当大変だったんじゃないかと思います)

カンファレンスの参加費も1000円と、大抵の人の交通費より安いのではないかという値段設定。更にトートバッグと缶バッチつきというw

 

 

発表は成功談や失敗談、ガチで行く人もいれば、ネタで行く人もいてバリエーションに富でいました。全体的には緩い感じの発表が多かったように思います。(結構有名ドコロの発表者も多かったですが。)

前日のボード疲れで、寝坊してしまって朝の幾つかは聞けなかったんですけれども、印象に残った発表を2つ。

・日本酒評価サイトとxDD

 日本酒評価サイトをいろんな駆動開発で行いましたという内容です。

 最初のADD(アルコール駆動開発)から始まりBDD(ビール駆動開発)、WDD(ワイン駆動開発)からいろいろ始まり、ネタ固めかとおもいきや、最後に周りのみんなに支えられてのCDD(コミュニティ駆動開発)と素晴らしい締めをしてきた発表です。

 自分が聞いた中では一番笑いがとれていたと思います。

 

Herokuでつくる50人のためのRailsアプリ

 句会(俳句の会)のメンバーのためにアプリを作って1年運用しています。という発表です。(個人的に最も良かった。)

 素晴らしいと思ったのが、句会のメンバーからすごく感謝されて句会では毎回おごってもらえるとか、使う人のモチベーションが高いからバグがあっても問題にされないとか、みんな大変さがわかってるから運営をサボってても良くて、精神的負荷が低かったから続けられたとか、そんな句会の暖かさみたいなのが垣間見える発表でした。

 本当に必要とされているものだったらバグが有っても(?)、出来がものすごく良くなくても(ある程度の出来は必要だとおもいます)喜んで使ってもらえる良い事例に思えました。(実際は画像を見る限り、かなり完成度は高いと思われますが)

 こういう素晴らしいサービス作りてぇぇぇ

 本人の俳句のスキルは上がらなかったという素晴らしいオチも付いており、プレゼンとしても良かったと思います。

 

 

あと忘れてましたが、「アンチぼっちランチ」なるものがありました。

ソロの参加者がぼっち飯にならないように、参加者希望者を4人1組にして飯に送り出すというものです。Ruby会議では参加者同士の交流も重要視しているからか、時間も2時間とられており、楽しいひとときを過ごせました。

てーか、みんな面白い!いい出会いです!

 他のカンファレンスでもアンチぼっちランチやればいいのに。

 

 

このカンファレンスで感じたいいとことはとにかく1つなのではないかと思いました。

Rubyという言語はコミュニティ・有志など、自主的に動く人たちによって支えられている。

 発表を聞いていると、皆さん積極的にRubyに貢献したい、という思いをひしひしと感じるのですよね。みなさんRubyが楽しいと思っていて、もっと楽しくしたい!と思っていろいろやってる感じがすごいします。

 地域.rbが多いのもそれが理由なように思えます。

 

 

雪の関係で途中で中止になって残念だったのですが、最後の発表が「ブログのススメ」だったので、これからブログを始めてみようという気になりました。

あの発表で結構ブログ再開する人多いんじゃないかな?

 

とにかくいいカンファレンスでした。