LoginSignup
15
14

More than 5 years have passed since last update.

Chefの全体像が掴めた気になれる用語集

Last updated at Posted at 2016-11-13

1. はじめに

ChefのチュートリアルをやってみたけどイマイチChefのなんたるかが掴めなかったので、公式ドキュメントのSite Mapを見ながら理解を深めるためにいろいろ書き出してみた。

2. Chefとは

あちこちのサイトで説明されているので省略

3. 構成

3.1. 超簡易概略図

  • よくある構成
Chef_Basic_Structure
      自マシン           中央管理鯖       デプロイ対象
                                        +------+
                                        | Node |
                                        +------+
  +-------------+    +-------------+    +------+
  | Workstation | -> | Chef server | -> | Node |
  +-------------+    +-------------+    +------+
                                        +------+
                                        | Node |
                                        +------+
  • Chef Soloを用いた構成
Chef_Solo_Structure
  +------------------------------------+
  | Workstation                        |
  |      |                             |
  |      v                             |
  | +-----------+                      |
  | | Chef Solo | -> Node(Workstation) |
  | +-----------+                      |
  +------------------------------------+

3.2. Workstation

自分の作業PCのこと。後述するChef Development Kit(Chef DK)をインストールする。
Chefをかじったことがある人なら聞いたこのあるRecipeCookbookの作成はココ。Chef serverに対しknifeと呼ばれるコマンドラインツールを用いて、作成したCookbookRecipeのアップロードをするのもココ。
https://docs.chef.io/workstation.html

3.3. Chef server

Cookbookの管理、後述するNodeに対してどのようなRecipe(正確に言うとRun-list)を適用させるかなどの設定管理を行う中央サーバー。knifeを利用するために必要な秘密鍵の取得はココから取ってくる。
https://docs.chef.io/server_components.html

3.4. Node

デプロイ対象のサーバー、サーバーインスタンス、ネットワーク機器などさまざまなマシンのこと。これらのNodeに対してChefはCookbookを適用してマシンの構成管理を行う。Nodeには事前にchef-clientをインストールする必要がある。
またNodeにはRun-listと呼ばれる構成情報リストを指定する必要がある。
https://docs.chef.io/nodes.html

4. ツール類

4.1. Chef Development Kit (Chef DK)

Chefを利用するのに必要なツールが1つになった開発キット。とりあえずWorkstationに入れておけば問題なし。
https://downloads.chef.io/chef-dk/

4.2. chefコマンド

CookbookRecipeのひな形、Cookbookの開発に必要なgemの管理などを行う便利コマンド。
https://docs.chef.io/ctl_chef.html

4.3. knifeコマンド

Workstationにあるchef-repoChef server間で通信を行うためのコマンドラインツール。Nodeの設定やCookbookのアップロード、Role設定などなど、Chefの動作に必要な設定情報をこのツールを利用してChef serverとやりとりする。
https://docs.chef.io/knife.html

4.4. Berkshelf

Cookbookの依存関係を管理するツール。Cookbookが格納されたディレクトリのBerksfileがこのツールの設定ファイルとなる。
https://docs.chef.io/berkshelf.html
http://berkshelf.com/

4.5. chef-client

Chef serverからCookbookをダウンロードして同期したり、実際にNodeに対して構成情報の反映を行うエージェントツール。Nodeにインストールして利用する。
https://docs.chef.io/chef_client.html

4.6. Test Kitchen, ChefSpec, Foodcritic

インテグレーションテストツール、コードの整形(lint)ツールなどなど。
あると便利なツールたちで、必要に応じて利用する。

5. 利用者が作成するもの

5.1. chef-repo

Cookbook本体やRoleEnvironment毎の情報を管理するレポジトリ。いわゆる作業ディレクトリのこと。これをGitなどのVCSを利用して管理する。

chef-repoの内容はknifeコマンドを利用してChef serverとの同期を行う。内容がアップロードされれば、Chef serverに登録されたNode上のchef-clientchef-repo内のCookbookRoleそしてEnvironmentなどが利用可能となる。
https://docs.chef.io/chef_repo.html

5.1.1. 管理するもの

以下がchef-repoで管理すべき項目。5.2.から各項目について説明していく。

  • Policy
    • Role
    • Environment
    • Data bag
    • Cookbook
      • Recipe
      • Attribute
      • etc...

5.1.2. 構成ディレクトリ

構成ディレクトリ 構成ファイル
.chef/ Chef serverから取得した秘密鍵とknife.rbなど
cookbooks/ Cookbookのディレクトリ
databags/ Data bagが記されたRubyもしくはjsonファイル
environments/ Environmentが記されたRubyもしくはjsonファイル
roles/ Roleが記されたRubyもしくはjsonファイル

5.2. Policy

Policyとは「Chef serverに保持されるNodeのプロビジョニングのために必要な設定やオブジェクトの総称」のこと。意味は5.1.1.で紹介したchef-repoで管理する項目と同義。いわばchef-repoPolicyを管理していると言っても良い気がする。
https://docs.chef.io/policy.html

5.2.1. Role

Nodeに紐づく 役割(Role) 毎に、プロビジョニングに利用するCookbookRecipeや後述するAttributeを設定する。
Roleは、たとえばWebサーバーであったり、DBサーバーであったりとNodeごとに機能が分かれているサーバーの役割毎に作成することが多い。
https://docs.chef.io/roles.html

Roleのjsonファイル例

roles/web.json
{
  "name": "web",
  "chef_type": "role",
  "json_class": "Chef::Role",
  "default_attributes": {
    "apache": {
      "listen": [ "*:80", "*:443" ]
    }
  },
  "description": "HTTP Server",
  "run_list": [
    "recipe[apache2]",
    "recipe[apache2::mod_ssl]"
  ]
}

5.2.2. Enviornment

Nodeに紐づく 環境(Environment) 毎に、プロビジョニングに利用するCookbookRecipeや後述するAttributeを設定する。
Environmentは、たとえば開発に利用する「開発環境」であったり、本番デプロイ前に利用する「ステージング環境」、本番用の「本番環境」といった環境毎に作成することが多い。
https://docs.chef.io/environments.html

Environmentのjsonファイル例

environments/prod.json
{
  "name": "prod",
  "default_attributes": {
    "apache": {
      "timeout": 500,
      "contact": "admin@example.com",
      "serversignature": "Off"
    }
  },
  "json_class": "Chef::Environment",
  "description": "Procudtion environment",
  "chef_type": "environment"
}

5.2.3. Data Bag

上記のRoleにもEnvironmentにも関連しない、「chef-repo全体で共有しておくべきデータを扱いたい場合」はData bagを利用する。
たとえば、各Role、各Environmentで共通したアプリケーション実行ユーザーアカウントを利用したいと考えた場合、アカウントデータをData bagに登録しておき、そのデータをRecipe内で利用してユーザーをNode上に作成する、といった使い方ができる。

また、サーバー間連携で利用するための秘密鍵や、DBに接続するためのパスワードなどのセキュアな情報を格納することも可能。それらのデータの暗号化、複合化機能もChefが提供してくれる。
https://docs.chef.io/data_bags.html

5.2.4. Run-list

Run-listは「NodeもしくはRole」を構成するのに必要な「RoleもしくはRecipe」を列挙したリストのこと。NodeにはRoleの情報を、RoleにはRecipeの情報を指定する、といった使い方がキレイにまとまりそう。
https://docs.chef.io/run_lists.html

Run-listの書式は以下のとおり。

  • webというRoleを指定する
  'role[web]'
  • Cookbook名がhoge、Recipe名がhugaのRecipeを指定する
  'recipe[hoge::huga]'

5.3. Cookbook

Cookbookは「Recipeの管理」や、「Cookbook内のRecipeおよびNodeで利用する属性値を定義するAttributeの管理」を行う。Recipeと並ぶChefの根幹を成す概念。
https://docs.chef.io/cookbooks.html

Cookbookを構成する代表的なディレクトリやファイルは以下のとおり。

5.3.1. 代表的な構成ディレクトリ

ディレクトリ名 概要
attributes/ Attributeを定義するRubyコードを格納するディレクトリ
files/ cookbook_file resourceなどのファイルを操作するresourceで利用するファイルが格納される
https://docs.chef.io/files.html
libraries/ 任意のRubyのコードを格納するディレクトリ
https://docs.chef.io/libraries.html
recipes/ Recipeを格納するディレクトリ
resources/ Cookbook独自のResource(Custom Resource)を定義するために利用するディレクトリ
https://docs.chef.io/custom_resources.html
spec/ ChefSpecなどで利用するテストファイルを格納するディレクトリ
https://docs.chef.io/chefspec.html
templates/ eRubyを利用しテンプレート化した設定ファイルを格納するディレクトリ
https://docs.chef.io/templates.html

5.3.2. 代表的な構成ファイル

ファイル名 概要
.kitchen.yml Test Kitchenで利用する設定ファイル
Berksfile Berkshelfの設定ファイル
metadata.rb Cookbookの名前や作者などのメタデータの設定ファイル
https://docs.chef.io/cookbook_repo.html#about-cookbook-metadata
chefignore Chef serverへのアップロード時に除外するファイルの設定ファイル
https://docs.chef.io/chef_repo.html#chefignore-files

5.3.3. Recipe

Chef独自のDSLで記述されたRubyファイルのこと。「特定のパッケージがインストールされている」、「このパスに特定のファイルが配置されている」などNodeを構成する設定情報が記述されている。Cookbookの構成要素の1つ。
https://docs.chef.io/recipes.html

5.3.4. Recipeの例

recipe.rb
file '/tmp/motd' do
  content 'hello chef!'
end

apt_update 'Update the apt cache daily' do
  frequency 86_400
  action :periodic
end

package 'tar'

上記のRecipeNodeが以下の3つの状態になっていることを表している。

  • /tmp/motdにはファイルが存在していて、そのファイルの内容はhello chef!と書かれている
  • 86,400秒ごとにapt-get updateが実行される
  • tarパッケージがインストールされている

fileapt_updateResourceと呼ばれ、このResourceRecipe内に記述していくことで構成情報を定義していく。
https://docs.chef.io/resource.html

5.3.5. Attribute

Nodeに設定された属性情報のこと。Ohaiと呼ばれるNode内の情報を収集するツールが自動で設定するAttributeもあれば、CookbookRecipeで定義されるAttributeも存在する。このAttributeRecipe内で利用することもできる。
https://docs.chef.io/attributes.html

5.3.5.1. Ohaiで設定されるAttribute例

Attribute名 説明
node['platform'] Nodeのプラットフォーム情報
(ex. ubuntu, centos...)
node['ipaddress'] NodeのIPアドレス

5.3.5.2. Attributeファイル

Cookbookattributes/ディレクトリにはAttributeファイルを設置することができる。このAttributeファイルはそのCookbookで利用するAttributeのデフォルト値を定義し、それをNodeAttributeとして利用することができる。

たとえばApache2のCookbookを作成しようと考え、以下のようなAttributeファイルを定義しデフォルト値を設定することができる。

attributes/default.rb
default['apache']['dir'] = '/etc/apache2'
default['apache']['listen'] = [ '*:80' ]

これらの値をRecipeや設定ファイルのテンプレートで利用することができる。各ファイルでAttributeを参照するときの書き方は以下の通り。

  • Recipe
recipe.rb
  node['apache']['dir']    # /etc/apache2
  node['apache']['listen'] # [ '*:80' ]
  • 設定ファイルのテンプレート
apache2.conf.erb
  …
  ServerRoot "<%= node['apache']['dir'] %>"
  …
  <% node['apache']['listen'].each do |l| %>
  Listen <%= l %>
  <% end %>
  …

5.3.5.3. Attributeの上書き

AttributeファイルはCookbook内で利用する属性のデフォルト値を設定するが、Nodeの動作環境によってはその値を変えたい時がある。そういう時はRoleEnvironmentの設定ファイルでAttributeの値を上書きしNodeへ反映させることができる。

たとえばApache2のDocumentRootをEnvironmentによって変化させたい時は以下のようにEnvironmentのjsonファイルを作成する。ここでは開発環境のDocumentRootを変更したいと考える。

environments/dev.json
{
  "name": "dev",
  "default_attributes": {
    "apache": {
      "dir": "/tmp/etc/apache2/"
    }
  },
  "json_class": "Chef::Environment",
  "description": "Development environment",
  "chef_type": "environment"
}

このように環境によって属性値を変更することが可能。同じようにRoleでも似たような書き方をすれば属性値の上書きができる。

属性値の種類や上書きの優先順位はChefによって定義されているので、詳しくは公式ドキュメントを参照。

参考

15
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
14