Документацияbreadcrumb arrow Grafanabreadcrumb arrow Документация GlaberGraphbreadcrumb arrow Как кодbreadcrumb arrow Инфраструктура как кодbreadcrumb arrow Terraformbreadcrumb arrow Создание панелей и управление ими с помощью Terraform и GitHub Actions

Создание панелей и управление ими с помощью Terraform и GitHub Actions

Узнайте, как создавать и сопровождать несколько панелей, представленных в виде JSON-исходного кода для Grafana, с помощью Terraform и GitHub Actions.

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть следующее:

  • Учётная запись Grafana Cloud, как описано в разделе Get started
  • Репозиторий GitHub

Добавление панелей в репозиторий GitHub

В этом руководстве показано, как добавить панели для ElasticSearch, InfluxDB и AWS EC2. Вы можете использовать другие панели в соответствии с настроенными источниками данных.

  1. В вашем репозитории GitHub создайте папку с именем dashboards в корневом каталоге.

  2. В папке dashboards создайте три подпапки. В этом руководстве мы создадим три подпапки с именами elasticsearch, influxdb и aws.

  3. Добавьте JSON-исходный код панелей в каждую из трёх подпапок.

Конфигурация Terraform для провайдера Grafana

Эта конфигурация Terraform настраивает провайдер Grafana для обеспечения необходимой аутентификации при создании папок и панелей в экземпляре Grafana.

  1. Создайте сервисную учётную запись и токен в экземпляре Grafana, выполнив следующие шаги:

    1. Create a service account in Grafana
    2. Add a token to a service account
  2. Создайте файл с именем main.tf в корневом каталоге Git и добавьте следующий блок кода:

    terraform
    terraform {
       required_providers {
          grafana = {
             source  = "grafana/grafana"
             version = ">= 2.9.0"
          }
       }
    }
    
    provider "grafana" {
       alias = "cloud"
    
       url   = "<Grafana-instance-url>"
       auth  = "<Grafana-Service-Account-token>"
    }
  3. Замените следующие значения полей:

    • <Grafana-instance-url> на URL вашего экземпляра Grafana, например "https://my-stack.grafana.net/".
    • <Grafana-Service-Account-token> на токен сервисной учётной записи из экземпляра Grafana.

Конфигурация Terraform для папок

Эта конфигурация Terraform создаёт три папки с именами ElasticSearch, InfluxDB и AWS в экземпляре Grafana с помощью ресурса grafana_folder (Resource).

Создайте файл с именем folders.tf в корневом каталоге Git и добавьте следующий блок кода:

terraform
resource "grafana_folder" "ElasticSearch" {
  provider = grafana.cloud

  title = "ElasticSearch"
}

resource "grafana_folder" "InfluxDB" {
  provider = grafana.cloud

  title = "InfluxDB"
}

resource "grafana_folder" "AWS" {
  provider = grafana.cloud

  title = "AWS"
}

Конфигурация Terraform для панелей

Эта конфигурация Terraform перебирает JSON-файлы в трёх папках (elasticsearch, influxdb и aws), созданных вами в репозитории GitHub, и добавляет их в соответствующие папки в экземпляре Grafana с помощью ресурса панели Grafana. Доступные ресурсы:

  • grafana_dashboard (Resource).
  • Для панелей в стиле Kubernetes в Grafana v13 или более поздней версии используйте подходящий ресурс в зависимости от версии Kubernetes вашей панели. Подробности о доступных ресурсах, таких как grafana_apps_dashboard_dashboard_v1beta1, grafana_apps_dashboard_dashboard_v1 или grafana_apps_dashboard_dashboard_v2, см. в разделе Grafana resources.

Например, панель, представленная в виде JSON-исходного кода в папке elasticsearch репозитория GitHub, будет создана в папке ElasticSearch в экземпляре Grafana.

Создайте файл с именем dashboards.tf в корневом каталоге Git и добавьте следующий блок кода:

terraform
resource "grafana_dashboard" "elasticsearch" {
  provider = grafana.cloud

  for_each    = fileset("${path.module}/dashboards/elasticsearch", "*.json")
  config_json = file("${path.module}/dashboards/elasticsearch/${each.key}")
  folder      = grafana_folder.ElasticSearch.id
}

resource "grafana_dashboard" "influxdb" {
  provider = grafana.cloud

  for_each    = fileset("${path.module}/dashboards/influxdb", "*.json")
  config_json = file("${path.module}/dashboards/influxdb/${each.key}")
  folder      = grafana_folder.InfluxDB.id
}

resource "grafana_dashboard" "aws" {
  provider = grafana.cloud

  for_each    = fileset("${path.module}/dashboards/aws", "*.json")
  config_json = file("${path.module}/dashboards/aws/${each.key}")
  folder      = grafana_folder.AWS.id
}

Рабочий процесс GitHub для управления панелями с помощью Terraform

Этот рабочий процесс GitHub состоит из следующих шагов:

  • С помощью действия actions/checkout@v3 выполняется извлечение репозитория GitHub, чтобы рабочий процесс GitHub мог получить к нему доступ.
  • Terraform CLI устанавливается на runner GitHub с помощью действия hashicorp/setup-terraform@v1.
  • terraform init выполняется как команда bash на runner GitHub для инициализации рабочего каталога, содержащего файлы конфигурации Terraform.
  • terraform fmt -check выполняется как команда bash на runner GitHub для проверки правильности форматирования файлов конфигурации Terraform. Если файлы конфигурации Terraform отформатированы неправильно, рабочий процесс завершится с ошибкой на этом шаге.
  • terraform plan выполняется как команда bash на runner GitHub для предварительного просмотра изменений, которые внесёт Terraform.
  • С помощью действия mshick/add-pr-comment@v1 предварительный просмотр из terraform plan публикуется в виде комментария к pull request. Это помогает проверить изменения, которые внесёт Terraform, до слияния pull request.
  • terraform apply -auto-approve выполняется как команда bash на runner GitHub для применения файлов конфигурации Terraform. Флаг -auto-approve добавлен к команде, чтобы пропустить интерактивное подтверждение плана перед применением и сделать рабочий процесс автоматическим. Этот шаг выполняется только при коммите изменений в ветку main. При слиянии pull request действие слияния создаёт коммит в ветку main, что запускает выполнение шага terraform apply -auto-approve.
  1. В вашем репозитории GitHub создайте папку с именем .github в корневом каталоге .

  2. В папке .github создайте подпапку с именем workflows.

  3. Чтобы добавить рабочий процесс GitHub в ваш репозиторий GitHub, создайте файл с именем terraform.yml в каталоге workflows и добавьте следующий блок кода:

    YAML
    name: Terraform
    
    on:
      push:
        branches:
          - 'main'
      pull_request:
    
    jobs:
      terraform:
        runs-on: ubuntu-latest
    
        steps:
          # Checkout the repository to the GitHub Actions runner
          - name: Checkout
            uses: actions/checkout@v3
    
          # Install the latest version of Terraform CLI
          - name: Setup Terraform
            uses: hashicorp/setup-terraform@v1
    
          # Initialize a new or existing Terraform working directory by creating initial files, loading any remote state, downloading modules, etc.
          - name: Terraform Init
            run: terraform init
    
          # Checks that all Terraform configuration files adhere to a canonical format
          - name: Terraform Format
            run: terraform fmt -check
    
          # Previews the changes that Terraform will make
          - name: Plan Terraform
            id: plan
            continue-on-error: true
            run: terraform plan -input=false -no-color
    
          # Post the preview (terraform plan) from the previous step as a GitHub pull request comment
          - name: Post Plan to GitHub PR
            if: github.ref != 'refs/heads/main'
            uses: mshick/add-pr-comment@v1
            with:
              repo-token: ${{ secrets.GITHUB_TOKEN }}
              repo-token-user-login: 'github-actions[bot]'
              message: |
                Applying:
    
                ```
                ${{ steps.plan.outputs.stdout }}
                ```
    
          # Applies the terraform configuration files when the branch is `main`
          - name: Apply Terraform
            if: github.ref == 'refs/heads/main'
            id: apply
            continue-on-error: true
            run: |
              terraform apply -auto-approve
  4. Закоммитьте изменения, внесённые в terraform.yml на предыдущем шаге, в ветку main вашего репозитория GitHub. После фиксации изменений созданный вами рабочий процесс GitHub должен начать выполняться автоматически, так как определённый на предыдущем шаге рабочий процесс запускается при создании pull request или при коммите изменений в ветку main.

Управление состоянием Terraform

Если вы не используете бэкенд Terraform для хранения файла .tfstate, добавьте следующий блок кода в конец файла рабочего процесса GitHub, чтобы файл состояния Terraform гарантированно сохранялся в Git.

YAML
- name: commit the terraform state
  if: github.ref == 'refs/heads/main'
  uses: stefanzweifel/git-auto-commit-action@v4
  with:
    commit_message: Updating Terraform state
    file_pattern: terraform.tfstate

Когда вы запускаете terraform apply, Terraform автоматически управляет файлом terraform.tfstate и обновляет его, чтобы хранить состояние вашей инфраструктуры и конфигурации. Этот шаг использует действие stefanzweifel/git-auto-commit-action@v4 для автоматического коммита файла terraform.tfstate с изменениями, внесёнными при выполнении шага terraform apply.

Note

Файл состояния Terraform (terraform.tfstate) не следует хранить в Git, чтобы избежать утечки конфиденциальных данных. Вместо этого храните файлы состояния Terraform с помощью удалённого бэкенда, например AWS S3 с надлежащим RBAC. Дополнительные сведения см. в разделе Terraform state.

Проверка

После успешного выполнения рабочего процесса GitHub вы сможете убедиться в следующем:

  • В экземпляре Grafana созданы папки ElasticSearch, InfluxDB и AWS.

    Папки в Dashboards

  • Панель, представленная в виде JSON-исходного кода из папки elasticsearch в GitHub, добавлена в папку ElasticSearch в экземпляре Grafana.

    Папка ElasticSearch

  • Исходный код панели из папки influxdb в GitHub добавлен в папку InfluxDB в экземпляре Grafana.

    Папка InfluxDB

  • Панели из папки aws в GitHub добавлены в папку AWS в экземпляре Grafana.

    Папка AWS EC2

Итог

В этом руководстве вы создали рабочий процесс GitHub с использованием Terraform для управления исходным кодом панелей. С помощью этого рабочего процесса панели в экземпляре Grafana синхронизируются с JSON-файлами исходного кода панелей в GitHub.

Чтобы узнать больше об управлении Grafana Cloud с помощью Terraform, обратитесь к документации провайдера Grafana.