• 正文
  • 相关推荐
申请入驻 产业图谱

手把手教你用 Git 仓库(GitLab)管理仪表盘,轻松协作回滚

15小时前
192
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

原标题:还在手动备份Grafana面板?手把手教你用 Git 仓库(GitLab)管理仪表盘,轻松协作回滚

如何将 Grafana 中的仪表盘同步存储到 Gitlab 私有代码仓库?

描述:上一篇文章说到,由于 Grafana 出现了几个高危的安全漏洞,作者将原本的 12.0.2版本,升级到最新的 grafana:13.0.1-security-01 版本,升级后发现一个新功能查看和管理已配置的存储库,其支持在 Git 中(Github、Gitlab 私有、本地网络共享目录)将数据面板作为代码进行管理,并自动预置更新,将数据面板存储在版本控制的存储中,以便更好地整理内容和跟踪历史记录。

该功能对于多人协作的团队来说非常有用,可以确保每个人都在使用最新的数据面板版本,并且可以轻松地回滚到旧版本。遂作者立马浅尝了一下,将内部搭建 Gitlab 私有仓库为例进行演示对接。

温馨提示:Grafana 缺省可配置 10 个连接的存储库,即最多可配置 10 个 Git 仓库,如果需要更多连接,则需要修改配置文件 grafan.ini 中的 max_concurrent_connections 值。

什么是 git-sync ?

描述:git-sync 是 Grafana 中的一个插件,该插件是在 Grafana v12 开源版和 Enterprise 版本中引入,Git Sync 允许你同步资源,从而将仪表盘存储为任何 Git 提供商的 JSON 文件,并以代码形式管理,我们可以高效地进行版本控制、协作和自动化部署。

工作原理:

Git Sync 允许你将外部资源与 Grafana 实例连接起来。设置后,所有同步的资源都存放在 Git 的配置文件夹下,你也可以继续使用该文件夹外的非配置资源。

Git 同步是双向的。你可以从Grafana界面或同步仓库修改已配置的资源,变更都会在两者中反映。

Git Sync 通过 Pure Git 仓库类型对任何 Git 提供商开放,并针对 GitHub、GitLab 和 Bitbucket 提供了专门的增强集成。

使用场景:

版本控制与审计: 组织可以维护 Grafana 仪表盘的结构化、版本控制历史。

自动化部署与CI/CD集成: 团队可以通过将仪表盘更新集成到CI/CD流水线中来简化工作流程。

协作仪表盘开发: 通过 Git Sync,多个用户可以同时处理仪表盘,而不会覆盖彼此的修改,基于分支的工作流程,还可合并到主分支。

多环境同步:管理多个Grafana实例(如开发、预备和生产环境)的企业可以无缝同步仪表盘。

容灾备份:通过持续同步仪表盘到GitHub,组织可以创建一个始终更新的备份,确保仪表盘不会因意外删除或系统故障而丢失。

最后,为了便于看友们实践,作者将分别介绍配置以及使用 git-sync 的操作步骤,在此之前,相信你已经准备好了 Grafana (版本:13.0.1-security-01)以及 Gitlab 代码仓库,若还没安装部署对应环境的可参考如下知识星球文章。

[Grafana | 开源的可视化平台初识到云原生环境下部署实践]:https://articles.zsxq.com/id_gkzolgtmxflo.html

[GitLab | 企业私有代码仓库介绍与快速安装部署]:https://articles.zsxq.com/id_0md13kj1zmlb.html

如何配置 git-sync 插件?

步骤 01.首先,在 Gitlab 私有代码仓库中创建一个 dashboard 项目(名称可自定义),勾选使用[v]使用自述文件初始化仓库,然后点击创建项目。

步骤 02.创建完毕后,进入到项目设置 >> 访问令牌,点击创建个人访问令牌,勾选 api 权限,然后点击创建即可,之后将生成好的令牌复制下来,例如 glpat-3QgGbNVPTYsWi_f_UXh9,稍后将用到。

步骤 03.接下来,在 Grafana 中配置 git-sync,点击 管理 >> 概况 >> Provisioning,再点击 存储库,在配置下拉按钮中选择纯 Git,将如下图所示,将第二步生成的令牌以及git 项目地址填入,然后点击配置存储库

温馨提示:若此步骤提示错误,可在文章末尾查阅到常见错误的解决办法,这也是作者所遇到的。

步骤 04.在配置存储库界面,选择默认分支(通常为 master、main)以及文件夹(可选),然后点击选择要同步的内容,这里大家可自定义显示名称,到时会在仪表中看到,然后点击选择附加设置

步骤 05.之后,在进行同步频率以及勾选保存时启用拉取请求选择,以及启用同步分支。

步骤 06.创建完毕后,便可在页面中查看到同步仓库的状态信息,以及操作更新日志等。

至此,我们完成了 Gitlab 私有仓库与 Grafana 的对接,接下来便可将仪表盘同步到 Gitlab 中进行版本控制了。

如何使用 git-sync 插件?

步骤 01.首先,点击仪表盘,选择前面自定义设置的仓库(存储名称)名称,例如:devops/dashboard.git 存储库。

步骤 02.接下来,创建一个名为 Test 的目录,是不是有点类似于 Gitlab 中提交文件夹的操作,没错完一致,在 Grafana 仪表盘中创建的目录,也会同时提交到 Gitlab 仓库中的 dashboard 项目中。

步骤 03.在 Test 目录下,创建一个新的仪表盘,例如:GitRsyncDashboard,创建过程中可选择目录文件,以及保存分支和仪表盘文件名称,例如:GitRsyncDashboard-2026-05-27-j746.json

步骤 04.之后,在该仪表盘下创建数据面板,例如,查询 categraf agent的 golang 版本信息,使用 Table 面板,并添加查询语句:categraf_go_info{job="categraf_linux"}

步骤 05.创建完毕后,将会弹出一个对话框,显示已同步到的 Git 仓库。

步骤 06.接下来,进入到 Gitlab 私有仓库 dashboard 中查看,会发现已经将创建仪表盘JSON文件同步过来了。

步骤 07.然后,在 Gitlab 中尝试修改仪表盘文件,例如:将面板的名称改成 监控服务信息-更新测试,之后回到 Grafana > Provisioning 手动同步,或等待 60s 后自动同步。

步骤 08.同步完毕后,在 Grafana 中查看仪表盘,会发现面板名称已经更新为 监控服务信息-更新测试

步骤 09.在仪表盘中添加的Git存储库,无法直接将现有的 dashboard 进行移动和导入,若要导入只能通过 git pull/push 将我们导出的面板json上传到 devops/dashboard.git 仓库中;另外,如果是同一台机器导入的记得更改面板模板文件中的 metadata.name指,不能与现有的重复,否则会导入失败。

至此, 作者已经将 Grafana 中的仪表盘同步存储到 Gitlab 私有代码仓库中了,后续便可基于此进行版本控制了。

入坑出坑

问题1.在配置 git-sync 插件连接 Git 仓库时,由于 grafana 在 k8s 中部署 集群 dns 未解析到部署的 gitlab 域名:

纯文本

Error validating repository
list refs: list refs: send ls-refs command: Post "https://git.weiyigeek.top/devops/dashboard.git/git-upload-pack": dial tcp: lookup git.weiyigeek.top on 10.96.0.10:53: no such host

解决办法:在 kubernetes 集群中使用 deployment 部署 grafana 时为其指定 hostAliases,例如:

纯文本

$ kubectl edit deployments.apps -n dashboard grafana-server
....
 dnsPolicy: ClusterFirst
  hostAliases:
  - hostnames:
    - auth.weiyigeek.top
    ip: 192.168.10.61
  - hostnames:
    - git.weiyigeek.top
    ip: 192.168.10.62
  restartPolicy: Always
....

问题2.在配置 git-sync 插件连接 Git 仓库时,由于企业内部 gitlab 服务采用自签证书,连接时报如下错误:

纯文本

Error validating repository
list refs: list refs: send ls-refs command: Post "https://git.weiyigeek.top/devops/dashboard.git/git-upload-pack": tls: failed to verify certificate: x509: certificate signed by unknown authority

问题原因:由于自签证书不被服务器信任,导致连接失败。

解决办法:使用插件时跳过证书验证,在 k8s 中编辑 configmap 配置文件,添加如下参数,之后重启 pod 即可。

纯文本

# 步骤 01.插件跳过证书验证
$ kubectl edit configmap -n dashboard grafana-server
...
[plugins]
app_tls_skip_verify_insecure=true

# 步骤 02.复制CA证书(需要先将证书复制到容器,可用 docker cp)
# docker cp your-git-ca.crt grafana:/tmp/
cd /tmp && wget http://10.20.172.106:8080/Root-CA.crt 
cp /tmp/your-git-ca.crt /usr/local/share/ca-certificates/
# 更新信任库
update-ca-certificates

# 步骤 03.将证书复制到持久化目录中,以便于下次执行。
mkdir /var/lib/grafana/certs/
cp /usr/local/share/ca-certificates/Root-CA.crt /var/lib/grafana/certs/
tee update_ssl.sh<<'EOF'
#!/bin/bash
cp /var/lib/grafana/certs/Root-CA.crt /usr/local/share/ca-certificates/
# 更新信任库
update-ca-certificates/
EOF

问题3.导入仪表盘时,由于面板模板文件中的 metadata.name 与现有的重复,导致导入失败。

错误信息:

纯文本

writing resource from file dashboard-1779928713682.json: resource validation failed: resource '5bb2b435-0bf9-48be-bc54-f95e01c98a3f' already exists and is not managed; repo 'rh2qvf' cannot take over without an explicit migration (file: dashboard-1779928713682.json, name: 5bb2b435-0bf9-48be-bc54-f95e01c98a3f, action: created)

解决办法:在导入面板模板文件前,先修改 metadata.name 字段值,在 push 到 git 仓库中。

纯文本

{
  "apiVersion": "dashboard.grafana.app/v2",
  "kind": "Dashboard",
  "metadata": {
    "name": "5bb2b435-0bf9-48be-bc54-f95e01c98a39",  // 修改此处值,使其唯一性
    "generation": 41,
    "creationTimestamp": "2026-05-21T10:53:27Z",
    "labels": {},
    "annotations": {}
  },
...
}

参考地址:https://grafana.com/docs/grafana/latest/as-code/observability-as-code/git-sync/

 

温馨提示:若文章代码块中存在乱码或不能复制,请联系作者,也可通过文末的阅读原文链接,加入知识星球中阅读,原文链接:https://articles.zsxq.com/id_e51g5o55wwfs.html

加入:作者知识星球

相关推荐