GitLab Runner에서 임의의 SSH 연결을 원합니다.

3396 단어 GitLab
GitLab Runner(job 안)에서 배포처에 SSH에 들어가서 즐겁게 하고 싶을 때 사용합니다.

docker 이미지를 사용하고 있지만, 이번 작업에서는 docker일 필요는 없습니다.

개인 키 생성


ssh-keygen -t rsa -b 4096 -f id_rsa_deploy

생성된 id_rsa_deploy(비밀 키)와 id_rsa_deploy.pub(공개 키)는 나중에 사용합니다.

개인 키를 GitLab 환경 정보로 설정



그룹 또는 프로젝트의 Settings→CI/CD→Variable에서 설정. Type은 File로 해두고, Value에 비밀키의 내용을 완전히 붙인다.



GitLab Runner에서 연결할 authorized_keys에 쓰기



공개 키의 내용을 GitLab Runner에서 연결할 대상(예를 들어, 발판 서버 등)의 authorized_keys에 작성하여 연결할 수 있도록 합니다. key의 대문자 소문자는 구별하므로 주의.
ssh-rsa AAAAB3Nza...OA9w== mydeploykey

열쇠가 누설되면 무엇 되는지 모르기 때문에 불안, 이라고 하는 경우는 ,. 다음과 같이하면 echo 만 할 수 있습니다, 어쩌면.
command="echo SSH Test OK $SSH_ORIGINAL_COMMAND" ssh-rsa AAAAB3Nza...OA9w== mydeploykey
command="..." 환경 변수를 사용하면 ssh 명령의 인수를 받을 수 있지만 공백을 포함하는 하나의 값을 인수에 제공할 때는 주의해야 합니다. 원래 여기까지 한다면 인수를 사용해 처리하는 것은 피하는 편이 좋을 것입니다.

.gitlab-ci.yml 쓰기



이번은 발판을 통해 다른 서버도 조작하고 싶었기 때문에 SSH-Agent를 치고 있습니다만, 필수는 아닙니다.

SSH Agent를 사용하지 않는 경우는 $SSH_ORIGINAL_COMMAND 라고 해도 좋을 것입니다.

포트( ssh -i "$ID_RSA_DEPLOY" -p22 USER@HOST echo hello world )와 -p22USER 를 적절히 교체하십시오.

gitlab-ci.yml
image: docker:19.03.1

services:
  - docker:19.03.1-dind

variables:
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"

deploy_production:
  stage: deploy
  script:
    - apk update && apk add openssh
    - chmod 0400 "$ID_RSA_DEPLOY"
    - eval "$(ssh-agent)"
    - ssh-add "$ID_RSA_DEPLOY"
    - mkdir ~/.ssh/ && chmod 0700 ~/.ssh
    - ssh-keyscan -p22 -H HOST > ~/.ssh/known_hosts
    - ssh -A -p22 USER@HOST echo hello world

일단, known_hosts에 추기하고 있습니다만, 이 흐름 작업에서는 더 이상 무시해도 같은 생각은 합니다.

그리고는 yml 파일을 push하면 ci가 움직이기 시작할 것이다.

고생 포인트


  • docker image는 alpine 계에서 ssh도 git도 없기 때문에 apk로 도입 할 필요가있다
  • 환경 설정으로 작성된 파일의 권한이 0666이므로, 그대로 SSH에서는 사용할 수 없었다 (그래서 chmod 0400으로 하고 있다)
  • knwon_hosts에 등록이 필요하고 HOST가 없기 때문에 만들 필요가있었습니다
  • ~/.ssh/ 를 1행 더하고는 재실행을 반복한 것입니까・・・이것만으로도 10회 정도 흘린 것 같다. 모두가 이렇게 쓰고 있을까 ...

    좋은 웹페이지 즐겨찾기