主頁 >  其他 > Grafana 系列-GaC-2-Grafana Terraform Provider 基礎

Grafana 系列-GaC-2-Grafana Terraform Provider 基礎

2023-06-20 08:44:54 其他

系列文章

  • 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_point
      • grafana_message_template
      • grafana_mute_timing
      • grafana_notification_policy
      • grafana_rule_group
  • Cloud
    • Resources
      • grafana_cloud_access_policy
      • grafana_cloud_access_policy_token
      • grafana_cloud_api_key
      • grafana_cloud_plugin_installation
      • grafana_cloud_stack
      • grafana_cloud_stack_api_key
      • grafana_cloud_stack_service_account
      • grafana_cloud_stack_service_account_token
      • grafana_machine_learning_holiday
      • grafana_machine_learning_job
      • grafana_machine_learning_outlier_detector
    • DataSources
      • grafana_cloud_ips
      • grafana_cloud_organization
      • grafana_cloud_stack
  • Grafana Enterprise
    • Resources
      • grafana_builtin_role_assignment
      • grafana_data_source_permission (AWS Managed Grafana 也有這個功能)
      • grafana_report
      • grafana_role
      • grafana_role_assignment
      • grafana_team_external_group
  • Grafana OSS
    • Resources
      • grafana_annotation
      • grafana_api_key
      • grafana_dashboard
      • grafana_dashboard_permission
      • grafana_data_source
      • grafana_folder
      • grafana_folder_permission
      • grafana_library_panel
      • grafana_organization
      • grafana_organization_preferences
      • grafana_playlist
      • grafana_service_account
      • grafana_service_account_permission
      • grafana_service_account_token
      • grafana_team
      • grafana_team_preferences
      • grafana_user
    • DataSources
      • grafana_dashboard
      • grafana_dashboards
      • grafana_data_source
      • grafana_folder
      • grafana_folders
      • grafana_library_panel
      • grafana_organization
      • grafana_organization_preferences
      • grafana_team
      • grafana_user
      • grafana_users
  • 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 實戰入門

下一篇:返回列表

標籤雲
其他(161295) Python(38242) JavaScript(25505) Java(18249) C(15237) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7258) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4603) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1968) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • Grafana 系列-GaC-2-Grafana Terraform Provider 基礎

    ## 系列文章 * [Grafana 系列文章](https://ewhisper.cn/tags/Grafana/) * [Terraform 系列文章](https://ewhisper.cn/tags/Terraform/) ## 概述 [前文](https://ewhisper.cn/pos ......

    uj5u.com 2023-06-20 08:44:54 more
  • 在 Debian 12 上安裝 KubeSphere 實戰入門

    > 老 Z,運維架構師,云原生愛好者,目前專注于云原生運維,云原生領域技術堆疊涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 ## 前言 ### **知識點** - 定級:**入門級** - KubeKey 安裝部署 KubeSphere 和 ......

    uj5u.com 2023-06-20 08:39:22 more
  • 100個物聯網專案(基于ESP32)2快速入門

    ## 2快速入門 你將需要IDE來撰寫你的代碼。我們推薦初學者使用Arduino IDE。雖然它不是最好的IDE,但它可以完成作業,而且對初學者來說是直接和容易使用的。在熟悉了Arduino IDE并發展到更復雜的專案后,你可能會發現利用VS Code與Platformio插件來代替它更為方便。 # ......

    uj5u.com 2023-06-20 08:29:21 more
  • 海外交友原始碼平臺搭建:基礎功能的實作(一)

    今天我要分享的功能是利用海外交友原始碼去實作,這兩個功能并不會引起我們的特別關注,但是,當我們在使用海外交友原始碼平臺時,它們卻時時刻刻陪伴著我們。 ......

    uj5u.com 2023-06-20 08:23:56 more
  • 【工程應用八】終極的基于形狀匹配方案解決(小模型+預生成模型+無

    我估摸著這個應該是關于形狀匹配或者模版匹配的最后一篇文章了(同時紙質旋轉和縮放),其實大概是2個多月前這些東西都已經弄完了,只是一直靜不下來心整理文章,提醒一點,這篇文章后續可能會有多次修改(但不會重新發文章,而是在后臺直接修改或者增加),所以有需要的朋友可以隨時重復查看。 ......

    uj5u.com 2023-06-20 08:23:26 more
  • 實時光線追蹤(3)Ray Casting

    [toc] 實時光追(Real-time Ray Tracing)往往是綜合了 sampling、ray casting、denoising 等各方面的方案,本文主要記錄的是 ray casting 這部分,但是術語可能更多仍然稱為 ray tracing。 # 硬體光追(Hardware Ray ......

    uj5u.com 2023-06-20 08:22:34 more
  • To ChatGPT:讓你更加隨意地使用所有ChatGPT應用

    現在其實已經有很多在線的llm服務了,當然也存在許多開源部署方案,但是不知道大家有沒有發現一個問題,目前基于ChatGPT開發的應用,都是使用的OpenAI的介面。換句話說,如果沒有OpenAI賬號,就沒有辦法使用這些應用。但是其實這些應用并不是強依賴于OpenAI的介面,其他的在線llm服務也是可 ......

    uj5u.com 2023-06-20 08:21:35 more
  • 一個資深測驗工程師面試一來就問我這些題目

    德瑪作為一個已經作業有10年經驗的測驗工程師,其間也輾轉了幾個大的互聯網公司,雖然確實缺少了一些穩定性,但同時也積累了一些面試的經驗,不才分享一些給大家。那么主要是針對測驗工程師的一些總結,對于其他的工種,我可能會在別的文章中去總結一些面試技巧,本文會著重于測驗工程師的面經。 ......

    uj5u.com 2023-06-20 08:21:22 more
  • 【解決方法】銳捷 EVE 模擬器關聯 Wireshark 進行抓包

    # 環境: >工具:銳捷 EVE 模擬器,VMware Workstation Pro 抓包工具:Wireshark 系統版本:Windows 10 # 問題描述: >描述:使用銳捷 EVE 模擬器抓包,點擊后無反應,網上的方法要么亂寫,亂抄,要么不夠仔細。故自己寫一遍。 >提示:若按照教程還是無法 ......

    uj5u.com 2023-06-20 08:20:51 more
  • 【解決辦法】DHCP Relay環境中PC無法獲取IP地址,排錯與解法

    # 環境: >工具:銳捷EVE模擬器,VMware Workstation Pro 遠程工具:SecureCRT 系統版本:Windows 10 # 問題描述: >描述:在 DHCP Relay 環境中,中繼和服務器能正常互通,但是通過抓包發現,PC 客戶端發送的報文并沒有被正常的轉發給 DHCP ......

    uj5u.com 2023-06-20 08:20:26 more