こんにちは。インフラの自動化という荒野を旅するエンジニアの皆さん。
Chefを使っていると、必ずぶつかる壁があります。「ノードのOS標準情報だけでは、このサーバーを正しく制御できない」というジレンマです。例えば、社内独自のアプリケーションIDや、クラウドプロバイダーのメタデータAPIにはない特殊なハードウェア構成、あるいはオンプレとクラウドが混在する環境における「論理的な配置場所」。
これらをChefのレシピ内でスマートに扱うために不可欠なのが、「Ohai(オハイ)」プラグインの自作です。今日は、Chefという強力な武器を、あなたの組織専用の「特注品」へと進化させる極意を伝授しましょう。
—
Ohaiとは何か? —— サーバーの「自己紹介」を拡張する
Chefにおいて、`node`オブジェクトはサーバーのステータスそのものです。`node[‘cpu’][‘total’]`や`node[‘ipaddress’]`などは「Automatic Attributes」と呼ばれ、Chef実行のたびに収集されます。
この収集役がOhaiです。デフォルトのOhaiで足りないなら、自分でプラグインを書いて「サーバーに新しい自己紹介文を教え込めばいい」。これが、複雑な環境をコードで管理するエンジニアの標準的なアプローチです。
1. 開発環境のセットアップ
まずは、Ohaiプラグインを置く場所を決めます。Chef Infra Clientがインストールされていれば、特別な準備は不要です。
通常、カスタムプラグインは以下のディレクトリに配置します。
Chefの標準的なプラグインディレクトリ
/etc/chef/ohai/hints # あるいは cookbooks/my_cookbook/files/default/plugins
今回は、シンプルに動作を確認するため、`~/ohai_plugins`というディレクトリを作成して進めましょう。
2. HelloWorld:カスタムOhaiプラグインを書く
では、サーバーに「Environment_ID(環境識別子)」を認識させるプラグインを作成します。これは、Dev/Staging/Productionを判別したり、コストセンターを特定したりするのに非常に有用です。
以下のコードを `my_custom_attribute.rb` という名前で保存してください。
my_custom_attribute.rb
Ohaiプラグインは「Mash」というChef独自のハッシュ構造を利用します
Ohai.plugin(:MyCustomAttribute) do
# どの名前空間に情報を格納するかを定義
provides ‘my_env_info’
# 収集ロジックの定義
collect_data(:default) do
# ここに独自のロジックを記述
# 本来はファイルの中身を読んだり、APIを叩いたりします
my_env_info Mash.new
my_env_info[:app_id] = “webapp-01”
my_env_info[:deploy_stage] = File.exist?(“/etc/production_flag”) ? “prod” : “dev”
end
end
3. 動作確認:どうやって「魔法」を確かめるか
プラグインを書いたら、Chefを実行する前にローカルでテストするのがプロの流儀です。`ohai`コマンドを直接叩いて、自作した属性が正しく認識されているか確認しましょう。
-d オプションでプラグインディレクトリを指定して実行
ohai -d ~/ohai_plugins my_custom_attribute
成功すれば、以下のようにJSON形式で出力されます:
{
“my_env_info”: {
“app_id”: “webapp-01”,
“deploy_stage”: “dev”
}
}
これが表示された瞬間、あなたのサーバーは「自分自身をより深く理解した」ことになります。
—
現場で役立つ「極限の知見」:冪等性と柔軟性
さて、ここからが本題です。なぜわざわざOhaiプラグインを書くのか? それは、「レシピの責務を分離する」ためです。
- 悪い例: レシピの中で `File.exist?(“/etc/production_flag”)` を何度も判定し、条件分岐(if文)を書き散らす。
- 良い例: Ohaiで一度取得し、`node[‘my_env_info’][‘deploy_stage’]` として固定化する。
こうすることで、レシピは「何をするか(State)」に集中でき、判断ロジックは「Ohai」に隠蔽されます。これにより、Chefのコードは極めて読みやすく、冪等性が担保しやすくなります。
次のステップへ
一度この感覚を掴んでしまえば、AWSのタグ情報をメタデータから取得して自動的にChefのノード属性にマッピングしたり、オンプレのハードウェア固有のセンサー情報をノード属性として取り込んだりすることが、当たり前の作業になります。
「毎日の作業が劇的に楽になる」——それは、こうして一つずつ、インフラの自動化をあなたの支配下に置くことから始まります。
まずは、今日作ったプラグインに、一つだけで良いので新しい属性を追加してみてください。サーバーがあなたの指示を待つ、従順で賢いパートナーへと進化するのを実感できるはずです。
何か詰まったら、いつでも聞いてくださいね。インフラの深淵で待っています。