概要
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) - これも参考になる