InfoGrab DocsInfoGrab Docs

Runbook

요약

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을 구성하려면 다음 단계를 따릅니다.

  1. JupyterHub 용 OAuth 애플리케이션을 생성합니다.

  2. 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
    
  3. JupyterHub 설치가 완료되면 브라우저에서 Jupyter Hostname을 엽니다. Sign in with GitLab 버튼을 선택해 JupyterHub에 로그인하고 서버를 시작합니다. OAuth2를 사용하는 GitLab 인스턴스의 모든 사용자에게 인증이 적용됩니다. 이 버튼을 선택하면 JupyterHub가 GitLab 계정을 사용하도록 승인을 요청하는 GitLab 페이지로 이동합니다.

    Jupyter가 GitLab 계정에 액세스할 수 있도록 권한을 요청하는 인증 대화 상자.

  4. Authorize를 선택하면 GitLab 이 JupyterHub 애플리케이션으로 이동시킵니다.

  5. Start My Server를 선택하면 몇 초 안에 서버가 시작됩니다.

  6. Runbook 이 GitLab 프로젝트에 접근하도록 구성하려면 데모 Runbook의 Setup 섹션에 GitLab 액세스 토큰과 프로젝트 ID를 입력해야 합니다.

    1. 왼쪽 패널에 있는 DevOps-Runbook-Demo 폴더를 선택합니다.

      파일 브라우저에서 DevOps-Runbook-Demo 폴더를 보여주는 JupyterHub 런처.

    2. Nurtch-DevOps-Demo.ipynb Runbook을 선택합니다.

      Nurtch-DevOps-Demo.ipynb Runbook이 선택된 JupyterHub 파일 브라우저.

      Jupyter가 화면 오른쪽에 Runbook 내용을 표시합니다. Setup 섹션에는 PRIVATE_TOKEN과 PROJECT_ID가 표시됩니다. 다음과 같이 작은따옴표를 유지한 채 값을 입력합니다.

      PRIVATE_TOKEN = '<your_access_token>'
      PROJECT_ID = '1234567'
      
    3. 이 섹션 마지막 줄의 VARIABLE_NAME을 액세스 토큰에 사용하는 변수 이름에 맞게 수정합니다. 이 예시에서 변수 이름은 PRIVATE_TOKEN 입니다.

      VARIABLE_VALUE = project.variables.get('PRIVATE_TOKEN').value
      
  7. 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}
    
    1. Settings > CI/CD > Variables로 이동해 프로젝트에 변수를 생성합니다.

      값이 마스킹된 상태로 프로젝트 CI/CD 변수 페이지에 추가된 데이터베이스 변수.

    2. Save variables를 선택합니다.

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

      데이터베이스 변수로 PostgreSQL 쿼리를 실행하고 결과를 보여주는 Jupyter Notebook.

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

Runbook

GitLab v19.5
Tier: Free, Premium, Ultimate
Offering: 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을 구성하려면 다음 단계를 따릅니다.

  1. JupyterHub 용 OAuth 애플리케이션을 생성합니다.

  2. 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
    
  3. JupyterHub 설치가 완료되면 브라우저에서 Jupyter Hostname을 엽니다. Sign in with GitLab 버튼을 선택해 JupyterHub에 로그인하고 서버를 시작합니다. OAuth2를 사용하는 GitLab 인스턴스의 모든 사용자에게 인증이 적용됩니다. 이 버튼을 선택하면 JupyterHub가 GitLab 계정을 사용하도록 승인을 요청하는 GitLab 페이지로 이동합니다.

    Jupyter가 GitLab 계정에 액세스할 수 있도록 권한을 요청하는 인증 대화 상자.

  4. Authorize를 선택하면 GitLab 이 JupyterHub 애플리케이션으로 이동시킵니다.

  5. Start My Server를 선택하면 몇 초 안에 서버가 시작됩니다.

  6. Runbook 이 GitLab 프로젝트에 접근하도록 구성하려면 데모 Runbook의 Setup 섹션에 GitLab 액세스 토큰과 프로젝트 ID를 입력해야 합니다.

    1. 왼쪽 패널에 있는 DevOps-Runbook-Demo 폴더를 선택합니다.

      파일 브라우저에서 DevOps-Runbook-Demo 폴더를 보여주는 JupyterHub 런처.

    2. Nurtch-DevOps-Demo.ipynb Runbook을 선택합니다.

      Nurtch-DevOps-Demo.ipynb Runbook이 선택된 JupyterHub 파일 브라우저.

      Jupyter가 화면 오른쪽에 Runbook 내용을 표시합니다. Setup 섹션에는 PRIVATE_TOKEN과 PROJECT_ID가 표시됩니다. 다음과 같이 작은따옴표를 유지한 채 값을 입력합니다.

      PRIVATE_TOKEN = '<your_access_token>'
      PROJECT_ID = '1234567'
      
    3. 이 섹션 마지막 줄의 VARIABLE_NAME을 액세스 토큰에 사용하는 변수 이름에 맞게 수정합니다. 이 예시에서 변수 이름은 PRIVATE_TOKEN 입니다.

      VARIABLE_VALUE = project.variables.get('PRIVATE_TOKEN').value
      
  7. 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}
    
    1. Settings > CI/CD > Variables로 이동해 프로젝트에 변수를 생성합니다.

      값이 마스킹된 상태로 프로젝트 CI/CD 변수 페이지에 추가된 데이터베이스 변수.

    2. Save variables를 선택합니다.

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

      데이터베이스 변수로 PostgreSQL 쿼리를 실행하고 결과를 보여주는 Jupyter Notebook.

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