フレームワーク「Chef」の基本
2回目となる今回はChefのインストールと使い方がメインとなります。以下の順番で説明いたします。
——————————
・用語解説
・Chefのインストール
・Chefの使い方
——————————
用語解説
Chefはその名の通り「料理人」という言葉が由来になっており、その構成要素も料理をモチーフにして命名されています。
そのため、イメージしやすいと紹介されることもありますが、実際は独特の用語が多く、使われる用語の全てを理解するのは容易ではありません。
Chefを使うのに、最低限必要な用語をまとめましたので確認してください。
リポジトリ
Chef の実行に必要な一連のファイルをまとめる入れ物
クックブック
特定のレシピに必要なデータやファイルをまとめるもの。
レシピ
クックブックの中で実際に実行されるものでRubyで記述するパッケージやサーバの設定などを記載していきます。
リポジトリ > クックブック > レシピ という階層です。
Chefで何かをしようとしたらまずリポジトリを作り、次に例えば apache を入れたかったらapache のクックブックを作り、そのための設定をレシピに書くというイメージです。
knife
knife は Chef に含まれるツールでクックブックなどを作ることができます。
Chef-Solo
Chef-Solo は自分自身に対してクックブックを実行することができます。そのため、Chef-Solo はログインしたサーバー内での実行を前提としています。
Chefのインストール
それではインストールの説明に入ります。
まず公式サイトより、インストーラを入手します。下記のサイトにアクセスしてください。
インストーラのダウンロード
https://www.getchef.com/download-chef-client/
CentOS6 64bit環境であれば、
・Enterprise Linux
・6
・x86_64
と選択し、
最後に Chef のバージョンを選択してダウンロードし、
/usr/local/src/ 以下に配置します。
Chef-Soloのインストール
Red Hat Enterprise Linux6、x86_64構成でのrpmは下記の通りです。
自分のサーバー構成に合ったrpmはchef公式パッケージダウンロードページから選んでください。
1 2 3 4 |
# cd /usr/local/src # wget https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chef-11.16.4-1.el6.x86_64.rpm # rpm -ivh chef-11.16.4-1.el6.x86_64.rpm |
Chef-Soloがインストールされていることを確認しましょう。
1 |
# chef-solo -v |
Chef用のユーザー追加
続いてChef用のユーザを作成します(必須ではありません)
1 2 |
# useradd -g 100 -s /bin/bash chefuser01 # passwd chefuser01 |
なお、chefuser01のホームディレクトリ(/home/chefuser01)が今回のリポジトリにあたります。
リポジトリといってもただのディレクトリなので、mkdir等で別途作成することも可能です。
Chef用のユーザを作成した場合には、sudoコマンドが使えるようにします
1 2 3 4 5 6 |
# visudo ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL ↑ここの行頭のコメント(#)をはずす |
グループへの追加
1 |
# usermod -G wheel chefuser01 |
idコマンドでユーザーの情報を確認します
1 2 |
# id chefuser01 uid=500(chefuser01) gid=100(users) 所属グループ=100(users),10(wheel) |
Chefの使い方
ここからは作成したchefuser01で再度ログインしなおしてください。
Knifeの設定を行います。/home/chefuser01/.chefディレクトリ作成し、
1 |
$ mkdir /home/chefuser01/.chef |
/home/chefuser01/.chef/knife.rbファイルを作成し以下の通りに記載します。
1 2 |
$ vi /home/chefuser01/.chef/knife.rb cookbook_path [ "/home/chefuser01/cookbooks" ] #クックブックの格納先 |
つぎにChef-Soloの設定を行います。/home/chefuser01/cookbooksディレクトリを作成し
1 |
$ mkdir /home/chefuser01/cookbooks |
以下の通りに記載します。
1 2 3 4 |
$ vi /home/chefuser01/solo.rb log_level :info ♯ログの出力レベル log_location "/home/chefuser01/logfile" ♯ログの出力先 cookbook_path [ "/home/chefuser01/cookbooks" ] ♯クックブックの格納先 |
ここまで準備が出来たら最後にクックブックを作成してみましょう。
sample_cookbook という名前のクックブックを作成します。
下記のコマンドを実行すると、クックブックのテンプレートが展開されます。
1 2 3 4 5 |
$ knife cookbook create sample_cookbook ** Creating cookbook sample_cookbook ** Creating README for cookbook: sample_cookbook ** Creating CHANGELOG for cookbook: sample_cookbook ** Creating metadata for cookbook: sample_cookbook |
/home/chefuser01/cookbook 以下にsample_cookbook というクックブックが作成されます。
レシピの作成
クックブックの作成が終わりましたので、次にレシピの作成をします。
ここでは、リソースを使用してレシピを作成します。
リソースは、レシピで状態を定義するために作成された言語です。
例えば、ディレクトリが作成されている。パッケージがインストールされている。など同じフォーマットで様々な状態を定義できます。
基本的なフォーマットは以下の通りです。
1 2 3 4 |
<リソースタイプ> "<リソース名>" do <属性(Attribute)> "<属性値>" action :<アクションタイプ> end |
それでは、リソースを使用して実際にレシピを作成してみましょう。
下記のレシピでは、/tmp以下にfolderというディレクトリがある状態を定義しています。
また、所有ユーザや権限の設定も同時に行っています。
/home/user01/cookbooks/sample_book/recipesディレクトリにsample_recipe.rbという名前のレシピを以下の通りに作成します。
1 2 3 4 5 6 7 8 |
# vi /home/chefuser01/cookbooks/sample_cookbook/recipes/sample_recipe.rb directory "/tmp/folder" do owner 'chefuser01' group 'users' mode '0755' action :create end |
実行するレシピ・クックブックの登録
ノード(Chef-Client/Chef-Soloを実行するマシン)に実行するレシピを設定します。
ここではファイル名をnode.jsonとし、先程作成したレシピをランリストに設定しています。基本的なフォーマットは以下の通りです。
1 2 3 4 5 |
{ "run_list": [ "recipe[<クックブック名>::<レシピ名>]" ] } |
/home/user01/node.jsonファイルを作成し以下の通りに記載します。下記のファイルは、ノード固有の変数やランリストと呼ばれる実行レシピリストを定義します。
1 2 3 4 5 6 7 |
# vi /home/chefuser01/node.json { "run_list": [ "recipe[sample_cookbook::sample_recipe]" ] } |
これで準備完了となります。
実行
準備が整いましたのでChef-Soloを実行してみましょう。
/home/user01で以下のコマンドを実行します。root権限が必要となるため、ここではsudoを使用して実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ cd /home/user01 $ sudo chef-solo -c solo.rb -j node.json [sudo] password for chefuser01: Starting Chef Client, version 11.16.4 Compiling Cookbooks... Converging 1 resources Recipe: sample_cookbook::sample_recipe * directory[/tmp/folder] action create - create new directory /tmp/folder - change mode from '' to '0755' - change owner from '' to 'chefuser01' - change group from '' to 'users' Running handlers: Running handlers complete Chef Client finished, 1/1 resources updated in 1.872489736 seconds |
/tmp以下に、“folder”という名前のディレクトリが存在することを確認しましょう。
また、ファイルのowner・group・modeも定義した内容になっているはずです。
1 2 |
$ ls -lh /tmp drwxr-xr-x 2 chefuser01 users 4.0K 10月 28 17:37 2014 folder |
Chefはレシピとノードの状態を比較し、異なる場合のみ変更を行います。
そのため、レシピの定義と同じ状態でChef-Soloを何度実行しても同じ実行結果になります。
このように何度実行しても同じ状態になる特徴は、冪等性(べきとうせい)と呼ばれています。
以上がChefのインストールと使い方になります。
レシピは非常に簡単な内容でしたが、まずこの基本を理解することが大事です。
最後となる次回は、クックブックの紹介とまとめです。