Создание панелей и управление ими с помощью Terraform и GitHub Actions
Узнайте, как создавать и сопровождать несколько панелей, представленных в виде JSON-исходного кода для Grafana, с помощью Terraform и GitHub Actions.
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть следующее:
- Учётная запись Grafana Cloud, как описано в разделе Get started
- Репозиторий GitHub
Добавление панелей в репозиторий GitHub
В этом руководстве показано, как добавить панели для ElasticSearch, InfluxDB и AWS EC2. Вы можете использовать другие панели в соответствии с настроенными источниками данных.
-
В вашем репозитории GitHub создайте папку с именем
dashboardsв корневом каталоге. -
В папке
dashboardsсоздайте три подпапки. В этом руководстве мы создадим три подпапки с именамиelasticsearch,influxdbиaws. -
Добавьте JSON-исходный код панелей в каждую из трёх подпапок.
Конфигурация Terraform для провайдера Grafana
Эта конфигурация Terraform настраивает провайдер Grafana для обеспечения необходимой аутентификации при создании папок и панелей в экземпляре Grafana.
-
Создайте сервисную учётную запись и токен в экземпляре Grafana, выполнив следующие шаги:
-
Создайте файл с именем
main.tfв корневом каталоге Git и добавьте следующий блок кода:terraform { required_providers { grafana = { source = "grafana/grafana" version = ">= 2.9.0" } } } provider "grafana" { alias = "cloud" url = "<Grafana-instance-url>" auth = "<Grafana-Service-Account-token>" } -
Замените следующие значения полей:
<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 и добавьте следующий блок кода:
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 и добавьте следующий блок кода:
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.
-
В вашем репозитории GitHub создайте папку с именем
.githubв корневом каталоге . -
В папке
.githubсоздайте подпапку с именемworkflows. -
Чтобы добавить рабочий процесс GitHub в ваш репозиторий GitHub, создайте файл с именем
terraform.ymlв каталогеworkflowsи добавьте следующий блок кода: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 -
Закоммитьте изменения, внесённые в
terraform.ymlна предыдущем шаге, в веткуmainвашего репозитория GitHub. После фиксации изменений созданный вами рабочий процесс GitHub должен начать выполняться автоматически, так как определённый на предыдущем шаге рабочий процесс запускается при создании pull request или при коммите изменений в веткуmain.
Управление состоянием Terraform
Если вы не используете бэкенд Terraform для хранения файла .tfstate, добавьте следующий блок кода в конец файла рабочего процесса GitHub, чтобы файл состояния Terraform гарантированно сохранялся в Git.
- 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.



