试图通过API创建grafana仪表板时,管理员用户出现权限被拒绝错误

2024-06-28 19:41:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将两个仪表板从一台服务器迁移到另一台服务器。为此,我使用pythonrequests库编写了一个非常简单的脚本

class Grafana:
    def __init__(self, url, key):
        self.headers = {
            'Accept': 'application/json', 
            'Content-Type': 'application/json', 
            'Authorization': 'Bearer ' + key
            }
        self.url = url

    def get_all_dashboard_uris(self):
        return (dashboard['uri'] 
        for dashboard in requests.get(self.url+'api/search?query=', headers=self.headers
        ).json())

    def import_dashboard(self, dashboard_uri):
       return requests.get(self.url+'api/dashboards/'+dashboard_uri, headers=self.headers).json()['dashboard']

    def create_dashboard(self, dashboard_object):           
        dashboard_object['id'] = None #id = null to create a new dashboard 
        #(https://grafana.com/docs/grafana/v4.1/http_api/dashboard/)
        return requests.post(self.url+'api/dashboards/db', headers=self.headers, json={'dashboard': dashboard_object})

if __name__ == '__main__':
    initial_grafana = Grafana(url=URL, key=KEY)
    final_grafana = Grafana(url=URL_TEST, key=KEY_TEST)

    for dashboard_uri in initial_grafana.get_all_dashboard_uris():
        dash = initial_grafana.import_dashboard(dashboard_uri)
        print(dashboard_uri)
        result = final_grafana.create_dashboard(initial_grafana.import_dashboard(dashboard_uri))
        print(result.status_code, result.text)
        print('')

问题是,这会为所有仪表板打印403 {"message":"Permission denied"}。即使尝试使用与文档建议完全相同的参数创建仪表板,我也会面临此问题:

def create_test_dashboard(self):
        dashboard_object = {
            'dashboard': {
                'id': None,
                'title': 'Production Overview',
                'tags': ['templated'],
                'timezone': 'browser',
                'rows': [{}],
                'schemaVersion': 6,
                'version': 0
            },
            'overwrite': False
            }
        return requests.post(self.url+'api/dashboards/db', headers=self.headers, json=dashboard_object)


if __name__ == '__main__':
   final_grafana = Grafana(url=URL_TEST, key=KEY_TEST)
   result = final_grafana.create_test_dashboard()

一些我认为很重要的简要说明:

1)如果在final_grafana对象中使用import_dashboard方法,我没有问题

2)如果我使用.json文件手动创建仪表板,则完全没有问题

3)我使用的是管理员角色用户

4)我正在使用Grafana 4.2

关于如何解决这个问题有什么想法吗?


Tags: keyselfapijsonurlobjectdefcreate