【実務・中級編】Chefインフラの完全コード監査:Chef Cookbooksに対する静的解析ツールFoodcritic・CookstyleのルールカスタマイズとCI統合 – インフラ構成管理(IaC)活用バイブル

Chefの「負債」を「資産」に変える:静的解析の極致とCIパイプライン完全実装術

Chefを使いこなしていると必ず直面する壁がある。「Chefは書けるが、メンテナンスが地獄」という状況だ。レガシーなCookbookが乱立し、冪等性を担保できないコードが運用を蝕む。

今日は、Chefの歴史的遺物であるFoodcriticを卒業し、RuboCopベースのCookstyleを極限までチューニングして、Chefインフラを「自動で品質が向上し続けるシステム」へと昇華させる戦略を伝授する。

—

1. Cookstyleカスタムルールの極意:組織の「暗黙知」をコード化せよ

デフォルトのルールだけでは、あなたの組織特有のベストプラクティスは守れない。`Cookstyle`はRuboCopのエンジンを積んでいるため、カスタムルールは驚くほど強力だ。

カスタムルールの作成

`lib/rubocop/cop/chef/custom_rule.rb` のようなディレクトリに、特定の規約を定義する。

例: 独自のリソース使用を禁止するカスタムCop
module RuboCop
module Cop
module Chef
class NoDeprecatedExecute < Base # 実行時に警告を出すメッセージ MSG = 'executeリソースは極力避け、専用のリソースを作成してください'.freeze def on_send(node) # executeブロックを見つけたら警告 return unless node.method_name == :execute add_offense(node) end end end end end プロのテクニック:
ルールを書きすぎるとノイズになる。まずは「破壊的な変更」や「セキュリティリスク」に絞り、「段階的修正アプローチ」を取れ。`.rubocop.yml` で `inherit_from` を使い、既存ルールは `enabled: false` にせず `Severity: info` から始め、徐々に厳格化する。

—

2. CI統合:プルリクを「番人」にする

静的解析をローカルに依存させてはいけない。GitHub Actionsを使った、妥協のないパイプライン構成例を示す。

`.github/workflows/chef_lint.yml`

name: Chef Quality Gate

on: [pull_request]

jobs:
lint:
runs-on: ubuntu-latest
steps:

  • uses: actions/checkout@v3
  • name: Setup Chef Workstation

uses: actionshub/chef-install@v2

  • name: Run Cookstyle

# –display-cop-names でどのルールに違反したか明示させる
# –format progress で進捗を可視化
run: cookstyle –display-cop-names –format progress

現場の知見:
ここで重要なのは「失敗した時に何をすべきか」だ。`–auto-correct` をCIで実行させ、コミットまで自動化するパイプラインを組めば、エンジニアは「コードのロジック」に集中できる。

—

3. 生産性を劇的に高める「神」ツールと設定

Chef開発は「Chef Workstation」だけでは完結しない。以下のツールを導入せよ。

VS Code 必須プラグイン

  • Chef Extension for VS Code: 言語サーバー(LSP)を有効化し、インテリセンスを完璧にしろ。
  • YAML/JSON Language Support: `attributes` ファイルやメタデータ管理用。
  • Error Lens: エラーをコード行に直接表示させ、修正ループを極限まで短縮する。

隠れたキーボードショートカット

  • `Cmd/Ctrl + Shift + P` -> `Chef: Execute Resource`: 該当するリソースブロックを即座に検証(インフラエンジニアの必須技)。

—

4. 実践的設定ファイルのベストプラクティス

`attributes/default.rb` や `metadata.rb` が巨大化するのは敗北のサインだ。

ディレクトリ構造の黄金則:

cookbooks/
my_app/
attributes/
default.rb # アプリの基本設定
tuning.rb # パフォーマンスチューニング用(分離する)
libraries/ # Chefのヘルパー関数(ビジネスロジックをここに書け)
recipes/
default.rb # 宣言的記述のみを記載

ベストプラクティス:

  • 属性の分離: `default.rb` に全てを詰め込むな。`tuning.rb` や `platform_specific.rb` などに分割し、`include_attribute` で呼び出せ。
  • ライブラリの活用: 複雑な条件分岐は `recipe` に書くな。`libraries/` 配下にカスタムヘルパーとしてメソッド化し、テスト(RSpec)可能にせよ。

—

最後に:なぜ「コード監査」なのか

インフラの自動化において、最もコストがかかるのは「コードを書くこと」ではなく「運用中にそのコードを読み解くこと」だ。

CookstyleをCIに統合し、カスタムルールで組織の知見をコードに溶け込ませることは、将来の自分たちへの最大の投資になる。「ルールを守らせる」のではなく、「ルールを守らないとコードがデプロイできない」状態をシステム的に強制せよ。

それが、世界最高峰のSREとして私が辿り着いた、インフラを「負債」から「資産」に変える唯一の道だ。さあ、今すぐ `cookstyle` を叩き、そのレガシーを浄化してくれ。

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