iT邦幫忙

2024 iThome 鐵人賽

DAY 14
1
DevOps

後 Grafana 時代的自我修養系列 第 14

後 Grafana 時代的第十四天 - Gafana IaC 工具 - Terraform 與 Grafana Provider 介紹

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240928/20149562XJWTuD8cyO.png

前言

Terraform 的誕生很大程度上源於人們逐漸對手動操作基礎設施平台(如 AWS、GCP)的管理感到吃力,隨著架構日益複雜,這種手動操作往往超出了團隊的負擔。當我們需要重新搭建基礎設施時,往往耗時耗力,只能從團隊成員殘存的零碎文件中拼湊出真實的面貌。這種情境如果放到 Grafana 上也是同樣的道理,我們面對來自不同團隊、對 Grafana 熟悉度各異的資源注入時,無論是 Dashboard、Folder 還是 Alert,所感受到的混亂不亞於當初接手雜亂無章的基礎設施。而兩者最大的共同點就是都可以通過 Terraform 實現良好的設定檔管理。因此,接下來我們將進入如何使用 Terraform 有效管理 Grafana 的進階應用章節,請抓緊,我們準備起飛!

Terraform 核心概念

https://ithelp.ithome.com.tw/upload/images/20240928/20149562sC5F1aKMLh.png

Terraform 是一款由 HashiCorp 開發的強大基礎設施即代碼(Infrastructure as Code,IaC)工具,也是目前 DevOps/SRE 社群中最受歡迎也最多人在使用的基礎架構管理工具。其核心理念是通過程式碼來定義、預覽和部署基礎設施,而非依賴手動操作或腳本,這也是我們選擇其作為管理 Grafana 的原因之一。

這種方法帶來了幾個關鍵優勢:

  • 一致性:通過程式碼定義基礎設施確保了環境的一致性,減少了人為錯誤。
  • 版本控制:基礎設施設定可以像應用程式碼一樣進行版本控制。
  • 自動化:可以輕鬆集成到 CI/CD 流程中,實現基礎設施部署的自動化。
  • 可重複性:相同的設定可以用於創建多個相同的環境。
  • 可審計性:所有的基礎設施變更都可以通過程式碼審查來追踪和審計。
  • 協作:團隊成員可以更容易地共享和協作基礎設施設定。

Terraform 工作原理

https://ithelp.ithome.com.tw/upload/images/20240928/20149562hSaA1cAIUl.png

Terraform 的工作流程主要包含三個階段:

  1. Write(編寫):使用 HashiCorp Configuration Language (HCL) 或 JSON 編寫描述所需基礎設施的設定檔。
  2. Plan(規劃):Terraform 創建一個執行計劃,顯示它將執行哪些操作來達到所需狀態。
  3. Apply(應用):Terraform 執行計劃中的操作,創建、更新或刪除基礎設施資源。

讓我們深入了解每個階段:

Write(編寫)

在這個階段,開發者使用 HCL 或 JSON 來描述期望的基礎設施狀態。HCL 是 Terraform 的首選語言,因為它非常易讀和易寫。

例如:

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  tags = {
    Name = "ExampleInstance"
  }
}

這段程式碼非常簡單明瞭的定義了一個 AWS EC2 實例。

Plan(規劃)

執行 terraform plan 命令時,Terraform 會:

  1. 讀取當前的狀態檔(如果存在)
  2. 掃描設定檔
  3. 確定需要進行哪些更改以達到期望的狀態
  4. 生成一個執行計劃

這個階段不會實際修改任何基礎設施,而是提供了一個預覽,讓你可以在實際應用更改之前審查它們。

而我們將上面的 EC2 設定運作後,期望會出現以下結果:

Terraform will perform the following actions:

  # aws_instance.example will be created
  + resource "aws_instance" "example" {
      + ami                          = "ami-0c55b159cbfafe1f0"
				// ...
      + instance_type                = "t2.micro"
      + tags                         = {
          + "Name" = "ExampleInstance"
        }
				// ...
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Apply(應用)

執行 terraform apply 命令時,Terraform 會:

  1. 再次執行 plan 階段
  2. 提示使用者確認是否執行計劃(除非使用 auto-approve 標誌)
  3. 按照計劃順序執行操作
  4. 更新狀態文件以反映新的基礎設施狀態

Terraform Grafana Provider 介紹

https://ithelp.ithome.com.tw/upload/images/20240928/20149562PU2lbLZqUy.png

接下來我們就要實際透過 Terraform 的 Grafana Provider 當作我們實踐 Grafana IaC 的媒介。Grafana Provider 是 Terraform 的一個擴展,它允許使用者通過 Terraform 設定來管理 Grafana 資源。這種整合為 Grafana 的設定管理帶來了 IaC 的所有優勢。使用 Grafana Provider,你可以以聲明式的方式管理 Grafana 的各種資源,確保設定的一致性和可重複性。

Terraform Grafana Provider 的第一步

使用 Grafana Provider 的入門方式與其他在 Terraform 中的 Provider 資源並無太大差異。首先,我們需要對即將搭建的基礎設施中的各類 Grafana 資源有充分的了解,包括 Dashboard、Datasource、Folder 和 Alert 等。熟悉這些資源之後,我們要將它們逐一分類拆解,確保每個部分的配置能夠清楚定義。

接下來,我們可以充分利用 Terraform 提供的高效語法功能,如模組化管理、迭代和條件語句,來優雅地將這些資源整合在一起。這不僅使得基礎設施的自動化配置變得更加簡單且具可讀性,也為未來的維護和擴展提供了更靈活的框架。

以下是 Grafana OSS 版本中提供的 Resource:

Grafaba OSS:

  • grafana_annotation
  • grafana_dashboard
  • grafana_dashboard_permission
  • grafana_dashboard_permission_item
  • grafana_dashboard_public
  • grafana_data_source
  • grafana_data_source_config
  • grafana_folder
  • grafana_folder_permission
  • grafana_folder_permission_item
  • grafana_library_panel
  • grafana_organization
  • grafana_organization_preferences
  • grafana_playlist
  • grafana_service_account
  • grafana_service_account_permission
  • grafana_service_account_permission_item
  • grafana_service_account_token
  • grafana_sso_settings
  • grafana_team
  • grafana_user

Grafana Alerting:

  • grafana_contact_point
  • grafana_message_template
  • grafana_mute_timing
  • grafana_notification_policy
  • grafana_rule_group

現在,我們將所有的 Grafana Provider 資源收斂成四個部分:

  • Datasource 管理:創建資料源和資料員設定管理。
  • User 和 Team 管理:創建和管理使用者帳號和團隊。這包括設置使用者權限、創建和管理團隊,以及分配使用者到特定團隊。
  • Dashboard 和 Folder 管理:創建、更新和刪除 Dashboard。你可以定義整個 Dashboard 相關的所有資源,包括 Panel、變量和註釋。
  • Alert 規則設置:定義和管理 Grafana 的 Alert 規則,可以設置 Alert 條件、通知管道和靜默期間等。

如此一來,我們就能將 Grafana 的資源管理化繁為簡,根據不同的功能需求進行系統化的處理。這種方式不僅使我們能夠輕鬆管理使用者、團隊和權限配置,還能通過 Terraform 提供的語法高效地定義和部署 Datasource、Dashboard 和 Folder 等關鍵資源。同時,針對 Alert 規則的精細化設置也能幫助我們在 Grafana 中實現全面且靈活的監控告警系統,確保即時通知和可靠的告警機制。

實戰演練

首先,讓我們將安裝在本地 Kubernetes 叢集中的 Grafana 端點暴露出來:

kubectl port-forward service/grafana 3000:80 -n grafana
------
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000

我們就能在本機中的 localhost:3000 成功查看到登入介面,這也代表我們的 Terraform Grafana Provider 可以透過這個端點管理該 Grafana 資源。

https://ithelp.ithome.com.tw/upload/images/20240928/20149562v435ay59XY.png

接下來,這裡是一個基本的 Grafana Provider 設定範例:

# main.tf
terraform {
  required_providers {
    grafana = {
      source  = "grafana/grafana"
      version = "~> 3.7.0"
    }
  }
}

provider "grafana" {
  url  = "http://localhost:3000"
  auth = "admin:admin" # apikey or accountname:password
}

resource "grafana_folder" "example_folder" {
  title = My Example Folder
}

resource "grafana_dashboard" "example_dashboard" {
  folder      = grafana_folder.example_folder.id
  config_json = jsonencode({
    "title" : My Example Dashboard,
    "uid" : "example-dashboard",
    "panels" : [
      {
        "id" : 1,
        "title" : "Example Panel",
        "type" : "graph",
        "datasource" : "Prometheus",
        "targets" : [
          {
            "expr" : "up",
            "refId" : "A"
          }
        ]
      }
    ]
  })
}

現在我們就能夠使用 Terraform 指令執行 Init 以及 Apply 來安裝套用 Grafana 設定:

terraform init
terraform apply
---
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following
symbols:
  + create

Terraform will perform the following actions:

  # grafana_dashboard.example_dashboard will be created
  + resource "grafana_dashboard" "example_dashboard" {
      + config_json  = jsonencode(
            {
              + panels = [
                  + {
                      + datasource = "Prometheus"
                      + targets    = [
                          + {
                              + expr  = "up"
                              + refId = "A"
                            },
                        ]
                      + title      = "Example Panel"
                      + type       = "graph"
                    },
                ]
              + title  = "My Example Dashboard"
              + uid    = "example-dashboard"
            }
        )
      + dashboard_id = (known after apply)
      + folder       = (known after apply)
      + id           = (known after apply)
      + slug         = (known after apply)
      + uid          = (known after apply)
      + url          = (known after apply)
      + version      = (known after apply)
    }

  # grafana_folder.example_folder will be created
  + resource "grafana_folder" "example_folder" {
      + id    = (known after apply)
      + title = "My Example Folder"
      + uid   = (known after apply)
      + url   = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

grafana_folder.example_folder: Creating...
grafana_folder.example_folder: Creation complete after 0s [id=12]
grafana_dashboard.example_dashboard: Creating...
grafana_dashboard.example_dashboard: Creation complete after 0s [id=example-dashboard]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

看到 Terraform 執行成功的指示後,我們也能即時在 localhost:3000/dashboards 端口中,查看設定資源部署的情況:

https://ithelp.ithome.com.tw/upload/images/20240928/201495624QvupYg22x.png

大功告成!恭喜你已經成功的進入 Grafana IaC 的領域,透過程式碼設定來控制 Grafana 資源。在此範例中我們指定了 Grafana Provider 和其版本、建立了一個 Folder 並且在其之下建立了一個 Dashboard。

結論

透過本章節,我們了解了如何使用 Terraform 管理 Grafana 資源,並逐步實現將 Grafana 完整納入基礎設施即代碼(IaC)的範疇。在現代 DevOps 團隊中,基礎設施管理的自動化和可重複性至關重要,透過 Terraform,我們可以有效地管理 Grafana 的 Dashboard、Datasource、Alert 等資源,確保配置的一致性和版本控制。

從 Grafana Provider 的安裝、資源的定義,到將其與 Kubernetes 等其他基礎設施無縫結合,我們已經掌握了這一強大工具的基本使用方式。這不僅提高了我們的工作效率,也減少了傳統手動操作中容易出現的錯誤與混亂。


References:


上一篇
後 Grafana 時代的第十三天 - Gafana IaC 工具 - Jsonnet 介紹
下一篇
後 Grafana 時代的第十五天 - Gafana IaC 實戰 - 使用 Terraform 動態產生 Grafana 資源
系列文
後 Grafana 時代的自我修養31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言