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をかじったことがある人なら聞いたこのあるRecipeやCookbookの作成はココ。Chef serverに対しknifeと呼ばれるコマンドラインツールを用いて、作成したCookbook、Recipeのアップロードをするのもココ。
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コマンド
CookbookやRecipeのひな形、Cookbookの開発に必要なgemの管理などを行う便利コマンド。
https://docs.chef.io/ctl_chef.html
4.3. knifeコマンド
Workstationにあるchef-repoとChef 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本体やRoleやEnvironment毎の情報を管理するレポジトリ。いわゆる作業ディレクトリのこと。これをGitなどのVCSを利用して管理する。
chef-repoの内容はknifeコマンドを利用してChef serverとの同期を行う。内容がアップロードされれば、Chef serverに登録されたNode上のchef-clientでchef-repo内のCookbookやRoleそしてEnvironmentなどが利用可能となる。
https://docs.chef.io/chef_repo.html
5.1.1. 管理するもの
以下がchef-repoで管理すべき項目。5.2.から各項目について説明していく。
- Policy
RoleEnvironmentData bag-
CookbookRecipeAttribute- 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-repoはPolicyを管理していると言っても良い気がする。
https://docs.chef.io/policy.html
5.2.1. Role
Nodeに紐づく 役割(Role) 毎に、プロビジョニングに利用するCookbookのRecipeや後述するAttributeを設定する。
Roleは、たとえばWebサーバーであったり、DBサーバーであったりとNodeごとに機能が分かれているサーバーの役割毎に作成することが多い。
https://docs.chef.io/roles.html
Roleの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) 毎に、プロビジョニングに利用するCookbookのRecipeや後述するAttributeを設定する。
Environmentは、たとえば開発に利用する「開発環境」であったり、本番デプロイ前に利用する「ステージング環境」、本番用の「本番環境」といった環境毎に作成することが多い。
https://docs.chef.io/environments.html
Environmentの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の例
file '/tmp/motd' do
content 'hello chef!'
end
apt_update 'Update the apt cache daily' do
frequency 86_400
action :periodic
end
package 'tar'
上記のRecipeはNodeが以下の3つの状態になっていることを表している。
-
/tmp/motdにはファイルが存在していて、そのファイルの内容はhello chef!と書かれている - 86,400秒ごとに
apt-get updateが実行される -
tarパッケージがインストールされている
fileやapt_updateはResourceと呼ばれ、このResourceをRecipe内に記述していくことで構成情報を定義していく。
https://docs.chef.io/resource.html
5.3.5. Attribute
Nodeに設定された属性情報のこと。Ohaiと呼ばれるNode内の情報を収集するツールが自動で設定するAttributeもあれば、CookbookやRecipeで定義されるAttributeも存在する。このAttributeはRecipe内で利用することもできる。
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ファイル
Cookbookのattributes/ディレクトリにはAttributeファイルを設置することができる。このAttributeファイルはそのCookbookで利用するAttributeのデフォルト値を定義し、それをNodeのAttributeとして利用することができる。
たとえばApache2のCookbookを作成しようと考え、以下のようなAttributeファイルを定義しデフォルト値を設定することができる。
default['apache']['dir'] = '/etc/apache2'
default['apache']['listen'] = [ '*:80' ]
これらの値をRecipeや設定ファイルのテンプレートで利用することができる。各ファイルでAttributeを参照するときの書き方は以下の通り。
-
Reciperecipe.rbnode['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の動作環境によってはその値を変えたい時がある。そういう時はRoleやEnvironmentの設定ファイルでAttributeの値を上書きしNodeへ反映させることができる。
たとえばApache2のDocumentRootをEnvironmentによって変化させたい時は以下のようにEnvironmentのjsonファイルを作成する。ここでは開発環境のDocumentRootを変更したいと考える。
{
"name": "dev",
"default_attributes": {
"apache": {
"dir": "/tmp/etc/apache2/"
}
},
"json_class": "Chef::Environment",
"description": "Development environment",
"chef_type": "environment"
}
このように環境によって属性値を変更することが可能。同じようにRoleでも似たような書き方をすれば属性値の上書きができる。
属性値の種類や上書きの優先順位はChefによって定義されているので、詳しくは公式ドキュメントを参照。
- 種類: https://docs.chef.io/attributes.html#attribute-types
- 優先順位: https://docs.chef.io/attributes.html#attribute-precedence
参考
- https://docs.chef.io/
-
https://github.com/svanzoest-cookbooks/apache2
-
Cookbookの構成や各機能の利用方法が参考になる
-