humangas's blog

自分の振り返りを適当に書いてます。書きっぷりはそん時の気分によって変わります。

ドットインストール:Chef 入門(全14回)まとめ

ドットインストール「Chef入門(全14回)」のまとめメモ
Chef Soloだけ。Chef Serverは概要だけ紹介。

概要

  • インフラをプログラム(Ruby)で記述できる
  • 公式サイト:OPSCODE/Chef
  • → 今、OpscodeからChefに社名変わった。ググらビリティ低しと巷では一時話題に。
  • 概念図
    • Chef Server: WORKSTATION: $ knife(cookbook) → Chef Server: → NODES
    • Chef Solo: WORKSTATION → NODES(knife-solo)
    • WORKSTATION: = 作業者の端末と思えばOK

f:id:Humangas:20140218131517p:plain

ツール準備

Chef を動かすためのツールを用意する。

  1. Chef インストール
  2. knife-solo(knife のプラグイン) インストール
    • サーバいらず

必要なツール

  • chef
  • knife-solo
  • knife-configure

※Rubyと、RubyGemsは先に入れておくこと。
Windowsなら、RubyInstallerで入れれば両方入る。

Chef インストール

$ curl -L https://www.opscode.com/chef/install.sh | sudo bash

knife-solo インストール

$ gem install knife-solo

knife 設定

※基本デフォルトでOK(Enter連打)

$ knife configure

環境準備

Chef を動かすための環境をセットアップする。

  1. ノード準備
    • VirtualBox(仮想環境)、Vagrant、仮想マシン
  2. Chef リポジトリ作成
    • knife solo 初期化→ Node対応→ Cookbook作成→ レシピ作成
  3. Cookbook をノードに反映

ノード(NODES)準備

テストノード(サーバ)をVagrant で作成することにする。

必要なモノ

  • VirtualBox
  • Vagrant
  • OS(sample:Linux)

Vagrant で作成したホストに接続

※ [host-name] = 識別名

$ vagrant ssh-config --host [host-name] >> ~/.shh/config

Chef リポジトリ作成(Cookbookが入ってるマシン)

  1. knife solo 初期化(knife solo init)
  2. Node をChef対応にする(knife solo prepare)
  3. Cookbook を作る(knife cookbook create)
  4. Cookbook をノードに反映させる(knife solo cook)

knife solo 初期化

$ knife solo init [repository-name]
$ cd [repository-name]

一杯ファイルあるけど、とりあえず、以下ファイルだけ見とけば良い。

  • site-cookbooks
    • 自分で作成するcookbookを入れる
    • cookbook は自分でいじらない cookbook を入れるのが慣習になっている。
  • nodes

ノードをChef対応にする

$ knife solo prepare [host-name]

Cookbook 作成

$ knife cookbook create [cookbook-name] -o site-cookbooks/

recipe 作成

とりあえず、recipes だけみとけば良い。 → ruby そのものであり、ここにやること書く。まさにサーバを料理する上でのレシピ。

nodes/[node-name].json
{
    "run_list":[
      "recipe[cookbook-name]"
   ]
}

Cookbook をノードに反映させる

→ サーバを料理しよう(クックブック>レシピ)を元に。

$ knife solo cook [node-name]

試してみる

いろいろ試して、何ができるのか感覚をつかむ。

  • まず、レシピ(レシピを束ねたモノ = cookbook)を作らないと始まらない。
  • レシピ自体は、Ruby そのもの。 まずは、初めからあるレシピである、default.rb を触ればいい。
  • レシピの package とか、serivce とかいうのをリソースと呼ぶ。
  • レシピの種類は色々ある
  • → yum apt-get とかの管理ツールをラップしていて、その辺もChef が吸収している。
  • 冪等性(素敵な考え方): 2回やっても、結果は同じ → インストールしていたら何もしない
  • → ただ、今はImmutable Infrastructureで、使い捨て的な考え方も出て来てる。つっても、Chefは使うけど。

レシピ例:

作ったレシピは、~/[chefプロジェクト]/chef-repo$ knife solo cook [node-name] で実行 & 反映する
※ chef-repo(Chef ルート)ディレクトリで実行すること(このコマンド実行した時、直下にnodes が無いとその度に作られてしまうため)。

  1. vim インストールしてみる
    • レシピ:Resource> package
  2. iptables をstop & 起動時にoff してみる
    • レシピ:Resource> service
  3. LAMPインストール & apache 起動 & 起動時にon してみる
    • レシピ:Resource> service、Ruby 配列使って一度にインストール
  4. Webサーバにファイル作って配置して表示する
    • テンプレファイル(.erb)と、ノードファイル(.json)で、動的に値入れてWebページ表示
  5. Apache の設定ファイルをテンプレ化する
    • Apache設定ファイル(httpd.conf)のテンプレファイル(httpd.conf.erb)でApache設定を動的設定

[レシピ例] vim をインストールしてみる

  • レシピ: Resouces > package
  • vim がインストールされる
# default.rb

package "vim-enhanced" do
    action :install
end

[レシピ例] iptables をstop & 起動時にoff してみる

  • レシピ: Resoouce > services
  • disable → 起動時にSTOPしておく。
  • この場合だと、stop して、 service off(disable)
# default.rb

service "iptables" do
    action [:stop, :disable]
end

[レシピ例] LAMPインストール & apache 起動 & 起動時にon してみる

  • LAMP(Linux + Apache + MySQL + Perl/PHP/Python)を用いたWeb-DBシステムのこと
  • %{の中に書いてある複数パッケージを(Ruby記法で)} インストール
  • → 参考にさせて頂いたサイト
  • httpd をスタート & 起動時にスタート設定
# default.rb

## php mysql-server httpd
%w{php mysql-server httpd}.each do |p|
    package p do
        action :install
    end
end

service "httpd" do
    action [:start, :enable]
end

[レシピ例] Webサーバにファイル作って配置して表示する

  • Resource> template: ファイル
  • テンプレートファイル: = 実行時にテンプレに値を埋め込むファイル(拡張子=.erb) = JSPみたいなモンと思えばおk
    • ~[chef-root-dir]/[repository-name]/site-cookboos/[cookbook]/template/default/[template].erb に配置
  • → [host-name].json に値を書くのが簡単
    • Chef では、弄りたいノード毎に、Node Object = [node].json ファイル を作成する
    • ~/[chef-root-dir]/[repository-name]/nodes/[node].json に配置
  • → もう一個やり方ある: ohai(オハイ) に定義してある名前を使うことも可能
    • ohai = インベントリ収集ツール
  • ロードの流れとしては、1. [レシピ].rb → [テンプレ].erb → [ノード].json
# default.rb = レシピファイル

template "index.html" do
    path "/var/www/html/index.html"
    souce "index.html.erb"
    mode 0644
end
# index.html.erb = テンプレートファイル(=JSPみたいな感じ)

<html>
// from [node].json
Hello from Chef Create by <%= node['owner']['name'] %>
// from ohai
platform <%= node[:platform] %>
</html>
# [node].json = 具体的値設定ファイル

{
    "owner":{
        "name": "Test Taro"
    },
    "run_list":[
        "recipe[
cookbook-name]"
    ]

}

ohai = インベントリ収集ツール = 環境変数みたいなモン

  • [node].json ファイルに具体的な値を書く以外にもう一個やり方がある
  • 拡張子の通り、json 形式
  • → ohai(オハイ) に定義してある名前を使うことも可能
  • ohai = インベントリ収集ツール(環境変数みたいなもん)
  • → キーに対する値が予め入ってるので、自分で定義しなくても取得できる値がある。
$ ohai

と、単に打った時は、インベントリリスト(値とともに)が表示される。
→ どんなキーがあるか調べる時に使えばおk

例えば、以下のように打てばOSが表示される。

$ ohai platform

[
 "centos"
]

[レシピ例] Apache の設定ファイルをテンプレ化する

  • Resource> template: ファイル
  • このhttpd.conf の中にも当然、動的値を入れられる json か ohai
  • この場合の.erbファイルは、元のサーバからコピーしてこればいい。
  • notifies → 変更があったら何かする。 この場合は、httpd.conf 変更があったらhttpd の自動リスタートするという設定  * httpd は、conf 編集したらサービス再起動しないと反映されないので、そういう時便利
  • 拡張子は、erb にする → httpd.conf.erb
# default.rb

template "httpd.conf" do
    path "/etc/httpd/conf/httpd.conf"
    source "httpd.conf.erb"
    mode 0644
    notifies :restart, 'service[httpd]'
end
# httpd.conf.erb

・・・
# Listen 12.34.56.78:80
Listen "<%= node['httpd']['port'] %>"
・・・
# [node].json = 具体的値設定ファイル

{
    "httpd":{
        "port": 80
    }
}