Puppet Bolt:エージェントレスで解き放つ、モダンIaCの「機動力」
インフラエンジニアの諸君、まだ全サーバーにPuppet Agentを常駐させ、カタログのコンパイルを待ちわびているのか?
大規模環境での構成管理において、Puppetは最強の武器だが、エージェント型は時に足枷となる。デプロイ直前の緊急パッチ適用、あるいは数十台の検証サーバーへの一時的な設定変更。これらにおいて、エージェントのポーリング間隔や証明書の更新に悩まされるのは過去の遺物だ。
今日は、Puppet Boltを使って、既存のPuppet資産を一切捨てずに「即時・並列・エージェントレス」なアドホック管理を実現する、現場の最前線で磨き上げた知見を共有する。
—
1. なぜ今、Puppet Boltなのか?
Boltの本質は「SSH/WinRMを通じた純粋な実行エンジン」だ。PuppetのDSL(Manifest)資産をそのまま再利用しつつ、エージェントレスという「軽さ」を手に入れる。
導入の「神」設定:`.bolt.yaml`
プロジェクトのルートに以下の設定を置くことで、チーム間の環境差異を撲滅せよ。
.bolt.yaml – チーム開発の標準化ルール
inventoryfile: inventory.yaml
SSH接続時のタイムアウトを短縮し、反応速度を上げる
ssh:
host-key-check: false # 社内LANなら許容範囲、必要に応じてstrictに
connect-timeout: 5
実行結果をJSONで出力させ、後続のCI/CDパイプラインと連携させる
format: json
—
2. 実践:既存マニフェストを「エージェントレス」で流し込む裏技
Boltの真骨頂は、`puppet apply`をリモートへ「転送して実行」する機能にある。既存のクラスを特定のノードにだけ適用したい? ならばこう書け。
コマンド例:
既存のPuppetモジュールを直接対象ノードに適用する
bolt apply -t web_servers -e “include role::web_server”
これだけで、対象ノードへ必要なモジュールが一時的に転送され、適用される。エージェントが「設定をプルする」のを待つ必要はない。PUSH型で制御する、これがスピードの正体だ。
—
3. 現場を救う「タスク並列実行」の極意
数十台のサーバーに対して、一気に設定を流し込む際、デフォルト設定のままでは「直列処理」による地獄の待ち時間が発生する。`–concurrency`を制する者が時間を制する。
100台のサーバーに並行してセキュリティアップデートを流し込む
bolt task run package::update action=upgrade –targets web_nodes –concurrency 20
プロの小技:
`.bolt.yaml`やコマンドライン引数で並列数を調整する際、ターゲットのスペックとネットワーク帯域を考慮せよ。I/O負荷が高いタスクなら `10` 前後、単なる設定変更なら `50` 以上でもSSHは耐える。
—
4. チーム開発の生産性を底上げする「神プラグイン」と設定
VS Code用「Puppet Extension」を使い倒せ
Puppetの公式拡張を入れるだけでは甘い。`bolt`コマンドと統合し、以下の設定を`.vscode/settings.json`に追記せよ。
{
“puppet.editorService.enabled”: true,
“puppet.lint.enabled”: true,
// 保存時にマニフェストの構文チェックを自動実行させる
“editor.codeActionsOnSave”: {
“source.fixAll”: true
}
}
隠れたキーボードショートカット(Bolt運用)
ターミナルでの作業効率を極限まで高めるには、`history`の検索(`Ctrl+R`)に加え、Boltのコマンドをエイリアス化して `fzf` と組み合わせよ。
.zshrc に記述するエイリアスの例
alias br=’bolt task run’
alias ba=’bolt apply’
ターゲットを動的に選択してBoltを実行する魔法
alias bselect=’bolt task run uptime –targets $(bolt inventory show | fzf)’
—
5. ベストプラクティス:構成管理の「疎結合化」
大規模チームで最も避けるべきは、巨大なモノリスなインベントリファイルだ。以下のディレクトリ構成が、拡張性を維持する唯一の正解である。
.
├── inventory.yaml # 環境ごとの接続情報
├── modules/ # 公開/自作モジュール
├── tasks/ # Bolt専用のJSONベースタスク
└── plans/ # 複数のタスクを連結するオーケストレーション
JSONタスクの書き方(ベストプラクティス):
シェルスクリプトをベタ書きするのではなく、メタデータで型を定義せよ。
// tasks/deploy.json
{
“puppet”: “task”,
“description”: “アプリのデプロイを実行する”,
“parameters”: {
“version”: { “type”: “String”, “description”: “デプロイするバージョン” }
}
}
—
最後に:SREとして生き残るために
Puppet Boltは、単なるPuppetの補助ツールではない。「宣言的な構成管理」と「命令的なスピード」を両立させるためのブリッジだ。
エージェントを入れられないレガシーな資産、あるいはクラウド上の使い捨てインスタンス。これらを「管理対象外」として放置するのではなく、Boltというツールを使って「今すぐ・確実に・自動で」制御下に置く。
道具は使い手を選ぶのではない。使い手が道具の限界を押し広げるのだ。
今日から、あなたのインフラを「待たせない構成管理」へと進化させろ。健闘を祈る。