Skip to main content

Create Grafana Org With Perl

·210 words·1 min
O11y | Cloud
Author
O11y | Cloud
Site Reliability Engineer
Table of Contents

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";