こんにちは。インフラの世界へようこそ。
「手動でサーバーにログインして設定ファイルを書き換える」。かつては当たり前だったこの作業は、今や「技術的負債」の象徴です。現代のSREにとって、インフラは「コードとして定義され、自動的に展開されるもの」でなければなりません。
今回は、Chefという「構成管理の重鎮」を、GitHub Actionsという「現代の自動化エンジン」で動かし、インフラ構築を完全自動化する極意を伝授します。これをマスターすれば、あなたのサーバーは常にクリーンで、再現性の高い状態を保てるようになります。
—
1. インフラCI/CDの全体像:なぜ「自動化」が必要なのか
インフラのCI/CD(継続的インテグレーション/継続的デリバリー)とは、「コードを変更した瞬間、それがテストされ、本番環境に安全に反映される一連の流れ」のことです。
- GitHub Actionsの役割: 監視者であり、実行者です。コードの品質をチェックし、問題がなければChef Serverへ指示を飛ばします。
- Chefの役割: 実行官です。Chef Serverが各ノード(サーバー)に対し、「あるべき状態」を強制的に適用します。
この連携により、「誰がやったか分からない変更」や「手動設定のミス」を根絶します。
—
2. 第一歩:Cookbookの品質を担保する(GitHub Actions)
コードを適用する前に、まずは「書き方」をチェックしましょう。`Cookstyle`(Chefの標準リントツール)を使えば、ベストプラクティスから外れたコードを自動で警告してくれます。
`.github/workflows/lint.yml` を作成します。
name: Chef Lint
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Chef Workstation
uses: actionshub/chef-install@v2 # Chef開発環境のセットアップ
- name: Run Cookstyle
run: cookstyle . # コードの静的解析を実行
ここがプロの視点:
テストが通らないコードをマージさせないこと。これが「壊れないインフラ」を作るための鉄則です。
—
3. mainマージ後の自動デプロイフロー
コードがマージされたら、次はChef Serverへアップロードします。ここで必要なのが `knife` コマンドの設定です。
シークレット情報の管理
`knife.rb` や `client.pem` などの秘密鍵をリポジトリに含めてはいけません。GitHubの [Settings] > [Secrets and variables] > [Actions] に、以下の情報を登録してください。
- `CHEF_SERVER_URL`: Chef ServerのAPIエンドポイント
- `CHEF_USER_NAME`: 実行ユーザー名
- `CHEF_USER_KEY`: 秘密鍵の中身(base64エンコード推奨)
自動デプロイ用 Workflow
`.github/workflows/deploy.yml` に以下を記述します。
name: Deploy to Chef Server
on:
push:
branches: [main]
jobs:
upload:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Knife Config
run: |
mkdir -p ~/.chef
echo “${{ secrets.CHEF_USER_KEY }}” > ~/.chef/client.pem
# knife.rbを動的に生成
cat <
chef_server_url “${{ secrets.CHEF_SERVER_URL }}”
node_name “${{ secrets.CHEF_USER_NAME }}”
client_key “${HOME}/.chef/client.pem”
EOF
- name: Upload Cookbook
run: knife cookbook upload -a # 全てのCookbookをChef Serverにアップロード
—
4. HelloWorld的な動作確認:精度を高めるコツ
まずは小さな一歩から始めましょう。特定のCookbookのみを対象に、`chef-client` が実行されるか確認します。
1. テストノードを用意する: 開発環境用のサーバーを1台用意し、`chef-client` をインストールします。
2. ポリシーを設定する: `knife node run_list add <ノード名> “recipe[my_cookbook::default]”` を実行。
3. 適用: Chef Serverに反映されたコードが、ノード上で正しく動くかを確認します。
現場の知見:
初心者が陥りやすい罠は、「一度の変更で全てを変えようとすること」です。まずは「ファイルのパーミッションを設定するだけ」「パッケージを1つインストールするだけ」といった、冪等性(何度実行しても結果が同じになる性質)が明確な小さなレシピから書き始めてください。
—
最後に:あなたへのアドバイス
ChefとGitHub Actionsの連携は、最初は複雑に見えるかもしれません。しかし、一度この仕組みを構築してしまえば、あなたは「サーバーにログインして作業する」という低レイヤーな作業から解放されます。
「自動化とは、一度書いたコードを信じること」です。
テストをパスし、自動でデプロイされたインフラを眺める瞬間、あなたはエンジニアとして一つ上のステージに登ったことを実感するはずです。何か詰まったら、いつでも戻ってきてください。また次の深淵を覗きに行きましょう。