Intro

Grafana API allows us to automate admin tasks. We have big number of Orgs mapped to Azure AD groups and we were looking for a way to automate provisioning.

Process goes like this: create new Org, provision datasources (with same UIDs), provision dashboards (with same UIDs). In this way all dashboards are working within the Org resusing all URLs, etc…

Simple Perl Script to Provision Grafana ORG

#! /usr/bin/perl
use HTTP::Tiny;
use JSON::MaybeXS;
use MIME::Base64 qw(encode_base64);

my $user = $ENV{'USER'};
my $pass = $ENV{'PASS'};

my %url = ('dev' => 'https://dev-grafana/api/orgs', 'prod' => 'https://prod-grafana/api/orgs');

if(@ARGV != 2) { 
	die "Usage: $0 <org-name> <dev|prod>\n";
}
my $org_name = $ARGV[0];
my $environment = $ARGV[1];

die "Environment must be dev or prod\n" if $environment !~ /^(dev|prod)$/;


# Create ORG and Get Org ID
my $data = { name => $org_name };
my $json = encode_json($data);
my $http = HTTP::Tiny->new;
my $credentials = encode_base64("$user:$pass", '');  # no newline
my $org_id;
my $headers = {
	"Content-Type" => "application/json",
	"Authorization" => "Basic $credentials"
};

my $response = $http->request( 'POST', $url{$environment}, { headers => $headers, content => $json });

if ($response->{success}) {
	my $resp_data = decode_json($response->{content});
	$org_id = $resp_data->{orgId};
	
} else {
	die "Failed to create org: $response->{status} $response->{reason}\n";
}

print "Created org ID: $org_id\n";