본문 바로가기
서버구축 (WEB,DB)

Docker Compose를 사용한 AWX 개발 환경 설정

by 날으는물고기 2023. 10. 31.

Docker Compose를 사용한 AWX 개발 환경 설정

시작하기 전에

먼저 AWX 리포지토리를 복제하거나 로컬 복사본을 만들어야 합니다. 일반적으로 AWX의 최신 안정 버전을 사용하는 것이 좋습니다. 최신 안정 버전은 AWX 최신 릴리스 페이지에서 확인할 수 있습니다.

 

최신 안정 태그를 복제하려면 다음 명령어를 사용할 수 있습니다.

git clone -b x.y.z https://github.com/ansible/awx.git

HEAD(또는 최신 커밋)에서 배포하는 것은 안정성이 없으므로 가능하면 피하는 것이 좋습니다. 필요하다면 진행하기 전에 리포지토리를 복제하세요.

환경 개요

Docker Compose로 AWX 개발 환경을 설정하는 데 사용되는 주요 명령어와 파일은 다음과 같습니다.

  • docker-compose-build: 개발 이미지를 빌드하는 데 사용됩니다. 이 이미지는 docker-compose 명령어에서 사용됩니다.
  • docker-compose: 개발 환경을 시작하는 데 사용되는 make 명령어로, awx_devel 이미지와 태그를 전달합니다.

중요한 파일로는 다음이 있습니다.

  • tools/docker-compose/inventory: AWX 개발 환경을 구성하는 데 사용되는 인벤토리 파일입니다.
  • tools/docker-compose/ansible/migrate.yml: 로컬 도커에서 개발 환경으로 데이터를 마이그레이션하는 데 사용되는 플레이북입니다.

사전 요구 사항

AWX를 배포할 호스트에는 다음 사항이 필요합니다.

  • Docker가 설치되어 있어야 합니다. Docker를 설치한 후 Docker 서비스를 시작해야 합니다. 운영 체제에 따라 Docker를 사용하는 로컬 사용자를 docker 그룹에 추가해야 할 수도 있습니다. 자세한 내용은 Docker 문서를 참조하세요.
  • Docker Compose가 설치되어 있어야 합니다.
  • Ansible도 설치되어 있어야 하며, docker-compose에 필요한 파일을 템플릿화하는 데 사용됩니다.
  • OpenSSL도 설치되어 있어야 합니다.

테스트된 운영 체제

docker-compose 개발 환경은 다음 운영 체제에서 정기적으로 사용되며 작동해야 합니다.

  • Fedora (유지되는 버전)
  • Ubuntu LTS (18, 20)
  • Red Hat Enterprise Linux 8, CentOS Stream 8
  • macOS 11

다른 플랫폼에서는 테스트되지 않았으며, 로컬 수정이 필요할 수 있습니다.

구성

인벤토리 파일에서 pg_password, broadcast_websocket_secret, secret_key 및 배포에 필요한 기타 설정을 설정해야 합니다.

 

AWX는 PostgreSQL 데이터베이스에 액세스가 필요하며, 기본적으로 컨테이너 내에서 데이터를 유지합니다. 컨테이너가 중지될 때 데이터 파일은 Docker 볼륨에 계속 남습니다. 외부 데이터베이스를 사용하려면 pg_host, pg_hostnamepg_username을 설정합니다.

 

로컬 도커 설치에서 데이터를 마이그레이션하려면 데이터 마이그레이션 섹션을 참조하세요.

개발 환경 시작

  1. 이미지 빌드

AWX 기본 컨테이너 이미지는 기본 OS 종속성 및 개발 환경에서 서비스를 실행하는 데 도움이 되는 심볼릭 링크를 포함하는 Dockerfile.j2에서 템플릿화된 Dockerfile을 기반으로합니다. 다음 명령어로 이미지를 빌드합니다.

make docker-compose-build

이미지는 Dockerfile.j2 또는 템플릿화된 Dockerfile을 변경하는 경우 다시 빌드해야 합니다. 빌드가 완료되면 로컬 이미지 캐시에 ansible/awx_devel 이미지가 생성됩니다. 이미지 목록을 보려면 docker images 명령어를 사용할 수 있습니다.

(host)$ docker images

REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
ansible/awx_devel                            latest              ba9ec3e8df74        26 minutes ago      1.42GB
  1. 커스텀 Receptor 이미지 생성

개발 환경은 기본적으로 Receptor의 devel 이미지를 사용합니다. 이 이미지는 hop 노드에서 직접 사용되며, Receptor 바이너리는 모든 다른 AWX 노드에서 사용됩니다. 따라서 RECEPTOR_IMAGE 환경 변수를 설정하여 두 개의 명령어로 이미지를 빌드해야 합니다.

 

먼저 Receptor를 체크아웃하고 make receptor_build 명령을 사용하여 빌드합니다.

cd /path/to/receptor
git checkout origin/devel
make docker-image

다음, AWX 리포지토리의 루트 디렉토리로 이동하고 다음 명령어로 receptor_build 작업을 수행합니다.

cd /path/to/awx
make receptor_build
  1. 개발 환경 시작

이제 개발 환경을 시작합니다. AWX, PostgreSQL 및 Redis 컨테이너가 자동으로 시작됩니다. 필요한 이미지가 없으면 다운로드하게 됩니다.

make docker-compose

이 명령을 실행하면 도커 컴포즈가 실행되고 AWX 개발 환경이 설정됩니다. 컨테이너를 시작하고 컨테이너에 연결할 수 있습니다. 컨테이너가 실행 중인 동안 AWX 개발 이미지에 대한 로그 메시지 및 이벤트를 실시간으로 모니터링할 수 있습니다.

 

초기 시작 시 데이터베이스 관련 문제 해결
실행 중에 무한 반복되는 메시지( Waiting for postgres to be ready to accept connections )가 나타나면 다음을 수행해 보세요.

  1. AWX 관련 Docker 컨테이너를 중지하고 삭제합니다.
  2. 연결된 모든 도커 볼륨을 삭제합니다.
  3. 연결된 모든 Docker 네트워크를 삭제합니다.
  4. 처음부터 과정을 반복하세요.

시스템에 AWX 관련 컨테이너 엔터티만 있는 경우 다음 명령을 사용하여 모든 항목을 중지하고 삭제할 수 있습니다.

docker stop $(docker ps -a -q)
docker system prune -a
docker volume prune
docker network prune

(대체 방법) 맞춤형 메시 노드 클러스터로 개발 환경 스핀업
실행 노드와 홉 노드가 있는 클러스터(컨테이너)는 docker-compose Makefile 대상으로 생성될 수 있습니다. 기본적으로 1개의 하이브리드 노드가 생성됩니다. MAIN_NODE_TYPE를 사용하여 하이브리드와 제어 간에 AWX 노드 유형을 전환할 수 있습니다.

MAIN_NODE_TYPE=control EXECUTION_NODE_COUNT=2 COMPOSE_TAG=devel make docker-compose

위 명령을 실행하면 제어 노드 1개, 홉 노드 1개, 실행 노드 2개로 구성된 클러스터가 생성됩니다. 홉 노드는 실행 노드가 1개 이상 있을 때마다 자동으로 생성됩니다.

노드 수는 다음과 같이 변경될 수 있습니다.

CONTROL_PLANE_NODE_COUNT=2 EXECUTION_NODE_COUNT=3 COMPOSE_TAG=devel make docker-compose

그러면 아래에 표시된 토폴로지가 회전됩니다. (이름은 수용자 노드 이름이며 경우에 따라 AWX 인스턴스 이름 및 네트워크 주소와 다릅니다)

                                            ┌──────────────┐
                                            │              │
┌──────────────┐                 ┌──────────┤  receptor-1  │
│              │                 │          │              │
│    awx_1     │◄──────────┐     │          └──────────────┘
│              │           │     ▼
└──────┬───────┘    ┌──────┴───────┐        ┌──────────────┐
       │            │              │        │              │
       │            │ receptor-hop │◄───────┤  receptor-2  │
       ▼            │              │        │              │
┌──────────────┐    └──────────────┘        └──────────────┘
│              │                 ▲
│    awx_2     │                 │          ┌──────────────┐
│              │                 │          │              │
└──────────────┘                 └──────────┤  receptor-3  │
                                            │              │
                                            └──────────────┘

모든 실행(receptor-*) 노드는 홉 노드에 연결됩니다. 노드 awx_1만 AWX 클러스터 외부의 홉 노드에 연결됩니다. awx_1은 awx_2에 연결하여 AWX 클러스터가 완전히 연결되었다는 요구 사항을 충족합니다.

 

예를 들어, awx_2를 컨트롤러 노드로, receptor-3을 실행 노드로 하여 작업이 시작되면, awx_2는 awx_1을 통해 receptor-3과 통신한 다음 receptor-hop을 합니다.

데이터베이스 마이그레이션

환경을 처음 시작할 때 PostgreSQL 데이터베이스를 구축하려면 데이터베이스 마이그레이션을 실행해야 합니다. 몇 분 정도 걸리는데 터미널 세션에 다음과 같은 출력이 표시됩니다. 마이그레이션이 완료되면 AWX 개발 환경을 사용할 수 있습니다.

awx_1        | Operations to perform:
awx_1        |   Synchronize unmigrated apps: solo, api, staticfiles, debug_toolbar, messages, channels, django_extensions, ui, rest_framework, polymorphic
awx_1        |   Apply all migrations: sso, taggit, sessions, sites, kombu_transport_django, social_auth, contenttypes, auth, conf, main
awx_1        | Synchronizing apps without migrations:
awx_1        |   Creating tables...
awx_1        |     Running deferred SQL...
awx_1        |   Installing custom SQL...
awx_1        | Running migrations:
awx_1        |   Rendering model states... DONE
awx_1        |   Applying contenttypes.0001_initial... OK
awx_1        |   Applying contenttypes.0002_remove_content_type_name... OK
awx_1        |   Applying auth.0001_initial... OK
...

UI 정리 및 빌드

$ docker exec tools_awx_1 make clean-ui ui-devel

마이그레이션이 완료되고 UI가 구축되면 AWX 사용을 시작할 수 있습니다. UI는 브라우저에서 https://localhost:8043/#/home 에 접속할 수 있으며, API는 https://localhost:8043/api/v2 에서 찾을 수 있습니다.

관리자 계정 생성

개발 환경에서 관리자 계정을 만들어야 합니다. 다음 명령어를 사용하여 관리자 계정을 생성하세요.

docker exec -ti tools_awx_1 awx-manage createsuperuser

이 명령을 실행하면 관리자 계정을 만들 수 있습니다. 관리자 계정을 사용하여 서버 구성을 시작할 수 있습니다.

데모 데이터로드 (선택 사항)

데모 데이터를 로드할 수 있으며, 이를 통해 데모 프로젝트, 인벤토리 및 작업 템플릿이 생성됩니다.

데모 데이터를 로드하려면 다음 명령어를 사용합니다.

docker exec tools_awx_1 awx-manage create_preload_data

이로써 데이터가 데이터베이스에 저장되며, 데이터베이스 스키마가 변경될 때 데이터베이스를 재생성해야 할 수도 있습니다.

 

이제 AWX를 Docker 환경에서 성공적으로 구성하고 설정했으며 사용할 수 있습니다. 이를 통해 Ansible 워크플로 및 자동화를 실행하고 모니터링할 수 있습니다. Docker 환경을 통해 AWX를 더 효율적으로 관리하고 테스트할 수 있습니다.

 

로컬 Docker 환경에서 Ansible Galaxy Slack 모듈을 설치하여 AWX를 구성하는 단계입니다.

  1. AWX 소스 코드 다운로드
    GitHub에서 AWX 소스 코드를 다운로드하거나 Git을 사용하여 복제할 수 있습니다.
    git clone https://github.com/ansible/awx.git
  2. Docker Compose 파일 편집
    AWX를 로컬 Docker 환경에서 실행하려면 Docker Compose 파일을 수정해야 합니다. AWX 소스 코드 디렉토리 내에 docker-compose.yml 파일을 찾을 수 있습니다. 이 파일을 편집하여 Slack 모듈을 설치하고 추가합니다.
    version: '3'
    services:
      web:
        # ...
        environment:
          - ANSIBLE_GALAXY_CLI_COLLECTION_OPTS='--ignore-certs'
          - ANSIBLE_GALAXY_CLI_ROLES_OPTS='--ignore-certs'
          - AWX_ALLOW_ANY_HOST
        # ...
        command: /bin/bash -c "source /venv/awx/bin/activate && ansible-galaxy collection install community.general && gunicorn -k gevent -w 4 -b 0.0.0.0:8052 --chdir /var/lib/awx/projects/local -t 3600 awx.wsgi:application --reload"
        volumes:
          - awx-awx-web:/etc/awx
          # ...
    # ...
    위의 Docker Compose 파일에서 주목해야 할 부분은 environment 섹션과 command 섹션입니다. Slack 모듈을 설치하려면 ANSIBLE_GALAXY_CLI_COLLECTION_OPTS 및 ANSIBLE_GALAXY_CLI_ROLES_OPTS 환경 변수를 사용합니다. Slack 모듈 설치 명령이 command 섹션에 추가됩니다.
  3. AWX 실행 및 Slack 모듈 설치
    AWX를 실행하려면 AWX 소스 코드 디렉토리 내에서 다음 명령을 실행합니다.
    docker-compose up -d
    이 명령은 Docker Compose를 사용하여 AWX 컨테이너 그룹을 시작합니다.Slack 모듈을 설치하려면 AWX 컨테이너를 다시 빌드하고 실행해야 합니다. AWX 컨테이너를 다시 빌드하려면 다음 명령을 실행합니다.
    docker-compose build
    그런 다음 AWX를 다시 실행합니다.
    docker-compose up -d
    Slack 모듈이 AWX 컨테이너 내에서 설치되고 AWX가 실행됩니다.
  4. AWX 작업 생성
    이제 AWX 웹 인터페이스를 사용하여 Slack 모듈을 포함한 작업을 생성하고 Slack로 알림을 보낼 수 있습니다.

이렇게 하면 로컬 Docker 환경에서 Ansible Galaxy Slack 모듈을 AWX와 함께 사용하여 AWX를 구성할 수 있습니다. AWX 소스 코드를 수정하고 Docker Compose를 사용하여 모듈을 설치하고 실행하면 됩니다.

 

Prometheus와 Grafana 통합

Prometheus는 메트릭 수집 도구로, api/v2/metrics 엔드포인트에서 Prometheus 형식의 데이터를 지원합니다.

 

Prometheus는 일정 간격으로 대상을 폴링하도록 구성되며 다양한 인증 방법을 사용할 수 있습니다. 우리는 Prometheus를 기본 인증을 사용하고 5초마다 AWX를 기본적으로 폴링하도록 구성합니다. 이 구성은 docker-compose/ansible/roles/sources/templates/prometheus.yml.j2 템플릿을 사용하여 생성됩니다. 값을 변경하려면 해당 템플릿을 수정하거나 해당 템플릿에서 사용되는 ansible 변수를 설정하십시오 (다음 섹션의 EXTRA_SOURCES_ANSIBLE_OPTS의 사용 방법 참조).

 

Grafana는 데이터를 시각화하고 경보 기능을 제공하는 대시보드를 제공합니다.

Grafana의 "프로비저닝 파일" 기능을 사용하여 파일에서 경보 및 대시보드 구성을 배포할 수 있습니다.

이러한 구성 파일은 tools/grafana에서 컨테이너로 마운트되는 디렉토리에 위치합니다.

 

Grafana와 Prometheus를 사용하여 docker-compose를 실행하는 방법
개발 환경을 실행하려면 다음 변수를 설정하여 Prometheus와 Grafana를 활성화하십시오.

$ PROMETHEUS=yes GRAFANA=yes make docker-compose

배포 프로세스에서 사용하는 추가 ansible 변수를 전달하려면 EXTRA_SOURCES_ANSIBLE_OPTS를 전달할 수 있습니다.

GRAFANA=true PROMETHEUS=true EXTRA_SOURCES_ANSIBLE_OPTS="-e scrape_interval=1 admin_password=foobar" make docker-compose

Grafana 및 Prometheus를 보는 위치

  1. Prometheus는 http://localhost:9090/targets 에서 확인하고 메트릭 엔드포인트 State가 Up인지 확인하십시오.
  2. 그래프 탭을 클릭하고 메트릭 이름을 입력하거나 메트릭을 표시할 메트릭을 찾기 위해 실행 버튼 옆에있는 Open metrics explorer 버튼을 사용하십시오.
  3. Grafana로 이동하여 http://localhost:3001 로 이동하십시오. 사용자 이름과 암호 모두 admin을 사용하여 로그인하십시오.
  4. 왼쪽 네비게이션 메뉴에서 대시보드->탐색으로 이동하고 "awx-demo"를 찾아 클릭하십시오. 이러한 대시보드에는 그래프가 있어야 합니다.
  5. 이제 이러한 대시보드를 수정하고 원하는 메트릭에 대한 패널을 추가할 수 있습니다.

Grafana의 알람
우리는 프로비저닝 파일 방법을 사용하여 Grafana에서 경보를 구성하고 있습니다. 이 기능은 2022년 8월 현재 Grafana에서 새롭게 도입된 기능입니다. 문서는 https://grafana.com/docs/grafana/latest/administration/provisioning/#alerting에서 찾을 수 있지만 모든 구성에 필요한 모든 매개변수를 완전히 보여주지는 않습니다.

 

규칙을 작성하는 방법을 이해하는 한 가지 방법은 UI에서 규칙을 작성하고 규칙을 저장할 때 페이로드를 검사하는 것입니다. 각 규칙의 페이로드의 "data" 부분이 프로비저닝 파일 구성에 필요한 구문과 동일한 것처럼 보입니다. 컨테이너를 다시 시작하지 않고 경보를 다시로드하려면 터미널에서 curl을 사용하여 curl -X POST http://admin:admin@localhost:3001/api/admin/provisioning/alerting/reload을 보내면됩니다.

 

규칙을 내보내는 또 다른 방법은 API를 탐색하는 것입니다.

  1. 모든 폴더 가져오기: GET /api/folders
  2. 규칙 가져오기 : GET /api/ruler/grafana/api/v1/rules/{{폴더}}

curl을 사용하거나 웹 브라우저에서 이 작업을 수행할 수 있습니다.

 

포함된 알람
남은 용량이 낮고 대기 작업이 있는 경우 경보
작업이 대기 중이지만 클러스터에서 실행할 수 있는 용량이 부족한 경우를 알고 싶습니다. 접근 방식은 클러스터의 모든 남은 용량을 합산하고 클러스터의 총 용량과 비교하는 것입니다. 남은 용량이 용량의 10% 미만이고 대기 작업이 있는 경우, 그리고 이것이 180초 이상 유효한 경우 경보를 생성합니다.

---
apiVersion: 1
groups:
  - folder: awx
    interval: 10s
    name: awx_rules
    orgId: 1
    exec_err_state: Alerting
    no_data_state: NoData
    rules:
      - for: 5m
        noDataState: OK
        panelId: 2
        title: failure_rate_exceeded_20_percent
        uid: failure_rate_exceeded_20_percent
        condition: compare
        data:
          - refId: total_errors
            queryType: ""
            relativeTimeRange:
              from: 600
              to: 0
            datasourceUid: awx_prometheus
            model:
              editorMode: code
              expr: >-
                max(delta(awx_instance_status_total{instance="awx1:8013",
                status=~"failed|error"}[30m]))
              hide: false
              intervalMs: 1000
              legendFormat: __auto
              maxDataPoints: 43200
              range: true
              refId: total_errors
          - refId: max_errors
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 80
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - total_errors
                  reducer:
                    params: []
                    type: max
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression: total_errors
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: max
              refId: max_errors
              type: reduce
          - refId: total_success
            queryType: ""
            relativeTimeRange:
              from: 600
              to: 0
            datasourceUid: awx_prometheus
            model:
              datasource:
                type: prometheus
                uid: awx_prometheus
              editorMode: code
              expr: >-
                max(delta(awx_instance_status_total{instance="awx1:8013",
                status="successful"}[30m]))
              hide: false
              intervalMs: 1000
              legendFormat: __auto
              maxDataPoints: 43200
              range: true
              refId: total_success
          - refId: max_success
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - total_success
                  reducer:
                    params: []
                    type: max
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression: total_success
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: max
              refId: max_success
              type: reduce
          - refId: compare
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - max_success
                  reducer:
                    params: []
                    type: avg
                  type: query
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - max_success
                  reducer:
                    params: []
                    type: avg
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression: $max_errors / ($max_errors+$max_success) >= .2
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              refId: compare
              type: math
      - for: 60s
        noDataState: OK
        panelId: 1
        title: redis_queue_too_large_to_clear_in_2_min
        uid: redis_queue_too_large_to_clear_in_2_min
        condition: redis_queue_growing_faster_than_insertion_rate
        dashboardUid: awx
        data:
          - refId: events_insertion_rate_per_second
            relativeTimeRange:
              from: 300
              to: 0
            datasourceUid: awx_prometheus
            model:
              editorMode: code
              expr: irate(callback_receiver_events_insert_db{node='awx_1'}[1m])
              hide: false
              intervalMs: 1000
              legendFormat: __auto
              maxDataPoints: 43200
              range: true
              refId: events_insertion_rate_per_second
            queryType: ""
          - refId: mean_event_insertion_rate
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: -100
            model:
              conditions:
                - evaluator:
                    params:
                      - 3
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - event_insertion_rate
                  reducer:
                    params: []
                    type: last
                  type: query
              datasource:
                type: __expr__
                uid: -100
              expression: events_insertion_rate_per_second
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: mean
              refId: mean_event_insertion_rate
              type: reduce
            queryType: ""
          - refId: redis_queue_size
            relativeTimeRange:
              from: 300
              to: 0
            datasourceUid: awx_prometheus
            model:
              datasource:
                type: prometheus
                uid: awx_prometheus
              editorMode: code
              expr: callback_receiver_events_queue_size_redis{node='awx_1'}
              hide: false
              intervalMs: 1000
              legendFormat: __auto
              maxDataPoints: 43200
              range: true
              refId: redis_queue_size
            queryType: ""
          - refId: last_redis_queue_size
            relativeTimeRange:
            from: 0
            to: 0
            datasourceUid: -100
            model:
              conditions:
                - evaluator:
                    params:
                      - 3
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - event_insertion_rate
                  reducer:
                    params: []
                    type: last
                  type: query
              datasource:
                type: __expr__
                uid: -100
              expression: redis_queue_size
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: last
              refId: last_redis_queue_size
              type: reduce
            queryType: ""
          - refId: redis_queue_growing_faster_than_insertion_rate
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: -100
            model:
              conditions:
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - last_redis_queue_size
                  reducer:
                    params: []
                    type: avg
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression: "($last_redis_queue_size > ($mean_event_insertion_rate * 120))"
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              type: math
      - for: 60s
        noDataState: OK
        panelId: 3
        uid: capacity_below_10_percent
        title: capacity_below_10_percent
        condition: pending_jobs_and_capacity_compare
        data:
          - refId: remaining_capacity
            queryType: ""
            relativeTimeRange:
              from: 300
              to: 0
            datasourceUid: awx_prometheus
            model:
              editorMode: code
              expr: sum(awx_instance_remaining_capacity)
              hide: false
              intervalMs: 1000
              legendFormat: __auto
              maxDataPoints: 43200
              range: true
              refId: remaining_capacity
          - refId: last_remaining_capacity
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 3
                    type: outside_range
                  operator:
                    type: and
                  query:
                    params:
                      - total_capacity
                  reducer:
                    params: []
                    type: percent_diff
                  type: query
              datasource:
                type: __expr__
                uid: "-100"
              expression: remaining_capacity
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: last
              refId: last_remaining_capacity
              type: reduce
          - refId: total_capacity
            queryType: ""
            relativeTimeRange:
              from: 600
              to: 0
            datasourceUid: awx_prometheus
            model:
              datasource:
                type: prometheus
                uid: awx_prometheus
              editorMode: code
              expr: sum(awx_instance_capacity{instance="awx1:8013"})
              hide: false
              intervalMs: 1000
              legendFormat: __auto
              maxDataPoints: 43200
              range: true
              refId: total_capacity
          - refId: last_total_capacity
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - capacity_below_10%
                  reducer:
                    params: []
                    type: avg
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression: total_capacity
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: last
              refId: last_total_capacity
              type: reduce
          - refId: 10_percent_total_capacity
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - last_total_capacity
                  reducer:
                    params: []
                    type: avg
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression: "$last_total_capacity*.10"
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              refId: 10_percent_total_capacity
              type: math
          - refId: pending_jobs
            queryType: ""
            relativeTimeRange:
              from: 600
              to: 0
            datasourceUid: awx_prometheus
            model:
              datasource:
                type: prometheus
                uid: awx_prometheus
              editorMode: builder
              expr: awx_pending_jobs_total{instance="awx1:8013"}
              hide: false
              intervalMs: 1000
              legendFormat: __auto
              maxDataPoints: 43200
              range: true
              refId: pending_jobs
          - refId: last_pending_jobs
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - pending_jobs_and_capacity_compare
                  reducer:
                    params: []
                    type: avg
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression: pending_jobs
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: last
              refId: last_pending_jobs
              type: reduce
          - refId: pending_jobs_and_capacity_compare
            queryType: ""
            relativeTimeRange:
              from: 0
              to: 0
            datasourceUid: "-100"
            model:
              conditions:
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - 10_percent_total_capacity
                  reducer:
                    params: []
                    type: last
                  type: query
                - evaluator:
                    params:
                      - 0
                      - 0
                    type: gt
                  operator:
                    type: and
                  query:
                    params:
                      - pending_jobs
                  reducer:
                    params: []
                    type: last
                  type: query
              datasource:
                name: Expression
                type: __expr__
                uid: __expr__
              expression:
                "($10_percent_total_capacity > $last_remaining_capacity) && $last_pending_jobs
                > 1"
              hide: false
              intervalMs: 1000
              maxDataPoints: 43200
              reducer: mean
              refId: pending_jobs_and_capacity_compare
              type: math

Automate Provisioning and Orchestration of Cloud Infrastructure using AWX.pdf
1.82MB

728x90

댓글