Runbook
GitLab v19.5Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
요약
Runbook은 특정 시스템을 시작하거나 중지하거나 디버깅하거나 문제를 해결하는 등 특정 프로세스를 수행하는 방법을 문서로 정리한 절차 모음입니다. Jupyter Notebook과 Rubix 라이브러리를 사용하면 직접 실행 가능한 Runbook을 작성할 수 있습니다.
Runbook은 특정 시스템을 시작하거나 중지하거나 디버깅하거나 문제를 해결하는 등 특정 프로세스를 수행하는 방법을 문서로 정리한 절차 모음입니다.
Jupyter Notebook과 Rubix 라이브러리를 사용하면 직접 실행 가능한 Runbook을 작성할 수 있습니다.
전통적으로 Runbook은 조건이나 시스템에 따라 의사 결정 트리 형태이거나 단계별 상세 가이드 형태였습니다.
최근 구현에서는 「실행 가능한 Runbook」 개념이 도입되어, 잘 정의된 프로세스와 함께 운영자가 미리 작성한 코드 블록이나 데이터베이스 쿼리를 특정 환경에서 실행할 수 있습니다.
실행 가능한 Runbook#
GitLab Kubernetes 통합과 함께 제공되는 JupyterHub 애플리케이션에는 Nurtch Rubix 라이브러리가 포함되어 있어 DevOps Runbook을 간단하게 만들 수 있습니다. 일반적인 작업을 보여 주는 샘플 Runbook도 제공됩니다. Rubix를 사용하면 일반적인 Kubernetes 및 AWS 워크플로를 쉽게 만들 수 있지만, Rubix 없이 직접 만들 수도 있습니다.
GitLab에서 이를 구현하는 방법에 대한 개요는 이 영상을 참고합니다.
요구 사항#
실행 가능한 Runbook을 만들려면 다음이 필요합니다.
- Kubernetes - 나머지 애플리케이션을 배포하려면 Kubernetes 클러스터가 필요합니다. Kubernetes 용 GitLab 에이전트로 클러스터를 연결하는 것이 가장 간단한 방법입니다.
- Ingress - Ingress는 로드 밸런싱, SSL 종료, 이름 기반 가상 호스팅을 제공합니다. 애플리케이션의 웹 프록시 역할을 합니다.
- JupyterHub - JupyterHub는 팀 전체의 노트북을 관리하는 다중 사용자 서비스입니다. Jupyter Notebook은 데이터 분석, 시각화, 머신 러닝에 사용하는 웹 기반 대화형 프로그래밍 환경을 제공합니다.
Nurtch#
Nurtch는 Rubix 라이브러리를 만든 회사입니다. Rubix는 Jupyter Notebook 안에서 일반적인 DevOps 작업을 쉽게 수행하도록 도와주는 오픈 소스 Python 라이브러리입니다. Cloudwatch 지표를 그리거나 ECS/Kubernetes 애플리케이션을 롤링하는 작업이 코드 몇 줄로 줄어듭니다. 자세한 내용은 Nurtch 문서를 참고합니다.
GitLab에서 실행 가능한 Runbook 구성#
앞에서 설명한 구성 요소와 미리 로드된 데모 Runbook을 사용해 GitLab에서 실행 가능한 Runbook을 구성하려면 다음 단계를 따릅니다.
-
JupyterHub 용 OAuth 애플리케이션을 생성합니다.
-
Helm으로 JupyterHub를 설치할 때 다음 값을 사용합니다.
#----------------------------------------------------------------------------- # The hub.config.GitLabOAuthenticator section must be customized! #----------------------------------------------------------------------------- hub: config: GitLabOAuthenticator: # Limit access to members of specific projects or groups or to specific users: # allowedGitlabGroups: [ "my-group-1", "my-group-2" ] # allowedProjectIds: [ 12345, 6789 ] # allowed_users: ["user-1", "user-2"] client_id: OAuth Application ID> client_secret: OAuth Application ID> enable_auth_state: true gitlab_url: https://gitlab.example.com oauth_callback_url: http:// Hostname>/hub/oauth_callback scope: - read_user - read_api - openid - profile - email JupyterHub: authenticator_class: gitlab extraConfig: gitlab-config: | c.KubeSpawner.cmd = ['jupyter-labhub'] c.GitLabOAuthenticator.scope = ['api read_repository write_repository'] async def add_auth_env(spawner): ''' Set user's id, login and access token on single user image to enable repository integration for JupyterHub. See: https://gitlab.com/gitlab-org/gitlab-foss/-/issues/47138#note_154294790 ''' auth_state = await spawner.user.get_auth_state() if not auth_state: spawner.log.warning("No auth state for %s", spawner.user) return spawner.environment['GITLAB_ACCESS_TOKEN'] = auth_state['access_token'] spawner.environment['GITLAB_USER_EMAIL'] = auth_state['gitlab_user']['email'] spawner.environment['GITLAB_USER_ID'] = str(auth_state['gitlab_user']['id']) spawner.environment['GITLAB_USER_LOGIN'] = auth_state['gitlab_user']['username'] spawner.environment['GITLAB_USER_NAME'] = auth_state['gitlab_user']['name'] c.KubeSpawner.pre_spawn_hook = add_auth_env singleuser: defaultUrl: "/lab" image: name: registry.gitlab.com/gitlab-org/jupyterhub-user-image tag: latest lifecycleHooks: postStart: exec: command: - "sh" - "-c" - > git clone https://gitlab.com/gitlab-org/nurtch-demo.git DevOps-Runbook-Demo || true; echo "https://oauth2:${GITLAB_ACCESS_TOKEN}@${GITLAB_HOST}" > ~/.git-credentials; git config --global credential.helper store; git config --global user.email "${GITLAB_USER_EMAIL}"; git config --global user.name "${GITLAB_USER_NAME}"; jupyter serverextension enable --py jupyterlab_git proxy: service: type: ClusterIP -
JupyterHub 설치가 완료되면 브라우저에서 Jupyter Hostname을 엽니다. Sign in with GitLab 버튼을 선택해 JupyterHub에 로그인하고 서버를 시작합니다. OAuth2를 사용하는 GitLab 인스턴스의 모든 사용자에게 인증이 적용됩니다. 이 버튼을 선택하면 JupyterHub가 GitLab 계정을 사용하도록 승인을 요청하는 GitLab 페이지로 이동합니다.

-
Authorize를 선택하면 GitLab 이 JupyterHub 애플리케이션으로 이동시킵니다.
-
Start My Server를 선택하면 몇 초 안에 서버가 시작됩니다.
-
Runbook 이 GitLab 프로젝트에 접근하도록 구성하려면 데모 Runbook의 Setup 섹션에 GitLab 액세스 토큰과 프로젝트 ID를 입력해야 합니다.
-
왼쪽 패널에 있는 DevOps-Runbook-Demo 폴더를 선택합니다.

-
Nurtch-DevOps-Demo.ipynbRunbook을 선택합니다.
Jupyter가 화면 오른쪽에 Runbook 내용을 표시합니다. Setup 섹션에는
PRIVATE_TOKEN과PROJECT_ID가 표시됩니다. 다음과 같이 작은따옴표를 유지한 채 값을 입력합니다.PRIVATE_TOKEN = '<your_access_token>' PROJECT_ID = '1234567' -
이 섹션 마지막 줄의
VARIABLE_NAME을 액세스 토큰에 사용하는 변수 이름에 맞게 수정합니다. 이 예시에서 변수 이름은PRIVATE_TOKEN입니다.VARIABLE_VALUE = project.variables.get('PRIVATE_TOKEN').value
-
-
Runbook의 동작을 구성하려면 변수를 생성하고 설정합니다. 이 예시에서는 샘플 Runbook의 Run SQL queries in Notebook 섹션으로 PostgreSQL 데이터베이스를 조회합니다. 다음 코드 블록의 첫 네 줄은 이 쿼리가 동작하는 데 필요한 변수를 정의합니다.
%env DB_USER={project.variables.get('DB_USER').value} %env DB_PASSWORD={project.variables.get('DB_PASSWORD').value} %env DB_ENDPOINT={project.variables.get('DB_ENDPOINT').value} %env DB_NAME={project.variables.get('DB_NAME').value}-
Settings > CI/CD > Variables로 이동해 프로젝트에 변수를 생성합니다.

-
Save variables를 선택합니다.
-
Jupyter에서 Run SQL queries in Notebook 제목을 선택한 다음 Run을 선택합니다. 결과가 다음과 같이 인라인으로 표시됩니다.

-
셸 스크립트를 실행하거나 Kubernetes 클러스터와 상호 작용하는 등 다른 작업도 시도해 볼 수 있습니다. 자세한 내용은 Nurtch 문서를 참고합니다.