【入門編】Chef Infra Clientの動的ノード属性(Automatic Attributes)のカスタマイズ:ohaiプラグイン自作による環境情報の拡張手法 – インフラ構成管理(IaC)活用バイブル

こんにちは。インフラの自動化という荒野を旅するエンジニアの皆さん。

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のノード属性にマッピングしたり、オンプレのハードウェア固有のセンサー情報をノード属性として取り込んだりすることが、当たり前の作業になります。

「毎日の作業が劇的に楽になる」——それは、こうして一つずつ、インフラの自動化をあなたの支配下に置くことから始まります。

まずは、今日作ったプラグインに、一つだけで良いので新しい属性を追加してみてください。サーバーがあなたの指示を待つ、従順で賢いパートナーへと進化するのを実感できるはずです。

何か詰まったら、いつでも聞いてくださいね。インフラの深淵で待っています。

タイトルとURLをコピーしました