LoginSignup
5

More than 3 years have passed since last update.

Github Actionsを使ってansible-playbookを実行する

Posted at

概要

Github Actionsを使ってbranchへのpush/PRでansible-playbookによるデプロイをフックする。SSH周りで結構ハマった。

コード

github/workflows/main.yml
name: CI
on:
  push:
    branches: [ staging ]
  pull_request:
    branches: [ staging ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Run ansible playbook
      env:
        PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
      run: |
        mkdir -p ~/.ssh
        echo "$PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
        chmod 700 ~/.ssh/id_rsa
        eval $(ssh-agent -s)
        ssh-add ~/.ssh/id_rsa
        ssh-keyscan -p 22 -H "your.domain.com" >> ~/.ssh/known_hosts # 22の場合は明記しなくても良い
        cd ansible
        ansible-playbook -i hosts/staging site.yml --private-key ~/.ssh/id_rsa

手順

ansibleファイルはリポジトリ中に以下のように定義されているとする。このリポジトリのstagingブランチへのpush/PRでフックする。

├──ansible
│   ├── ansible.cfg
│   ├── hosts
│   │   └── staging
│   ├── roles
│   │   └── deploy
│   │       └── tasks
│   │           └── main.yml
│   └── site.yml
├──... 
...

ssh-keygenでキーペアを作成し配置

以下でキーペアを作成し、公開鍵をscpなりでデプロイ先のサーバーに配置する。

ssh-keygen -t rsa -b 4096 -m PEM

PEMで作成されてないと以下のエラーが出る。

Error loading key "/home/runner/.ssh/id_rsa": invalid format

既に作成してしまった場合は変換する。秘密鍵だけ変換すれば良い。

ssh-keygen -p -m PEM -f id_rsa

リポジトリに秘密鍵を登録する。

リポジトリのsettingsからいける。権限がないと見れないので注意。詳しくはドキュメント参照。
.github/workflows/main.yml から参照する環境変数名と合わせる。上のコードの場合は PRIVATE_KEY という名前で登録する。

ブランチに.github以下をpush

.github以下のディレクトリ/ファイルを作成してpushする。上のコードの場合は以下を改変する必要がある。

  • your.domain.or.ipを自分のサーバー or IPに変更する
  • (SSHのポートを変更している場合は)ssh-keyscanのポートを変更する

Actionsの新しく作成から作っても良い。今回は手元で作成してstagingブランチにpushした。するとActionsから結果が見れる。

備考

  • ansibleはもともとubuntu-latest(現時点で20.04)に入っているので動く。でもバージョン固定はした方がいいかもしれない。( インストール済みパッケージ一覧 )
  • SSH周りでハマったときは一回自分でログインしてみると良い。環境変数名のタイポで結構ハマってたことが発覚した。
  • この記事には鍵の改行を"\n"で置換していたが自分は必要なかった
  • 手元で鍵を使ってログインできるが、CIではダメなときはknown_hosts周りと考えられるのでansible-playbookのオプションで--ssh-common-args="-o StrictHostKeyChecking=no"とかを足すと良いかも(参考1, 参考2)
  • これも参考になる

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5