ラベル chef の投稿を表示しています。 すべての投稿を表示
ラベル chef の投稿を表示しています。 すべての投稿を表示

2014-01-16

chef の Directory リソース

chef の Directory レシピは次のように書く。

directory /path/to/dir do
  action :create
end

ところが、これは mkdir /path/to/dir とするようなもので、/path/to/ までディレクトリーがある場合は良いけれど /path/ までしかディレクトリーがない場合は to ディレクトリーがないと言ってエラーになる。

mkdir -p /path/to/dir のように、深いディレクトリーもちゃんと作成したい。

そういう場合は、recursive true オプションを加える。

directory /path/to/dir do
  recursive true
  action :create
end

ハマッたので、メモ。

2013-12-09

社内で chef-solo 勉強会を開いた

2013-12-09、chef-solo の勉強会... というか「入門の入門」をプレゼンした。

内容は伊藤直也氏の「入門 Chef Solo」をよりシンプルに噛み砕いたもの。

入門Chef Solo - Infrastructure as Code
入門Chef Solo - Infrastructure as Code

とはいえ、工夫もある。同書が発売されたのは 2013-03-11 (Amazon の書籍情報による)。それからまだ一年も経っていないのに、同書の内容は古くなっている。

同書の発売に少し先がけて、ruby 2.0.0 がリリースされた。Vagrant は gem ではなくパッケージ提供されるようになった。Sahara は今や gem ではなく Vagrant の plugin となっている。そして、ruby 2.0.0 で chef がインストールできないという困った事態。それも、現在最新の chef-solo 11.8.0 では解決してしまった。

chef は進化が早い。chef は専門用語が多い。

Chef Server や knife-solo といった上級編も魅力に映る。けれど、初めて chef-solo を触った時、そういった上級編の情報はぼくにとって混乱の元でしかなかった。

今回のプレゼンでは「入門の入門」とタイトルにうたった通り、本当に chef-solo を始める人向けに最小限の情報を伝えるようにしてみた。だから、レシピの書き方は書いても、attribute の説明はしていない。Template と File の違いは書いたけど、実際のコードは説明していない。

機会があれば「Chef-solo 入門」なんて勉強会を社内で開いて、Attribute の使い方や実践的なレシピのコードリーディングなどできれば... いいな。

chef-solo 関連のエントリー

2013-05-03

Gemfile に github の URL を書く方法

Gemfile で gem を取得する時、git を使うなら次の書き方ができる。

gem 'rubygems-format-dummy', :git => 'git://github.com/ataka/rubygems-format-dummy.git'

けれど、もし git のソースコードを github でホスティングしているなら、もっと簡単に書くことができる。

gem 'rubygems-format-dummy', :github => 'ataka/rubygems-format-dummy'

この書式のお蔭で chef 用の Gemfile が更にスッキリした。

$ cat /etc/chef/Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'rubygems-format-dummy', :github => 'ataka/rubygems-format-dummy'

イイナ。これ。

2013-04-29

chef で Homebrew をインストール

Mac に chef で Homebrew をインストールした? 一応、メモ。

Homebrew のレシピは、Opscode が提供しているので、それを使わせてもらう。

これを /var/chef-solo/cookbooks に入れる。

$ cd /var/chef-solo/cookbooks
$ git clone git://github.com/opscode-cookbooks/homebrew.git

/etc/chef に移ってコマンド実行。

$ sudo env PATH=$PATH bundle exec chef-solo -o homebrew

以上。

あとがき

Homebrew のインストールには手を焼いてほとほと困った。特に困ったのが erubis gem が見つからないというエラー。このエラーが出続けるおかげで、homebrew のインストールが止まり、解決策も見つからなかった。

諦めて homebrew は chef なしでインストールした。

本エントリーは、何故 homebrew のインストールに失敗したのかを記録する目的で書き始めた... んだけど、気がついたら成功してた。まさか、homebrew を手でインストールしたのが良かったのかな? すごく中途半端な気分。

2013-04-28

ruby-2.0.0-p0 で chef 11.4.4 をインストールする

ruby-2.0.0-p0 で chef をインストールすると、chef 実行時にこんなエラーが出た。

/Users/ataka/project/chef/vendor/bundle/ruby/2.0.0/gems/chef-11.4.4/lib/chef/provider/package/rubygems.rb:34:in `require': cannot load such file -- rubygems/format (LoadError)

この件に関しては、過去記事でダミーの format gem を作ることで解決した。

けれど、このやり方は自分で gem を作らねばならず面倒。少しでも簡便にインストールできる様にしようと、rubygems-format-dummy を GitHub に置いた。

これで、Gemfile を次の様に書けばよくなる。

source 'https://rubygems.org'
gem 'chef'
gem 'rubygems-format-dummy', :git => 'git://github.com/ataka/rubygems-format-dummy.git'

bundle install

一応、インストール・ログを残しておく。Mac の OS X 10.8.2。rbenv + ruby-2.0.0-p0。bundle コマンドでローカルにインストール。

$ bundle install --path vendor/bundle
Fetching git://github.com/ataka/rubygems-format-dummy.git
remote: Counting objects: 21, done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 21 (delta 4), reused 21 (delta 4)
Receiving objects: 100% (21/21), done.
Resolving deltas: 100% (4/4), done.
Fetching gem metadata from https://rubygems.org/........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Installing erubis (2.7.0)
Installing highline (1.6.18)
Using json (1.7.7)
Installing mixlib-log (1.6.0)
Installing mixlib-authentication (1.3.0)
Installing mixlib-cli (1.3.0)
Installing mixlib-config (1.1.2)
Installing mixlib-shellout (1.1.0)
Installing net-ssh (2.6.7)
Installing net-ssh-gateway (1.2.0)
Installing net-ssh-multi (1.1)
Installing ipaddress (0.8.0)
Installing systemu (2.5.2)
Installing yajl-ruby (1.1.0)
Installing ohai (6.16.0)
Installing mime-types (1.23)
Installing rest-client (1.6.7)
Installing chef (11.4.4)
Using rubygems-format-dummy (0.0.1) from git://github.com/ataka/rubygems-format-dummy.git (at master)
Using bundler (1.3.5)
Your bundle is complete!
It was installed into ./vendor/bundle
$ rbenv rehash
$ bundle exec chef-solo -v
Chef: 11.4.4

あとがき

これは ruby-2.0.0 のバグなのかなぁ? それとも仕様なのかなァ? chef 側が fix すべきなのか、ruby 側が fix すべきなのか... さてさて困った。

2013-04-25

fcopy.el (in github) を chef-solo で Mac にインストールした

MacBook Air に自作 EmacsLisp スクリプト fcopy.el を chef-solo を使ってインストールした。fcopy.el は git で管理してて、GitHub にホスティングしてる。つまり、今回は Mac に chef-solo で git 管理されてるツールをインストールする話。chef-solo のインストールについては過去記事を参照のこと。

recipe の作成

fcopy 用の cookbook を作る。

$ cd /etc/chef
$ bundle exec knife cookbook create fcopy

fcopy 用の recipe は /var/chef-solo/cookbooks/fcopy/recipes/default.rb を編集。install リソースを使わず、git リソースと bash リソースを使ってる。

git "/tmp/fcopy" do
  repository "git://github.com/ataka/fcopy.git"
  reference  "master"
  action :checkout
end

bash "install-fcopy" do
  install_dir='/usr/local/share/emacs/site-lisp'
  not_if {
    File.exists?("#{install_dir}/fcopy.el")
  }
  code <<-EOC
    install -m 664 /tmp/fcopy/fcopy.el #{install_dir}/
  EOC
end

chef-solo 実行

chef-solo を実行して fcopy.el をインストールする。レシピを指定してインストールする場合:

$ cd /etc/chef
$ sudo env PATH=$PATH bundle exec chef-solo -o fcopy

node.json を指定するなら、次の様に node.json を書く。

{
  "screen": {
    "users": [ "ataka", "ataka_work" ]
  },
  "run_list": [
                "recipe[screen]",
                "recipe[fcopy]"
              ]
}

chef-solo の実行では -j オプションを使う。

$ sudo env PATH=$PATH bundle exec chef-solo -j node.json

蛇足

今回の recipe では .emacs の編集までは行なわない。使う人は、~/.emacs.d/init.el に次の二行を追加。

(autoload 'fcopy-mode "fcopy" "copy lines or region without editing." t)
(define-key mode-specific-map "k" 'fcopy-mode) ; C-c k

あとがき

git リポジトリーからコードを clone して、bash を使ってインストールするレシピを書いた。今回の recipe には、更新 (update) が入っていない。どういう recipe を書くのが良いのかな? まだまだ勉強することが多い。分からないことも多い。

chef-solo を Monuntain Lion で試す

MacBook Air の環境構築を chef-solo を使ってやってみる。

ruby-2.0.0 のインストールまで

ターミナル・アプリを起動して ruby の存在を確認。ruby-1.8.7 がインストールされていることを確かめた。最初の状態では Xcode も X も git もインストールされていない。以下のパッケージをまずインストールした:

Google Chrome は愛用のブラウザーなので、いの一番にインストール。昔は Xcode をインストールすると X やらコマンド・ラインで使える gcc が入ったものだけど、Mountain Lion では X は別アプリ、コマンド・ライン用のコマンドも Command Line Tools に分離されている。

Command Line Tools をインストールすると git-1.7.12.4 もインストールされる。昔は MacPorts を使って git をインストールしていたので、この配慮はありがたい。

ruby のバージョンが古いので、rbenv 経由で 2.0.0p0 をインストールする (ruby-1.8.7 でも大丈夫という気もするけど念のため)。

$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv

.profile を作成。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

ruby-build をインストール:

$ git clone git://github.com/sstephenson/ruby-build.git
$ cd ruby-build
$ sudo ./install.sh

ruby-2.0.0-p0 をコンパイル & インストール:

$ rbenv install 2.0.0-p0
$ rbenv global 2.0.0-p0
$ rbenv rehash

最後に bundler gem をインストールしておく:

$ gem install bundler
$ rbenv rehash

chef-solo の準備

ruby-2.0.0 のための準備

ruby-2.0.0 では、chef-solo コマンド実行時に gemfiles/format がないというエラーが出る。その対策を先にしておく。ruby 1.9 を使っている人はスキップされたし。

$ mkdir prog
$ cd prog
$ bundle gem rubygems-format-dummy
$ cd rubygems-format-dummy
$ touch lib/rubygems/format.rb
$ git add lib/rubygems/format.rb
$ git commit -m 'initial commit'
$ emacs -nw -q rubygems-format-dummy.gemspec
 (TODO とあるところを適当に書き換える)
$ rake build
chef-solo のインストール

まず /etc/chef を作り chef-solo を /etc/chef 以下にインストールする。

$ sudo mkdir /etc/chef
$ sudo chgrp staff /etc/chef
$ sudo chmod 775 /etc/chef
$ cd /etc/chef
$ rbenv local 2.0.0-p0
$ cat <<'EOF' > Gemfile
source 'https://rubygems.org'
gem 'chef'
gem 'rubygems-format-dummy', :path => '/Users/you/prog/rubygems-format-dummy'
EOF
$ bundle install --path vendor/bundle
$ rbenv rehash
$ bundle exec chef-solo -v
Chef: 11.4.0
設定ファイル

まず knife configure コマンドの実行。デフォールトから変えた点のみ記載。

$ bundle exec knife configure -i
Where should I put the config file? [Users/you/.chef/knife.rb] /etc/chef/.chef/knife.rb
Please enter the path to a chef repository (or leave blank): /var/chef-solo

続いて solo.rb と node.json の作成。ここでは、レシピを screen にしておく。

$ cd /etc/chef
$ cat <<'EOF' > solo.rb
file_cache_path "/var/chef-solo"
cookbook_path ["/var/chef-solo/cookbooks"]
$ cat <<'EOF' > node.json
{
  "run_list": [ "recipe[screen]" ]
}
EOF

cookbook を置く場所も用意しておく。sudo するのも面倒なので一般ユーザーも cookbook を書けるようにしちゃった。

$ cd /var
$ sudo mkdir chef-solo
$ sudo chgrp staff chef-solo
$ sudo chmod 775 chef-solo

せっかくなので git で管理してみる。

$ cd chef-solo
$ touch .gitignore
$ git init
$ git add .gitignore
$ git commit -m 'initial commit'

Recipe を書く

screen の設定ファイル .screenrc をインストールする recipe を書いてみる。というのも、Mac での install ってどうなってるのか分からなかったので (^^;)。

まずは screen のための cookbook を作る。

$ cd /etc/chef
$ bundle exec knife cookbook create screen

template を作成する。/var/chef-solo/cookbooks/screen/templates/default/.screenrc.erb に普段使っている .screenrc の内容をコピペ (see also. clmemo@aka: GNU Screen の設定 (.screenrc) をさらしてみる)

escape ^Tt
markkeys h=^B:l=^F:$=^E:^U=^Z:^D=^V

続いてテンプレートをインストールする recipe を作成する。レシピの置き場所は /var/chef-solo/cookbooks/screen/recipes/default.rb。中身は次の通り:

users = node['screen']['users']

users.each do |user|
  template "Users/#{user}/.screenrc" do
    owner user
    group "staff"
    mode 0664
  end
end

Mac のホーム・ディレクトリーに .screenrc をインストールしようと試みている。

ユーザー名は /var/chef-solo/cookbooks/screen/attributes/default.rb に書く。ここではダミーとして guest とした。

default['screen']['users'] = [ 'guest' ]

以上で recipe の作成は終了。

chef-solo の実行

recipe が出来たので、chef-solo を実行する。

$ cd /etc/chef
$ bundle exec chef-solo -j node.json

と、これでは guest ユーザーに .screenrc がインストールされる。recipe の中にユーザーを書かなかったのは、自分の Mac にいるユーザー・アカウントを知られたくなかったのと、環境ごとにユーザー名が徴妙に変わったりするため。ユーザー・アカウントの違いは node.json の中で吸収する。ユーザー foo と bar がいる場合の node.json。

{
  "screen": {
    "users": [ "foo", "bar" ]
  },
  "run_list": [
                "recipe[screen]"
              ]
}

改めて chef-solo を実行。

$ bundle exec chef-solo -j node.json

今回はユーザー権限でも実行できるけど、ほとんどの場合はルート権限が必要と思う。その場合は、次の様にコマンドを打つ。

$ sudo env PATH=$PATH bundle exec chef-solo -j node.json

node.json でユーザー名を指定しないのなら、recipe を直接指定するのもあり。

$ sudo env PATH=$PATH bundle exec chef-solo -o screen

Mac での chef-solo 事始めは、これでおしまい。

あとがき

Mac で install を実行する場合、MacPorts とか Homebrew を使うのかな? どうやって使うのかな? Linux と同じ様な書き方でいいのかな? それは Linux の recipe と共存できるのかな?

今回、ユーザー・アカウントを recipe の中に含めたくなかったから node.json を使った。このやり方は chef 本流の書き方なのかしらん。もっとスマートなやり方がある様な気がする。

/var/chef-solo を git で管理してみたものの... 他人の cookbook を github から clone する時に git 管理下に git 管理下のリポジトリーを置くことになる。それは、なんか奇麗じゃない。

chef-solo に触ったばかりでまだまだ分からないことだらけ。本エントリーを読んで、多少なりとも Mac 使いが chef-solo を身近に感じとってもらえるなら嬉しい。

2013-04-05

chef-solo を Ruby-2.0.0 で試す —— 例: Objective-C コンパイル環境の用意

Ruby の Gem で chef というのが流行しているらしい。chef は、環境構築を自動化するプログラム。Shell Script を環境構築用に最適化して、スクリプト (レシピと呼ぶらしい) を ruby の文法で書けるようにしたもの、と理解すれば良いかな。

Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]
Software Design (ソフトウェア デザイン) 2012年 10月号 [雑誌]
入門Chef Solo - Infrastructure as Code
入門Chef Solo - Infrastructure as Code

先日、Objective-C 用の環境を構築した。忘れないように、chef のレシピに残してみる。

Ruby の環境

rvm で管理している ruby-2.0.0 上で作業する:

$ rvm list

rvm rubies

   ruby-1.9.3-p392 [ i686 ]
=* ruby-2.0.0-p0 [ i686 ]

# => - current
# =* - current && default
#  * - default

chef のインストール

chef は複数のレシピを保持する chef サーバーと、そのクライアントたる chef クライアントの二つから成る。ただ、自分のマシンにレシピを持っておく (もしくは github などに保存しておく) なら chef サーバーは不要。

入門から入りたいので、難しい chef サーバーは使わない。chef クライアントだけ使ってみる。chef クライアントのインストールは次の通り:

$ gem install chef

これで、chef-solo コマンドや knife コマンドという主要コマンドがインストールされる。

format.rb の解決

chef-solo -v でバージョンを見ようとすると、format.rb がないというエラーが出て止まる。Ruby 2.0 になった時に RubyGems のディレクトリー構成が変わったのが原因とのこと。

上記ページがダミーの rubygems/format の作り方を書いているので真似をした:

$ cd ~/my-project
$ bundle gem rubygems-format-dummy
      create  rubygems-format-dummy/Gemfile
      create  rubygems-format-dummy/Rakefile
      create  rubygems-format-dummy/LICENSE.txt
      create  rubygems-format-dummy/README.md
      create  rubygems-format-dummy/.gitignore
      create  rubygems-format-dummy/rubygems-format-dummy.gemspec
      create  rubygems-format-dummy/lib/rubygems/format/dummy.rb
      create  rubygems-format-dummy/lib/rubygems/format/dummy/version.rb
Initializating git repo in /home/ataka/my-project/rubygems-format-dummy
$ cd rubygems-format-dummy
$ touch lib/rubygems/format.rb
$ git add lib/rubygems/format.rb
$ git commit -m 'initial commit'
$ emacs -nw -q rubygems-format-dummy.gemspec
 (TODO とあるところを適当に書き換える)
$ rake install

以上。

もう一度、chef-solo でバージョン確認。

$ chef-solo -v
Chef: 11.4.0

上手くいった。

設定ファイル

まず、knife configure コマンドを実行する。chef-repo 以外は全てデフォールトのままで良いのかな?

$ sudo knife configure -i
sudo: knife: コマンドが見つかりません

ありゃ、knife が見つからない。ああ、PATH の問題か。

$ sudo env PATH=$PATH knife configure -i

chef-repo は /var/chef-solo にした。

chef-solo には 2 つの設定ファイルがある。なくても動くけど、小さな設定ファイルなので書いちゃう。

1 つ目は /var/chef/solo.rb:

file_cache_path "/var/chef-solo"
cookbook_path ["/var/chef-solo/cookbooks"]

キャシュと cookbook の置き場所を指定する。ちなみに cookbook の下に recipe というスクリプトを置く。recipe は後で書く。

2 つ目は /var/chef/node.json:

{
  "run_list": [ "recipe[objc]" ]
}

Recipe を書く

シンプルな Recipe を一つ。

knife コマンドでレシピの用意をする。

$ sudo env PATH=$PATH knife cookbook create tmux
WARNING: No knife configuration file found
** Creating cookbook tmux
** Creating README for cookbook: tmux
** Creating CHANGELOG for cookbook: tmux
** Creating metadata for cookbook: tmux

WARNING が出たけど無視。

/var/chef-solo/cookbooks/tmux/recipes/default.rb に以下のコードを追記:

package "tmux"
  action :install
end

これでインストール・コマンドを行ってくれるはず。

chef-solo でレシピを指定して実行。

$ sudo env PATH=$PATH chef-solo -o tmux
Starting Chef Client, version 11.4.0
[2013-04-05T10:24:49+09:00] WARN: Run List override has been provided.
[2013-04-05T10:24:49+09:00] WARN: Original Run List: []
[2013-04-05T10:24:49+09:00] WARN: Overridden Run List: [recipe[tmux]]
Compiling Cookbooks...
Converging 1 resources
Recipe: tmux::default
  * package[tmux] action install
    - install version 1.6-2 of package tmux

Chef Client finished, 1 resources updated

成功。

Objective-C の開発環境構築

過去記事を参考に... 基本、必要なパッケージさえインストールすればいいだけ。

knife コマンドで objc レシピを作る。

$ sudo env PATH=$PATH knife cookbook create objc

/var/chef-solo/cookbooks/objc/recipes/default.rb に追記。


%w{build-essential gobjc libgnustep-base-dev gnustep gnustep-devel}.each do |pkg|
  package pkg do
    action :install
  end
end

Ruby の文法を使えるのがありがたい。

インストール。今回、node.json をちゃんと書いているので、そちらを指定する。

$ sudo env PATH=$PATH chef-solo -j /etc/chef/node.json
Starting Chef Client, version 11.4.0
Compiling Cookbooks...
Converging 5 resources
Recipe: objc::default
  * package[build-essential] action install (up to date)
  * package[gobjc] action install
    - install version 4:4.7.2-1ubuntu2 of package gobjc

  * package[libgnustep-base-dev] action install
    - install version 1.22.1-4ubuntu1 of package libgnustep-base-dev

  * package[gnustep] action install  
    - install version 7.7 of package gnustep

  * package[gnustep-devel] action install
    - install version 7.7 of package gnustep-devel

Chef Client finished, 4 resources updated

成功。システム全体のレシピを扱う場合は node.json に複数のレシピ (今回は一つだけだったけど) を書いて -j オプションで指定。レシピを選択して実行する場合は、-o オプションでレシピ名を指定する。

あとがき

今回はインストールだけだったけど、chef を使えば /etc ディレクトリー下のファイルを環境に応じて作成したり (template)、ユーザーやグループを作成したりできる。

最後に感想。knife configure が、ちと分からない。chef は日々進化しているようなので、最新の情報を探すのが大変だった。はたして、この情報もどれ位い最新に沿ったものなのか...