LoginSignup
6
2

More than 1 year has passed since last update.

GitLab CIからSSHでデプロイ先サーバーへ接続し、デプロイ先サーバーでコマンドを実行するときの備忘録

Last updated at Posted at 2022-11-20

概要

  • 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」をクリック

  • 先ほど生成した秘密鍵を登録する
    image.png

  • Key は後に.gitlab-ci.ymlで変数名として使用

  • このとき、TypeVariableにすること!!
    image.png

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" 

完了

image.png

6
2
0

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
6
2