GitHub Actions × Ansible:泥臭い手作業を「コードの力」で絶滅させるための極限CI/CD構築術
インフラエンジニアの諸君。まだ「手元の端末から `ansible-playbook` を叩く」という原始的な儀式を続けているのか?
その作業、今日で終わりにしよう。CI/CDパイプラインを構築することは、単なる自動化ではない。「インフラの状態をGitに正解として定義し、人間の介在によるミスを物理的に排除する」という、SREとしての規律そのものだ。
本稿では、GitHub Actionsを活用して、Gitプッシュをトリガーにリモートサーバーを自動構成する「止められないインフラ」の作り方を伝授する。
—
1. 脳死で設定すべき「鉄壁のセキュリティ」とSSHの極意
まず、絶対にやってはならないのが「公開鍵をリポジトリに含める」ことだ。SSH鍵はGitHubの `Settings > Secrets and variables > Actions` に格納せよ。
SSH Agentの魔法
毎回 `ssh-add` する必要はない。GitHub Actionsの `webfactory/ssh-agent` を使えば、ワークフロー実行時のみメモリ上に鍵がロードされる。
.github/workflows/deploy.yml
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
プロの小技: 接続先の `known_hosts` を毎回手動管理するのはナンセンスだ。Ansible実行時のSSH接続で `StrictHostKeyChecking=no` を一時的に指定する設計にするか、あるいは初期構築時に `ssh-keyscan` で登録するフローをパイプラインに組み込め。
—
2. 現場を救う「最強のディレクトリ構成」とベストプラクティス
Ansibleの構成は、規模が大きくなると必ず破綻する。最初から「Roleベースのモジュール化」を強制せよ。
.
├── group_vars/ # 環境ごとの変数(all, prod, staging)
├── roles/
│ └── common/ # 全サーバー共通設定
│ └── web-server/ # アプリケーション固有設定
├── site.yml # エントリポイント
└── inventory.ini # インベントリ(動的生成が理想)
チーム開発における「絶対のルール」
1. 変数にハードコードを許すな: IPアドレスやパスワードは必ず `group_vars` に逃がせ。
2. `ansible.cfg` の共有: プロジェクトルートに配置し、SSHパイプライン設定などをチームで統一せよ。
[defaults]
# 出力を人間が読みやすくする神設定
stdout_callback = yaml
# パフォーマンス向上のためのパイプライン化
pipelining = True
—
3. 実践:GitHub Actions での Ansible 実行フロー
単にコマンドを叩くだけでは、冪等性が崩れた瞬間に死ぬ。必ず `–check` モードでのテストを組み込むのがSREの嗜みだ。
- name: Run Ansible Playbook
run: |
# 冪等性の検証(ドライラン)
ansible-playbook -i inventory.ini site.yml –check
# 実際の適用
ansible-playbook -i inventory.ini site.yml
—
4. 生産性を極限まで高める「神ツール・設定」
開発スピードを劇的に上げるために、今すぐこれらを導入しろ。
① VS Code プラグイン「Ansible」
Red Hat公式のAnsible拡張を入れるだけで、構文ハイライトとLintチェックがリアルタイムで行われる。YAMLのインデント地獄から解放される唯一の手段だ。
② `ansible-lint` をCIに強制注入せよ
コードレビューで「インデントが…」と指摘するのは時間の無駄だ。GitHub Actionsで `ansible-lint` を走らせ、Lintが通らないコードはマージ不能にする設定をGitHubのBranch Protection Rulesで強制せよ。
- name: Linting
run: ansible-lint roles/
③ 隠れたキーボードショートカット(VS Code)
- `Ctrl + Shift + P` -> `YAML: Toggle folding` : 巨大なYAMLを構造単位で折りたたみ、全体像を瞬時に把握する。
- `Alt + 上下キー`: 行の移動。Ansibleのタスク順序を入れ替える際、マウスを使うのは素人だ。
—
5. 最後に:インフラを「コード」として愛せ
自動化の本質は、デプロイを速くすることではない。「何度やり直しても、同じ結果が得られる」という信頼(Trust)をシステムに組み込むことだ。
GitHub ActionsとAnsibleを組み合わせたこのパイプラインは、君たちのインフラを「触るのが怖いブラックボックス」から「何度でも書き換え可能なキャンバス」へと進化させる。
さあ、今すぐこのYAMLをリポジトリにコミットし、手動デプロイという名の「負債」を消し去れ。健闘を祈る。