Ansible × GitHub Actions:インフラの「手作業」を過去の遺物にする、自動化パイプラインの極意
こんにちは。クラウドの世界へようこそ。
日々、サーバーにSSHでログインして「apt update」や設定ファイルの書き換えを行っていませんか?もしそうなら、今日でその「職人芸」は卒業しましょう。
これから紹介するのは、「GitHubにコードをプッシュするだけで、インフラが自動的に最新状態になる」という、エンジニアが手に入れるべき究極の武器です。初心者の方でも、本質さえ掴めば確実に構築できます。一緒に見ていきましょう。
—
1. なぜ「Ansible × GitHub Actions」なのか?
まず、ツールの役割を整理します。
- Ansible: 「インフラの設計図」を書き、それを実行するツールです。「どのパッケージを入れ、どの設定ファイルをどう書くか」を宣言し、冪等性(べきとうせい)――何度実行しても同じ結果になる性質――を担保します。
- GitHub Actions: 「いつ実行するか」を決める司令塔です。「mainブランチにプッシュされたら、Ansibleを動かせ!」という自動化のトリガーを引きます。
この二つを組み合わせることで、「コードがインフラの真実(Single Source of Truth)である」という、モダンなSREの基本原則が完成します。
—
2. 【準備】最も重要なセットアップ
A. SSH鍵の生成と配布
AnsibleはSSH経由でサーバーを操作します。GitHub Actionsからサーバーに安全にログインするために、専用のSSH鍵ペアを作成しましょう。
パスフレーズなしの鍵を生成(CI自動化のため必須)
ssh-keygen -t ed25519 -f deploy_key
生成された公開鍵(`deploy_key.pub`)の中身を、操作対象のサーバーの `~/.ssh/authorized_keys` に追記してください。
B. GitHub Secretsへの登録
秘密鍵(`deploy_key`)をGitHubに直接置くのは厳禁です。GitHubの「Settings」>「Secrets and variables」>「Actions」に以下を登録します。
- `SSH_PRIVATE_KEY`: `deploy_key` の中身
- `SERVER_IP`: 操作対象サーバーのIPアドレス
—
3. 【ハンズオン】HelloWorld:Nginxを自動デプロイする
まずは、サーバーにNginxをインストールする「HelloWorld」を作りましょう。
Ansibleの設計図を書く (`playbook.yml`)
Ansibleの美しさは、やり方ではなく「状態」を記述することにあります。
—
- name: Webサーバーの構築
hosts: all
become: yes # sudo権限で実行
tasks:
- name: Nginxがインストールされている状態にする
apt:
name: nginx
state: present
update_cache: yes
- name: Nginxを起動し、有効化する
service:
name: nginx
state: started
enabled: yes
パイプラインを定義する (`.github/workflows/deploy.yml`)
GitHub Actionsがこのファイルを読み取り、Ansibleを呼び出します。
name: Deploy Infrastructure
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: SSH鍵をセットアップ
run: |
mkdir -p ~/.ssh
echo “${{ secrets.SSH_PRIVATE_KEY }}” > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SERVER_IP }} >> ~/.ssh/known_hosts
- name: Ansibleを実行
run: |
# サーバーをinventoryとして動的に指定
ansible-playbook -i “${{ secrets.SERVER_IP }},” -u root playbook.yml
—
4. なぜこれが最強なのか?
この構成を導入すると、あなたの開発ライフサイクルは劇的に変わります。
1. 冪等性の恩恵: もしサーバーの設定が誰かに書き換えられても、GitHubにプッシュするだけで、Ansibleが「正しい状態」に瞬時に修復してくれます。
2. 属人化の解消: 「あのサーバー、どうやって設定したんだっけ?」という悩みは消滅します。すべての歴史はGitHubのコミットログに残ります。
3. CI/CDの第一歩: これをマスターすれば、次はコンテナ化(Docker)や、Terraformによるクラウド基盤のコード化へとスムーズにステップアップできます。
—
先輩からのアドバイス
初心者が最もハマるのは「SSHの接続エラー」と「権限周り」です。最初はうまくいかなくて当然です。その時は、`ansible-playbook` コマンドに `-vvv` というオプションを付けて実行してみてください。詳細なログが、どこで詰まっているかを雄弁に語ってくれます。
インフラをコードで操る快感を一度味わえば、もう手動でのサーバー操作には戻れなくなりますよ。さあ、まずはこの `playbook.yml` をプッシュすることから始めてみてください。
あなたの自動化ライフが、今日ここから始まります。応援しています!