五条の比較的自由な日記

ツイッターだと短くて書けないようなことを書くためのブログ

オススメのchef

どうも五条です。chefを使いたいという人がいたらknife-soloはいかがでしょうか?私はいろいろ調べた結果chefはknife-soloで運用しています。インストールはこれを見れば迷わないと予想される。

  • chefの大雑把な説明

chefとは①ローカルでサーバの設定ファイルを作成して、②リモートのサーバに変更を行い、③それら設定ファイルや変更事項がリポジトリ管理されていて、④誰が何回行っても同様の設定結果が行われ、⑤事前に変更内容を上司や同僚などに確認させて判子を押させてから実行することができ、⑥複数台に同様の変更・設定を加えるときに、手間が減るようにするためのアプリ。種類が沢山あるが、vagrantを使うまでも無いと私は考えているので、chefの一種であるknife-soloにする。

  • 使用上の注意

実行ユーザが鍵認証でリモートのホストへパスワード無しでログインでき、リモートでsudo -sでパスワード無しでrootになれることが必要。

  • knife-soloのインストール

# rubyのインストール。ruby-develはchefのコンパイルに必要。
yum install ruby ruby-deve

# gemでknife-soloをインストール(gemはruby専用のyumみたなもの)
gem install knife-solo

  • chefホームの設定

# chef用ディレクトリを作成し、chefホームにする。ここでは~/chefをchefのホームに設定する。(どこでもいいがユーザのホームディレクトリ内が正しい気がする)
mkdir ~/chef && cd ~/chef

# knife-soloに使用するファイルの展開。カレントに展開。
knife solo init .

# 初期設定。全部ディフォルトで良い。
knife configure

# 必要なら変更する。おそらく鍵の部分は変更になるかもしれない。
vim ~/.chef/knife.rb

# cookbookの作成
cookbook=test

#testというクックブックを作成。これで~/chef/bookcooks/testが作成される。
knife cookbook create $cookbook -o cookbooks 

# $hostにchef-solo(knife-soloを動作させるファイル郡の配置)
host=centlocal
knife solo prepare $host

  • rubyをインストール場合

vim cookbooks/$test/recipes/default.rb

yum_package 'ruby' do
 action :install
end

# run_list設定。recipeの中のtestはdefaultの場合はtestだけで良い。それ以外の場合は、「test::ファイル名」と書く。

vim nodes/$host.json # 先頭の方のみ追記

"run_list":[
  "recipe[test]"
],

# 実際にレシピを実行
knife solo cook $host

# 結果確認
ssh $host "rpm -q ruby"

  • ファイルコピーの場合の例

#ファイルコピーという名前でクックブックを作成
cookbook=filecopy
knife cookbook create $cookbook -o cookbooks

# レシピ作成
vim cookbooks/$test/recipes/default.rb

cookbook_file '/etc/hosts' do
source "etc.hosts"
owner "root"
group "root"
mode "0644"
end

vim nodes/$host.json # 先頭の方のみ追記

"run_list":[
 "recipe[filecopy]"
],

# knife-solo実行
knife solo cook $host

 # 結果確認
ssh $host "cat /etc/hosts"

cookbook=bash
knife cookbook create $cookbook -o cookbooks

vim cookbooks/$cookbook/recipes/default.rb

script "copy file" do
interpreter "bash"
code <<-EOH
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 sleep 1
 cp /etc/hosts /etc/hosts.`date +%Y%m%d_%H%M%S`
 EOH
end

# 先頭の方のみ追記
vim nodes/$host.json 

"run_list":[
"recipe[bash]"
],

# knife-solo実行
knife solo cook $host

# 結果確認
ssh $host "ls -l /etc/hosts*"

-rw-r--r-- 1 root root 183 7月 22 19:52 2016 /etc/hosts
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201205
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201206
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201207
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201208
-rw-r--r-- 1 root root 183 7月 22 20:12 2016 /etc/hosts.20160722_201209
-rw-r--r--. 1 root root 378 4月 19 22:10 2015 /etc/hosts.allow
-rw-r--r--. 1 root root 460 1月 12 22:28 2010 /etc/hosts.deny

  • 小技というか実際の使い方。

私に言わせれば使い方は二種類ある。①対象のホスト毎にクックブックを 作成する方法と、②サーバプログラム毎にクックブックを作成する方法。

  1. おそらくこのソフトを作った人は①を想定しているが、毎回同じ設定を必ず同じサーバプログラムに適用するというケースは考えにくいし、実際そうはならずに点在したファイルを追っかける羽目に何度もなった。提出時の可読性も下がる。よって現実的には②の使用方法でホスト毎にクックブックを作成するのが正解では無いだろうか。
  2. インフラエンジニアにいきなりrubyかつchefの記述をいきなり読めって言うのは酷である。chef独自の便利機能は多いが、実際問題はchefの中で使用するのはほぼbashのみになる。事前に設定済みのconfファイルを用意しておけば、bashだけでほぼ行けるし、今までもそれでやった。