エンジニアの皆さん、こんにちは。
「手動でサーバーを設定する時代」は、もう過去の遺物です。深夜の障害対応で「どの設定ファイルを書き換えたか忘れた……」と頭を抱えたことはありませんか?
Chefは、「あるべき状態(Desired State)」をコードとして宣言し、何度実行しても同じ結果をもたらす(冪等性)ための強力な武器です。今回は、現場で即戦力となるChefの作法を、最短距離でマスターしましょう。
—
1. CookbookとRecipe:設計の「基本単位」を知る
Chefの世界では、設定の塊をCookbookと呼び、その中で具体的な手順を書いたファイルをRecipeと呼びます。
my_web_server/ # Cookbook名
├── attributes/ # 設定値のデフォルト
├── recipes/ # 実行手順(default.rbがエントリポイント)
│ └── default.rb # メインの処理
└── metadata.rb # 依存関係やメタ情報
- Recipe: 「パッケージをインストールする」「設定ファイルを配置する」「サービスを起動する」といった手順を Ruby ベースの DSL で記述します。
- Cookbook: これらを再利用可能な単位でパッケージ化したものです。
—
2. Attributes(属性):「環境差分」を吸収する仕組み
ハードコード(直書き)は悪です。環境ごとに値を変えたい(例:開発環境と本番環境でNginxのポートを変える)場合、Attributesを使います。
`attributes/default.rb` に書くのが基本です。
attributes/default.rb
属性の定義(node[‘cookbook名’][‘変数名’] という記法が鉄則です)
default[‘nginx’][‘port’] = 80
優先順位の極意:
Attributesは複数の場所で定義できますが、「Role > Environment > CookbookのAttribute」の順で評価されます。初心者のうちは、「`attributes/default.rb` で定義し、必要に応じて Recipe 内で `node[‘nginx’][‘port’]` と呼び出す」という基本ルールを守れば迷いません。
—
3. ハンズオン:Nginxをインストールして起動する
では、実際に「Nginxをインストールし、起動する」という最も重要なタスクを自動化しましょう。`recipes/default.rb` に以下のように記述します。
recipes/default.rb
1. パッケージのインストール(Chefの冪等性により、既に導入済みなら何もしません)
package ‘nginx’ do
action :install
end
2. 設定ファイルの管理(テンプレート機能を使います)
template ‘/etc/nginx/nginx.conf’ do
source ‘nginx.conf.erb’
mode ‘0644’
notifies :restart, ‘service[nginx]’, :immediately
end
3. サービスの起動と自動起動設定
service ‘nginx’ do
action [:enable, :start]
end
ここがプロの視点:
`notifies` を使っている点に注目してください。設定ファイルが書き換わった時だけ、自動的にNginxを再起動させる。これが「変更を宣言的に管理する」ということです。
—
4. Metadata.rb:依存関係を正しく管理する
`metadata.rb` は Cookbook の「戸籍謄本」です。他の Cookbook を利用する場合や、バージョン管理を行うために必須です。
metadata.rb
name ‘my_web_server’
maintainer ‘Your Name’
license ‘All Rights Reserved’
description ‘Nginxを構築する基本的なCookbook’
version ‘0.1.0’
依存するCookbookがある場合はここに記述
depends ‘apt’, ‘~> 7.0’
ベストプラクティス:
- バージョン番号: Semantic Versioning (Major.Minor.Patch) を厳守しましょう。
- 依存関係: `depends` を使うことで、チーム全体で同じ環境を再現できます。
—
まとめ:次に進むために
Chefを学ぶことは、「サーバーの状態をコードで管理する」というエンジニアリングの哲学を身につけることです。
1. まずは小さく書き始める: 最初から複雑なコードにせず、パッケージのインストールから始めましょう。
2. `chef-client –local-mode` で検証する: 本番サーバーに触れる前に、ローカルの仮想マシン(Vagrantなど)で動作確認を徹底してください。
3. 冪等性を意識する: 「何度実行しても同じ結果になるか?」を常に自分に問いかけてください。
この「宣言的な自動化」をマスターすれば、あなたのインフラ運用は劇的に安定します。さあ、次はあなた自身の手で、最初の `recipe` を書いてみてください。応援しています!