Grafana 系列 - GaC-2-Grafana Terraform Provider 基础
本文最后更新于:2024年7月25日 下午
系列文章
概述
前文最后总结了我的工具选型:
- 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文件 - 也可以根据资源类型,简单拆分为如下即可:
1 | |
下面以第二种组织结构来详细介绍。
创建 Grafana Provider
在 main.tf 中,创建 Grafana Provider:
1 | |
如果只有一套 Grafana, 那么如上的配置完全就够用了。
如果有多套 Grafana, 则可以通过指定 Grafana provider 的 alias 来实现。具体如下:
1 | |
后续使用资源的时候,可以通过指定 provider 来区分,实例如下:
1 | |
📝Notes:
后续为了演示代码的简洁,不展示多 Grafana provider 的情况。
Resource 里也不会有provider字段。
Grafana 通过 Terraform 使用,是至少需要提供 url 和 apikey 2 类信息的。这 2 类信息可以直接通过环境变量的形式提供,具体如下:
1 | |
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, 具体内容是:
1 | |
创建 DataSource
该资源所需的参数根据所选择的数据源类型(通过 type 参数)而有所不同。
可以在 datasource.tf 下创建。
以下是创建:
- stackdriver
- influxdb
- cloudwatch
- zabbix
- ES
- Prometheus
- Jaeger
的简单示例。
Stackdriver
1 | |
Influxdb
1 | |
Cloudwatch
基于 AKSK 的创建:
1 | |
这是基于 role (external) 的创建:
1 | |
Zabbix
1 | |
🐾 注意:
Zabbix 的 type 是
alexanderzobnin-zabbix-datasource
使用的前提是安装 Zabbix Grafana 插件.
Jaeger
1 | |
📝上面的 data "grafana_data_source" "jaeger-example" 是将 Jaeger Datasource 的 uid 提供给 ES 使用。
当然,如果你直接在创建 Jaeger Datasource 的时候指定了 uid, 如下所示,那么后面在被其他 Datasource 引用时可以直接指定写死。
1 | |
ES
1 | |
这里,有以下几个需要注意的地方:
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
基础配置如下:
1 | |
官方提供的 Prometheus 兼容实现 - Mimir 的配置如下:
1 | |
创建 Dashboard
在 dashboard.tf 中,创建 dashboard 示例如下:
1 | |
也可以通过如下方式创建:
1 | |
🐾注意:
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