GitHub Actionsでシステム管理を自動化する方法

GitHub Actionsの概要

GitHub Actionsは、コードプッシュやスケジュール、外部イベントによってトリガーされる自動化プロセスを定義できるサービスです。システム管理者にとっては、繰り返し行われるタスクをコード化し、自動化することが可能です。

ワークフローの構成要素


name: ワークフロー名
on: トリガー条件  # 例: push, scheduleなど
jobs:  # ジョブのリスト
  ジョブ名:  
    runs-on: 実行環境  # 例: ubuntu-latest
    steps:  # ステップのリスト
      - name: ステップ名
        uses: アクション参照  # 再利用可能なアクション
        with: パラメータ設定

シナリオ1: サーバー設定の検証

Ansibleを使用してサーバー設定の検証を行います。


name: 設定検証ワークフロー
on:
  schedule:
    - cron: '0 0 * * *'  # 毎日UTC午夜に実行
jobs:
  validation:
    runs-on: ubuntu-latest
    steps:
      - name: コード取得
        uses: actions/checkout@v2
      
      - name: Ansibleインストール
        run: sudo apt-get update && sudo apt-get install -y ansible
      
      - name: 設定検証実行
        run: ansible-playbook -i inventory setup-validation.yml
        env:
          ANSIBLE_HOST_KEY_CHECKING: 'false'
          ANSIBLE_VAULT_PASSWORD_FILE: .vault-pass

シナリオ2: 自動バックアップとログアーカイブ

Resticを使用して定期的にデータをバックアップし、オブジェクトストレージに同期します。


name: バックアップワークフロー
on:
  schedule:
    - cron: '30 2 * * *'  # 毎日2時30分に実行
jobs:
  backup:
    runs-on: ubuntu-latest
    steps:
      - name: Resticインストール
        run: |
          curl -fsSL https://restic.net/install.sh | sudo bash
      
      - name: バックアップ実行
        run: |
          restic backup /path/to/data \
            --repo s3:s3.amazonaws.com/my-bucket \
            --password-command "echo $RESTIC_PASSWORD"
        env:
          RESTIC_PASSWORD: ${{ secrets.RESTIC_PASSWORD }}
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}

シナリオ3: Dockerイメージのビルドとプッシュ

Buildxを使用してマルチプラットフォーム対応のDockerイメージをビルドし、プライベートレジストリにプッシュします。


name: Dockerイメージビルドワークフロー
on:
  push:
    branches: [ main ]
    paths: [ 'docker/**' ]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: コード取得
        uses: actions/checkout@v2
      
      - name: Buildxセットアップ
        uses: docker/setup-buildx-action@v2
      
      - name: レジストリログイン
        uses: docker/login-action@v2
        with:
          registry: myregistry.com
          username: ${{ secrets.REGISTRY_USERNAME }}
          password: ${{ secrets.REGISTRY_PASSWORD }}
      
      - name: ビルドとプッシュ
        uses: docker/build-push-action@v3
        with:
          context: ./docker
          push: true
          tags: myregistry.com/my-image:latest

シナリオ4: インフラストラクチャーモニタリングとアラート

PrometheusとGrafanaを使用してシステムモニタリングを行い、異常時にアラートを発します。


name: モニタリングワークフロー
on:
  schedule:
    - cron: '*/15 * * * *'  # 15分ごとに実行
jobs:
  monitor:
    runs-on: ubuntu-latest
    steps:
      - name: Prometheusエクスポーターインストール
        run: sudo apt-get update && sudo apt-get install -y prometheus-node-exporter
      
      - name: CPU使用率チェック
        run: |
          CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
          if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
            echo "CPU使用率が80%を超えています: $CPU_USAGE%"
            exit 1
          fi
      
      - name: アラート送信
        if: failure()
        uses: rtCamp/action-slack-notify@v2
        with:
          color: '#FF0000'
          message: "CPU使用率が高すぎます: ${{ job.status }}"
          webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}

シナリオ5: Terraformによるインフラストラクチャデプロイ

Terrateamを使用してGitOpsワークフローを実現し、クラウドリソースを自動的にデプロイします。


name: Terraformデプロイワークフロー
on:
  push:
    branches: [ main ]
    paths: [ 'terraform/**' ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: コード取得
        uses: actions/checkout@v2
      
      - name: Terraformインストール
        uses: hashicorp/setup-terraform@v2
        with:
          terraform_version: 1.6.0
      
      - name: Terraform初期化
        run: terraform init
        working-directory: ./terraform
      
      - name: Terraformバリデーション
        run: terraform validate
        working-directory: ./terraform
      
      - name: Terraform適用
        run: terraform apply -auto-approve
        working-directory: ./terraform
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

ワークフローテンプレートとベストプラクティス

  • 複雑なワークフローを制御するためにneedsキーワードを使用する。
  • matrix戦略を使用して異なる環境でテストを並列実行する。
  • actions/cacheを使用して依存関係のインストールを高速化する。
  • 機密情報を管理するためにGitHub Secretsを使用する。

タグ: GitHub Actions ansible Restic Docker Prometheus

7月25日 22:46 投稿