閉域網の迷宮を制圧せよ:Chefによる「完全オフライン」インフラ自動化の極意
モダンなクラウド環境でIaCを回すのは容易い。インターネットという広大なリソースライブラリが背後にあるからだ。しかし、金融、防衛、製造の現場といった「エアーギャップ(閉域網)」環境では話が全く別次元になる。
今日は、インターネットという「生命線」を断たれた過酷な環境で、いかにしてChefの真価を引き出し、開発速度を落とさずにインフラを制御し続けるか。その深淵なる技術スタックを共有する。
—
1. 閉域網アーキテクチャの基本設計:物理的な分断を論理で克服する
インターネットから遮断された環境では、`chef-client` が `supermarket.chef.io` を叩くことは許されない。我々が構築すべきは、「オンプレミス・エコシステム」の完結だ。
必須コンポーネント
- Chef Server: 構成管理の司令塔。
- Chef Supermarket (Private): Cookbookの社内プライベートリポジトリ。
- Artifactory / Nexus: 依存パッケージ(Ruby gems, OSパッケージ)のプロキシ。
- Local Mirroring Server: 外部から持ち込んだファイルを配信する「ゲートウェイ」。
—
2. 依存パッケージの「安全なオフライン同期」手法
「インターネットがないからChefが動かない」というのは甘えだ。外部環境で `berkshelf` を使って依存関係を解決し、それを物理メディア(またはデータダイオード経由)で持ち込む「ポータブル・ライブラリ」を構築する。
実践:Berkshelfによる依存関係の完全封じ込め
開発環境(インターネット接続可)で以下の設定を行い、全依存物をディレクトリにエクスポートする。
Berksfile
source ‘https://supermarket.chef.io’
閉域網のOSに合わせてプラットフォームを指定するのを忘れるな
cookbook ‘apache2’, ‘~> 8.0’
cookbook ‘ntp’, ‘~> 3.0’
実行コマンド
依存関係を vendor/cookbooks にすべて書き出す
$ berks vendor ./vendor/cookbooks
これをアーカイブし、閉域網内の `Chef Supermarket` へアップロードする。これで、「依存関係エラー」という悪夢とは決別できる。
—
3. Chef Workstationを「神」にする設定
チームの生産性は、Workstationの練度で決まる。IDE(VS Code)を最強のインフラIDEに昇華させろ。
推奨プラグイン
1. Chef (by Chef Software): 言わずもがな。Lintingとドキュメント参照の要。
2. YAML/JSON Language Support: スキーマ定義を即座にバリデーションする。
3. GitLens: コードの履歴だけでなく、責任の所在を可視化する。
チーム開発を加速させる `knife.rb` のベストプラクティス
個人の環境に依存させないため、プロジェクトルートに設定を配置し、環境変数 `KNIFE_HOME` で切り替えるのが定石だ。
.chef/knife.rb
チームで共有する設定ファイル
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name ENV[‘CHEF_USER’] # 個人認証は環境変数に依存
client_key “#{ENV[‘HOME’]}/.chef/#{ENV[‘CHEF_USER’]}.pem”
chef_server_url “https://chef-server.internal.local/organizations/my-org”
Cookbookの保存先をプロジェクト配下に固定
cookbook_path [“#{current_dir}/../cookbooks”]
SSL検証は閉域網内の自己署名証明書を信頼させる
ssl_verify_mode :verify_peer
trusted_certs_dir “#{current_dir}/trusted_certs”
—
4. 冪等性を極める:現場で震えるほど役立つテクニック
閉域網では、一度の実行失敗が命取りになる。Chefの冪等性を担保するために、以下のルールを徹底せよ。
Rule 1: `not_if` / `only_if` を「防壁」として使う
リソースの実行条件を厳密に定義する。
パッケージの二重インストールを防ぐだけでなく、設定の整合性も担保
execute ‘install-proprietary-binary’ do
command ‘tar xzf /tmp/binary.tar.gz -C /opt/app’
# バイナリが存在し、かつバージョンが正しい場合はスキップさせる
not_if { File.exist?(‘/opt/app/bin/app’) && system(‘/opt/app/bin/app –version | grep 1.2.3’) }
end
Rule 2: テンプレートのバリデーションをCIに組み込め
閉域網内にGitLab CI等のRunnerを立て、`foodcritic` や `cookstyle` を必ず通せ。
.gitlab-ci.yml (閉域網内Runner設定)
stages:
- lint
- test
lint_job:
script:
- cookstyle .
- foodcritic .
—
5. テックリードからの提言:隠れたキーボードショートカット
最後に、Chefライフを劇的に高速化するVS Codeのショートカットを授ける。
- `Ctrl + Shift + P` -> `Chef: Generate Cookbook`: 毎回コマンドを打つな。UIから生成して時間を節約しろ。
- `Ctrl + K, F`: コードのインデントを強制的に整形する。Rubyのインデント崩れはChefのバグの温床だ。
- `Alt + Up/Down`: リソースブロックの行移動。複雑な構成ファイルをリファクタリングする際、この直感的操作が思考を止めない。
—
結論
閉域網での運用は「不自由」ではない。「制御」そのものだ。インターネットというブラックボックスがない分、インフラの挙動はすべてあなたのコードに依存する。
`Berkshelf` で依存を閉じ込め、`knife` で通信を統一し、`cookstyle` で品質を強制する。このループを回し続ければ、閉域網はあなたにとって最高の、誰にも邪魔されない「聖域」となる。
さあ、コードを書け。インフラをコードで支配する、その感覚こそがエンジニアの醍醐味だ。