Chef-solo導入〜簡単な設定まで

mac再インストールのついでに最近勉強中のchef-soloで状態を管理することにした。

※Webで資料を探してみましたが、Macの状態管理に触れている記事が少ないので参考になれば。**結局マニュアル最強ですね^^**

用語

chefは独自の用語が多い。

  • Knife:リポジトリ操作用のコマンドセット。(cookbookの生成等
  • Recipe:コード化された手順書、サーバーの状態
  • Cookbook:特定のレシピに必要なデータやファイルを纏めたもの
  • kitchen:Cookbookを含むChefの実行に必要な一連のファイルを纏めたもの
    • Kitchen > Cookbook > Recipeの階層で管理される。
  • Attribute:Recipeで使用する変数をまとめたもの
  • File:Recipeで作成するファイル。設定ファイルなんかを作成できる。
  • Library:Recipe上から実行するスクリプト。
  • Template:Attributeを埋め込んで内容を編集する前提の設定ファイルのテンプレート。
  • Fileとは内容を動的に変更する点が違うっぽい
  • Package:パッケージの状態を記述する。
  • Provider:パッケージの扱い方などOS依存な部分の抽象化を行う。
  • Metadata:Cookbookの名称、含まれるRecipeの情報、Cookbook同士の依存関係などを記述したRubyまたはJSONファイル

Resource

Chefのレシピ記述に使用するDSL。
構文とかは基本的にはRubyだけど、
Chef的な処理(インストールやら、設定ファイルのテンプレ指定やら)を定義する
Resourceと呼ばれる関数。

結構あるけどココにまとめられている。
http://docs.opscode.com/resource.html

よく使うのはこのへん
log:Chefのログを操作する
package:パッケージの状態を記述する
service サービスを操作する(start,restart,reload,stop等
template:設定ファイルをChefでいじる


chef&knifeインストール

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

knifeの設定

全部デフォでエンター連打

$ knife configure
※knife.rbの場所は覚えておく

knife-soloインストール

$ gem install knife-solo

Kitchen(リポジトリ)生成

Cookbookの入れ物であるKitchenを生成します。

$ cd ~/Dev/Chef
$ knife solo init mac
$ cd ./mac

※knife soloはリモートにレシピを反映させるための拡張なのですが、
 kitchenの生成もできます。なんだかややこしい。knifeデフォルトできたほうがスマートなんじゃ・・・

mac用のcookbookをopscodeからダウンロード

対象がLinuxだとここまででさくっと動くのですが
macはデフォルトではmacportsを使ってインストールしようとしますし、dmgのインストールにも一手間必要。

その辺をサクッとやってくれるcookbookがopscodeに上がっているのであやかります。

$ vim Gemfile
+ source 'https://rubygems.org'
+ gem 'librarian-chef'

$ bundle --path cookbooks

※ちなみにcookbooksには流用するcookbookを置いてます。自作はsite-cookbooksへ。
なお、cookbookはknife.rb(リモート用)とかsolo.rb(localhost用)に以下のようにカンマ区切りで書くと書いたパスを読み込んでくれます。
今回はkitchen配下にsolo.rbを作ります。(リモート反映時も使うのでknife.rbもついでにやっててもいい。

$ vim solo.rb
cookbook_path ["cookbooks", "site-cookbooks","vendor/site-cookbooks"]
※knife.rbの配置場所はknife configureで設定した箇所。
$ vim Cheffile
+ site 'http://community.opscode.com/api/v1'
+ cookbook 'mac_os_x'
+ cookbook 'dmg'
+ cookbook 'homebrew'
+ cookbook 'zip_app'
$ librarian-chef install 

これでmac用のcookbook4つが入る

Cookbook作成

dmg

$ knife cookbook create vagrant -o site-cookbooks
$ vim site-cookbooks/vagrant/recipes/default.rb
+ dmg_package "vagrant" do
+    volumes_dir "Vagrant"
+    source http://files.vagrantup.com/packages/7ec0ee1d00a916f80b109a298bab08e391945243/Vagrant-1.2.7.dmg"
+   type "pkg"
+   package_id "com.vagrant.vagrant"
+   action :install
+ end
zsh(brewインストール=>gitで設定をclone=>linkファイル生成)
$ vim site-cookbooks/zsh/recipe/default.rb
+ package "zsh" do
+   action :install
+ end
# gitでoh-my-zshも落としてくる
+ git "#{ENV['HOME']}/.oh-my-zsh" do
+  repository "git://github.com/robbyrussell/oh-my-zsh.git"
+  reference "master"
+  action :sync
+  user "wing"
+  group "staff"
+end

#  gitにあげているzshrcを落としてくる
+git "#{ENV['HOME']}/personal" do
+ repository "https://github.com/ma2k8/personal"
+  reference "master"
+  action :sync
+  user "wing"
+  group "staff"
+end

# リンクはりはり
+ link "#{ENV['HOME']}/personal/mac/zsh/.zshenv" do
+   to "#{ENV['HOME']}/"
+ end
ミドル系の起動までやるなら

brewインストールのレシピ書いて
(start|stop|restart)_command でサービス制御のコマンドをデフォルトから上書きしちゃえばいけた。
(Chef側ではmacのサービス起動コマンドを見つけられないみたい

※vagrant使うまでは僕もmacのローカルに開発環境立ててvhostをgusmaskで切り替えて頑張ってたんだけど
 vagrantでやったほうが間違いなく捗るからmac上にミドル立てるのはおすすめしない。

run_list作成
$ vim nodes/localhost.json
{
  "user": {
    "name": "wing",
    "group": "staff",
    "home": "/Users/wing",
    "dotfiles_repo": "https://github.com/ma2k8/dotfiles.git"
  },
  "homebrew": {
    "run_as": "wing"
  },
  "run_list": [
    "recipe[mac_os_x]",
    "recipe[dmg]",
    "recipe[homebrew]",
    "recipe[zsh]",
    "recipe[vagrant]"
  ]
}
設定反映
$ sudo chef-solo -c solo.rb -j nodes/localhost.json

次はvagrant
その次はchef-serverまで。。。ブログ書き慣れてないからとまとめるの大変(ってかまとまってない