概要
- GitLab CIからSSHでデプロイ先サーバーへ接続したい
- 接続した後、デプロイ先サーバーでコマンドを実行したい
ローカルマシーンで秘密鍵と公開鍵を生成
# 鍵の生成
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa
# 公開鍵
cat ~/.ssh/id_rsa.pub
# 秘密鍵
cat ~/.ssh/id_rsa
デプロイ先のサーバーマシンにSSH接続して authorized_keys に公開鍵を登録
cd .ssh
vi authorized_keys
Gitlabで秘密鍵を登録
-
プロジェクトの「Settings」→「CI/CD」→「Variable」から「Add variable」をクリック
-
Key
は後に.gitlab-ci.yml
で変数名として使用
YAMLファイルを編集する
- プロジェクトの「CI/CD」→「Editor」からYAMLファイルを編集
パターン1
variables:
# 先ほど登録したkeyの名前
SSH_PRIVATE_KEY: $SSH_PRIVATE_KEY
stages:
- deploy
deploy:
stage: deploy
before_script:
- 'command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
- ssh -tt host@10.10.20.20 -i ~/.ssh/id_rsa -C ". test_run.sh &"
パターン2
variables:
# 先ほど登録したkeyの名前
SSH_PRIVATE_KEY: $SSH_PRIVATE_KEY
stages:
- deploy
deploy:
stage: deploy
before_script:
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo "$SSH_PRIVATE_KEY" >> ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- eval "$(ssh-agent -s)"
- ssh-add ~/.ssh/id_rsa
- ssh-add -l
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
script:
- ssh -tt host@10.10.20.20 -i ~/.ssh/id_rsa -C ". test_run.sh &"
※書き方を変えても結果はどちらも一緒
ssh -tt host@10.10.20.20 -i ~/.ssh/id_rsa -C ". test_run.sh &"
-
-C
を付けることで、サーバーにログインした後のコマンド操作を可能にする(今回はシェルスクリプトの中に実行したいコマンドを記載) - gitlab ciのセッションは1時間で切れてしまうため、もしスクリプト実行に1時間以上かかる場合は、
&
を付けてプログラムをバックエンドで動かす - のちログを見たい場合はスクリプト内にloggerを入れてファイル出力できるようにしておく
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s | %(levelname)s | %(message)s')
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.DEBUG)
stdout_handler.setFormatter(formatter)
file_handler = logging.FileHandler('debug.log')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(stdout_handler)
追記
&
でうまくいかない場合は、screen
コマンドを使うと良い
- ssh -tt host@10.10.20.20 -i ~/.ssh/id_rsa -C "screen -dmS perf bash test_run.sh"