Grafana 系列-GaC-2-Grafana Terraform Provider 基础
系列文章
概述
前文最后总结了我的工具选型:
- 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" = "client-email@default-project.iam.gserviceaccount.com"
})
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
Grafana 系列-GaC-2-Grafana Terraform Provider 基础的更多相关文章
- ldap配置系列三:grafana集成ldap
ldap配置系列三:grafana集成ldap grafana的简介 grafana是一个类似kibana的东西,是对来自各种数据源的数据进行实时展示的平台,拥有这牛逼的外观.给一个官方的demo体验 ...
- Grafana 系列文章(一):基于 Grafana 的全栈可观察性 Demo
️Reference: https://github.com/grafana/intro-to-mlt 这是关于 Grafana 中可观察性的三个支柱的一系列演讲的配套资源库. 它以一个自我封闭的 D ...
- Grafana 系列文章(二):使用 Grafana Agent 和 Grafana Tempo 进行 Tracing
️URL: https://grafana.com/blog/2020/11/17/tracing-with-the-grafana-cloud-agent-and-grafana-tempo/ ✍A ...
- Grafana 系列文章(三):Tempo-使用 HTTP 推送 Spans
️URL: https://grafana.com/docs/tempo/latest/api_docs/pushing-spans-with-http/ Description: 有时,使用追踪系统 ...
- Grafana 系列文章(四):Grafana Explore
️URL: https://grafana.com/docs/grafana/latest/explore/ Description: Explore Grafana 的仪表盘 UI 是关于构建可视化 ...
- Grafana 系列文章(五):Grafana Explore 查询管理
️URL: https://grafana.com/docs/grafana/latest/explore/query-management/ Description: Explore 中的查询管理 ...
- Grafana 系列文章(六):Grafana Explore 中的日志
️URL: https://grafana.com/docs/grafana/latest/explore/logs-integration/#labels-and-detected-fields D ...
- Grafana 系列文章(七):Grafana Explore 中的 Tracing
️URL: https://grafana.com/docs/grafana/latest/explore/trace-integration/ Description: Tracing in Exp ...
- Grafana 系列文章(八):Grafana Explore 中的 Inspector
️URL: https://grafana.com/docs/grafana/latest/explore/explore-inspector/ Description: Explore 中的检查器 ...
- Grafana 系列文章(九):开源云原生日志解决方案 Loki 简介
简介 Grafana Labs 简介 Grafana 是用于时序数据的事实上的仪表盘解决方案.它支持近百个数据源. Grafana Labs 想从一个仪表盘解决方案转变成一个可观察性 (observa ...
随机推荐
- 使用Electron-builder将web项目封装客户端安装包 发布
背景:之前用electron-packager将web项目打包成客户端时,exe文件只能在当前文件夹下运行,如果发送给别人使用 极不方便.所以我们可以用electron-builder将web项目封装 ...
- VUE零碎小技巧1
1.回顾 创建项目 vue create myapp 准备 scss 库 修改了页面的主结构 App.vue 构建页面的基本结构 分离页面主结构,创建各个页面组件 views views/home/i ...
- 关于Docker compose值IP与域名的映射 之 extra_host
公司的所有项目都是采用Docker容器化部署,最近有一个项目需要使用定时任务调用第三方Api,正式web环境服务器的网络与第三方网络是通畅的,但是当将代码发布到正式环境,调用接口却显示 System. ...
- 【Jenkins系列】-Pipeline语法全集
Jenkins为您提供了两种开发管道代码的方式:脚本式和声明式. 脚本式流水线(也称为"传统"流水线)基于Groovy作为其特定于域的语言. 而声明式流水线提供了简化且更友好的语法 ...
- FreeSWITCH的originate命令解析及示例
FreeSWITCH版本:1.10.9 操作系统:CentOS 7.6.1810 originate经常用于发起呼叫,在实际工作过程中用到的也比较多,今天总结下基本用法,也方便我以后查阅. 一.wik ...
- 人人都学会APP开发 提高就业竞争力 简单实用APP应用 安卓浏览器APP 企业内部通用APP制作 制造业通用APP
安卓从2009年开始流程于手机.平板,已经是不争的非常强大生产力工具,更为社会创造非常高的价值, 现在已经是202X年,已经十几年的发展,安卓平台已经无所不在. 因此建议人人都学学APP制作,简易入门 ...
- IO流中「线程」模型总结
目录 一.基础简介 二.同步阻塞 1.模型图解 2.参考案例 三.同步非阻塞 1.模型图解 2.参考案例 四.异步非阻塞 1.模型图解 2.参考案例 五.Reactor模型 1.模型图解 1.1 Re ...
- mongoDB操作指南
目录 1. docker安装mongoDB 2. 库-database 3. 集合-collection 3.1 命名规范 3.2 增-createCollection 3.3 删-drop 4. 文 ...
- Spring Boot 中使用 Redis
Redis 环境 redis 安装.配置,启动:(此处以云服务器上进行说明) 下载地址:https://redis.io/download/ 下载后上传到云服务器上,如 /usr/local 中 gc ...
- Android Studio 样式和主题背景
样式和主题背景 转载自 Styles and Themes | Android Developers 借助 Android 中的样式和主题背景,您可以将应用设计的细节与界面的结构和行为分开,其 ...