系列文章
- Grafana 系列文章
- Terraform 系列文章
概述
前文最后總結了我的工具選型:
- Grafana Terraform provider
- Jsonnet
我們今天先簡單介紹 Grafana Terraform provider.
Grafana Terraform Provider
Grafana provider 為 Grafana 提供配置管理資源,是目前 Grafana 官方提供的,覆寫的 Grafana 資源最全的 IaC 工具,
Grafana Terraform Provider 的代碼是建立在 grafana-api-golang-client 之上的,
通過 Grafana Terraform Provider, 我們可以管理:
- Alerting
- Resources
grafana_contact_pointgrafana_message_templategrafana_mute_timinggrafana_notification_policygrafana_rule_group
- Resources
- Cloud
- Resources
grafana_cloud_access_policygrafana_cloud_access_policy_tokengrafana_cloud_api_keygrafana_cloud_plugin_installationgrafana_cloud_stackgrafana_cloud_stack_api_keygrafana_cloud_stack_service_accountgrafana_cloud_stack_service_account_tokengrafana_machine_learning_holidaygrafana_machine_learning_jobgrafana_machine_learning_outlier_detector
- DataSources
grafana_cloud_ipsgrafana_cloud_organizationgrafana_cloud_stack
- Resources
- Grafana Enterprise
- Resources
grafana_builtin_role_assignmentgrafana_data_source_permission(AWS Managed Grafana 也有這個功能)grafana_reportgrafana_rolegrafana_role_assignmentgrafana_team_external_group
- Resources
- Grafana OSS
- Resources
grafana_annotationgrafana_api_keygrafana_dashboardgrafana_dashboard_permissiongrafana_data_sourcegrafana_foldergrafana_folder_permissiongrafana_library_panelgrafana_organizationgrafana_organization_preferencesgrafana_playlistgrafana_service_accountgrafana_service_account_permissiongrafana_service_account_tokengrafana_teamgrafana_team_preferencesgrafana_user
- DataSources
grafana_dashboardgrafana_dashboardsgrafana_data_sourcegrafana_foldergrafana_foldersgrafana_library_panelgrafana_organizationgrafana_organization_preferencesgrafana_teamgrafana_usergrafana_users
- Resources
- OnCall
- 略
- SLO
- 略
- Synthetic Monitoring
- 略
實戰
因為 Grafana 資源相對比較清晰和獨立,不像 AWS 會有很多復雜的關聯關系,
所以關于 Grafana TF 代碼的組織形式可以簡單點:
- 可以使 AllInOne 的
.tf檔案 - 也可以根據資源型別,簡單拆分為如下即可:
├── dashboard.tf
├── datasource.tf
├── grafana-ds-info.auto.tfvars.json
├── jsonnet (jsonnet 檔案夾,dashboard 相關內容都在該檔案夾下)
├── main.tf
├── outputs.tf
├── variables.tf
└── versions.tf
下面以第二種組織結構來詳細介紹,
創建 Grafana Provider
在 main.tf 中,創建 Grafana Provider:
provider "grafana" {
}
如果只有一套 Grafana, 那么如上的配置完全就夠用了,
如果有多套 Grafana, 則可以通過指定 Grafana provider 的 alias 來實作,具體如下:
provider "grafana" {
alias = "aws-managed-grafana"
}
后續使用資源的時候,可以通過指定 provider 來區分,實體如下:
# provision folder
resource "grafana_folder" "play-grafana" {
provider = grafana.aws-managed-grafana
uid = "play-grafana"
title = "play-grafana"
}
??Notes:
后續為了演示代碼的簡潔,不展示多 Grafana provider 的情況,
Resource 里也不會有provider欄位,
Grafana 通過 Terraform 使用,是至少需要提供 url 和 apikey 2 類資訊的,這 2 類資訊可以直接通過環境變數的形式提供,具體如下:
export GRAFANA_URL=https://<your-grafana-domain>/
export GRAFANA_AUTH=<your-grafana-apikey>
GRAFANA_AUTH 的值可以是一個 Grafana API 密鑰,basic auth 就是 用戶名:密碼,或可以點擊這個鏈接申請 Grafana API 密鑰,
除此之外,Grafana Cloud/Synthetic Monitoring/Grafana Oncall 會有一些專用的 apikey 或 token, 這里就不詳細介紹了,
創建 Grafana 組織
??Notes:
因為我主要用的是 AWS Managed Grafana, 其只有一個默認的 org 1. 也沒有開放相關的創建多個 org 的組織,所以我基本上不會用到該資源,
如果有用到該資源,可以創建一個 org.tf, 具體內容是:
// 創建組織
resource "grafana_organization" "my_org" {
name = "my_org"
}
// 在組織內創建資源
provider "grafana" {
alias = "my_org"
org_id = grafana_organization.my_org.org_id
}
resource "grafana_folder" "my_folder" {
provider = grafana.my_org
title = "Test Folder"
}
創建 DataSource
該資源所需的引數根據所選擇的資料源型別(通過 type 引數)而有所不同,
可以在 datasource.tf 下創建,
以下是創建:
- stackdriver
- influxdb
- cloudwatch
- zabbix
- ES
- Prometheus
- Jaeger
的簡單示例,
Stackdriver
resource "grafana_data_source" "arbitrary-data" {
type = "stackdriver"
name = "sd-arbitrary-data"
json_data_encoded = jsonencode({
"tokenUri" = "https://oauth2.googleapis.com/token"
"authenticationType" = "jwt"
"defaultProject" = "default-project"
"clientEmail" = "[email protected]"
})
secure_json_data_encoded = jsonencode({
"privateKey" = "-----BEGIN PRIVATE KEY-----\nprivate-key\n-----END PRIVATE KEY-----\n"
})
}
Influxdb
resource "grafana_data_source" "influxdb" {
type = "influxdb"
name = "myapp-metrics"
url = "http://influxdb.example.net:8086/"
basic_auth_enabled = true
basic_auth_username = "username"
database_name = influxdb_database.metrics.name
json_data_encoded = jsonencode({
authType = "default"
basicAuthPassword = "mypassword"
})
}
Cloudwatch
基于 AKSK 的創建:
resource "grafana_data_source" "cloudwatch" {
type = "cloudwatch"
name = "cw-example"
json_data_encoded = jsonencode({
defaultRegion = "us-east-1"
authType = "keys"
})
secure_json_data_encoded = jsonencode({
accessKey = "123"
secretKey = "456"
})
}
這是基于 role (external) 的創建:
resource "grafana_data_source" "cloudwatch" {
type = "cloudwatch"
name = "example_cw"
json_data_encoded = jsonencode({
assumeRoleArn = "arn:aws:iam::<the-aws-id>:role/<...>"
authType = "ec2_iam_role"
defaultRegion = "us-east-1"
externalId = "<the-aws-id>"
})
}
Zabbix
resource "grafana_data_source" "zabbix" {
type = "alexanderzobnin-zabbix-datasource"
name = "Zabbix-example"
url = "http://<zabbix-domain>/api_jsonrpc.php"
json_data_encoded = jsonencode({
trends = true
username = "Admin"
})
secure_json_data_encoded = jsonencode({
password = "Password"
})
}
?? 注意:
Zabbix 的 type 是
alexanderzobnin-zabbix-datasource
使用的前提是安裝 Zabbix Grafana 插件.
Jaeger
resource "grafana_data_source" "jaeger-example" {
type = "jaeger"
name = "example_jaeger"
uid = "example_jaeger"
url = "http://<jaeger-domain>/trace/"
json_data_encoded = jsonencode({
"nodeGraph" : {
"enabled" : true
}
})
}
data "grafana_data_source" "jaeger-example" {
name = grafana_data_source.jaeger-example.name
uid = grafana_data_source.jaeger-example.uid
}
??上面的 data "grafana_data_source" "jaeger-example" 是將 Jaeger Datasource 的 uid 提供給 ES 使用,
當然,如果你直接在創建 Jaeger Datasource 的時候指定了 uid, 如下所示,那么后面在被其他 Datasource 參考時可以直接指定寫死,
uid = "example_jaeger"
ES
resource "grafana_data_source" "elasticsearch-example" {
type = "elasticsearch"
name = "es_example"
uid = "es_example"
url = "http://<es_host>:9200"
// 就是 es index
database_name = "[example.*-]YYYY.MM.DD"
json_data_encoded = jsonencode({
esVersion = "6.0.0"
interval = "Daily"
includeFrozen = false
maxConcurrentShardRequests = 256
timeField = "@timestamp"
logLevelField = "level"
logMessageField = "_source"
dataLinks = [
{
datasourceUid = data.grafana_data_source.jaeger-example.uid
// 或 datasourceUid = "example_jaeger"
field = "trace_id",
url = "${"$"}{__value.raw}"
}
]
})
}
這里,有以下幾個需要注意的地方:
database_name = "[example.*-]YYYY.MM.DD"在 type 為 es 的情況下,database_name 就是 es 的索引名稱dataLinks這里通過 data link 鏈接到 Jagger Datasource:datasourceUid = data.grafana_data_source.jaeger-example.uid(Jaeger Datasource 就是上一節創建的)url = "${"$"}{__value.raw}"這里要特別注意,實際上傳給 Grafana 的是:${__value.raw}, 但是這個恰好也是 Terraform 的模板/變數替換語法,所以如果直接這樣寫會將其決議為模板/變數,從而出現該變數不存在的報錯,通過${"$"}轉義為$+{__value.raw}拼成正確的${__value.raw}傳給 Grafana.
Prometheus
基礎配置如下:
resource "grafana_data_source" "prometheus" {
type = "prometheus"
name = "example_prom"
uid = "example_prom"
url = "http://my-instances.com"
json_data_encoded = jsonencode({
httpMethod = "POST"
})
}
官方提供的 Prometheus 兼容實作 - Mimir 的配置如下:
resource "grafana_data_source" "prometheus" {
type = "prometheus"
name = "mimir"
url = "https://my-instances.com"
basic_auth_enabled = true
basic_auth_username = "username"
json_data_encoded = jsonencode({
httpMethod = "POST"
prometheusType = "Mimir"
prometheusVersion = "2.4.0"
})
secure_json_data_encoded = jsonencode({
basicAuthPassword = "password"
})
}
創建 Dashboard
在 dashboard.tf 中,創建 dashboard 示例如下:
resource "grafana_dashboard" "metrics" {
config_json = file("grafana-dashboard.json")
}
也可以通過如下方式創建:
resource "grafana_dashboard" "metrics" {
config_json = jsonencode({
title = "as-code dashboard"
uid = "ascode"
})
}
??注意:
config_json 是 String 型別,具體是完整的 Dashboard model JSON,
可以直接通過 file("grafana-dashboard.json") 獲取,
如第二個實體,jsonencode 的作用就是使用 JSON 語法將一個 Object 轉換為 String.
總結
好了,本次我們介紹了 Grafana Terraform Provider 的基礎知識,還是比較簡單的,我們使用其:
- 創建 Provider
- 創建組織
- 創建檔案夾
- 創建各類常見的 Datasources
- 創建 Dashboard
非常直白清晰,希望對各位有所幫助,
???參考檔案
- Docs overview | grafana/grafana | Terraform Registry
- grafana_folder | Resources | grafana/grafana | Terraform Registry
- grafana_data_source | Resources | grafana/grafana | Terraform Registry
- grafana_dashboard | Resources | grafana/grafana | Terraform Registry
- jsonencode - Functions - Configuration Language | Terraform | HashiCorp Developer
- Strings and Templates - Configuration Language | Terraform | HashiCorp Developer
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555574.html
標籤:其他
上一篇:在 Debian 12 上安裝 KubeSphere 實戰入門
下一篇:返回列表
