InfoGrab Docs

Runbook

요약

Runbook은 특정 프로세스(시작, 중지, 디버깅 또는 특정 시스템 문제 해결 등)를 수행하는 방법을 설명하는 문서화된 절차의 모음입니다. Jupyter Notebooks와 Rubix 라이브러리를 사용하면 사용자는 자신만의 실행 가능한 Runbook을 작성하기 시작할 수 있습니다.

Runbook은 특정 프로세스(시작, 중지, 디버깅 또는 특정 시스템 문제 해결 등)를 수행하는 방법을 설명하는 문서화된 절차의 모음입니다.

Jupyter NotebooksRubix 라이브러리를 사용하면 사용자는 자신만의 실행 가능한 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 Notebooks는 데이터 분석, 시각화 및 머신러닝에 사용되는 웹 기반 대화형 프로그래밍 환경을 제공합니다.

Nurtch#

Nurtch는 Rubix 라이브러리를 만든 회사입니다. Rubix는 Jupyter Notebooks 내에서 일반적인 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을 엽니다. GitLab으로 로그인 버튼을 선택하여 JupyterHub에 로그인하고 서버를 시작합니다. 인증은 OAuth2를 통해 GitLab 인스턴스의 모든 사용자에게 활성화되어 있습니다. 이 버튼은 JupyterHub가 GitLab 계정을 사용할 수 있도록 권한을 요청하는 GitLab의 페이지로 리디렉션합니다.

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

  4. 승인을 선택하면 GitLab이 JupyterHub 애플리케이션으로 리디렉션합니다.

  5. 내 서버 시작을 선택하여 몇 초 후에 서버를 시작합니다.

  6. GitLab 프로젝트에 대한 Runbook 액세스를 구성하려면 데모 Runbook의 설정 섹션에 GitLab 액세스 토큰과 프로젝트 ID를 입력해야 합니다:

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

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

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

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

      Jupyter는 화면 오른쪽에 Runbook 내용을 표시합니다. 설정 섹션에는 PRIVATE_TOKENPROJECT_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의 Notebook에서 SQL 쿼리 실행 섹션을 사용하여 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. 설정 > CI/CD > 변수로 이동하여 프로젝트에 변수를 만듭니다.

      GitLab 변수

    2. 변수 저장을 선택합니다.

    3. Jupyter에서 Notebook에서 SQL 쿼리 실행 제목을 선택한 다음 실행을 선택합니다. 결과는 다음과 같이 인라인으로 표시됩니다:

      PostgreSQL 쿼리

셸 스크립트 실행이나 Kubernetes 클러스터와의 상호작용과 같은 다른 작업을 시도할 수 있습니다. 자세한 내용은 Nurtch 문서를 방문하세요.

Runbook

Tier: Free, Premium, Ultimate
Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
원문 보기
요약

Runbook은 특정 프로세스(시작, 중지, 디버깅 또는 특정 시스템 문제 해결 등)를 수행하는 방법을 설명하는 문서화된 절차의 모음입니다. Jupyter Notebooks와 Rubix 라이브러리를 사용하면 사용자는 자신만의 실행 가능한 Runbook을 작성하기 시작할 수 있습니다.

Runbook은 특정 프로세스(시작, 중지, 디버깅 또는 특정 시스템 문제 해결 등)를 수행하는 방법을 설명하는 문서화된 절차의 모음입니다.

Jupyter NotebooksRubix 라이브러리를 사용하면 사용자는 자신만의 실행 가능한 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 Notebooks는 데이터 분석, 시각화 및 머신러닝에 사용되는 웹 기반 대화형 프로그래밍 환경을 제공합니다.

Nurtch#

Nurtch는 Rubix 라이브러리를 만든 회사입니다. Rubix는 Jupyter Notebooks 내에서 일반적인 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을 엽니다. GitLab으로 로그인 버튼을 선택하여 JupyterHub에 로그인하고 서버를 시작합니다. 인증은 OAuth2를 통해 GitLab 인스턴스의 모든 사용자에게 활성화되어 있습니다. 이 버튼은 JupyterHub가 GitLab 계정을 사용할 수 있도록 권한을 요청하는 GitLab의 페이지로 리디렉션합니다.

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

  4. 승인을 선택하면 GitLab이 JupyterHub 애플리케이션으로 리디렉션합니다.

  5. 내 서버 시작을 선택하여 몇 초 후에 서버를 시작합니다.

  6. GitLab 프로젝트에 대한 Runbook 액세스를 구성하려면 데모 Runbook의 설정 섹션에 GitLab 액세스 토큰과 프로젝트 ID를 입력해야 합니다:

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

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

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

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

      Jupyter는 화면 오른쪽에 Runbook 내용을 표시합니다. 설정 섹션에는 PRIVATE_TOKENPROJECT_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의 Notebook에서 SQL 쿼리 실행 섹션을 사용하여 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. 설정 > CI/CD > 변수로 이동하여 프로젝트에 변수를 만듭니다.

      GitLab 변수

    2. 변수 저장을 선택합니다.

    3. Jupyter에서 Notebook에서 SQL 쿼리 실행 제목을 선택한 다음 실행을 선택합니다. 결과는 다음과 같이 인라인으로 표시됩니다:

      PostgreSQL 쿼리

셸 스크립트 실행이나 Kubernetes 클러스터와의 상호작용과 같은 다른 작업을 시도할 수 있습니다. 자세한 내용은 Nurtch 문서를 방문하세요.