I recently had the need to add a couple of thousand host objects to our Infoblox IPAM solution since we were missing almost all our store routers, switches, wireless switches, APC UPS, printers, etc. With over 500+ stores and not having any interns available I wasn’t looking forward to the challenge of navigating the WEB UI within Infoblox to create over 2,500+ objects. Instead I decided to let the computer do the work and I wrote a quick and dirty little Perl script that could essentially loop over the subnets in a /16 network and create the host objects for each device one at a time. This isn’t particularly pretty but it got the job done for me and I’m posting it here in hopes that it will help someone else traveling the same path.
I started with the following cURL request since I needed to know what format the data had to be in;
curl -k1 -u username:password -H "Content-Type: application/json" -X POST https://infoblox.acme.com/wapi/v2.1/record:host -d '{"ipv4addrs":[{"ipv4addr":"10.1.1.250"}],"name":"store1-printer.acme.com","comment":"HP LaserJet Printer"}'
That cURL request would create a host object at 10.1.1.250 with the name of store1-printer.acme.com. I took that structure, and built some Perl code around it and got the following script;
#!/usr/bin/perl
#
# Filename: /usr/local/etc/infoblox-rest.pl
#
# Purpose: Perl code to create Infoblox host objects utilizing REST API
# interface. Used to create DNS objects across multiple subnets.
# This code will create host objects for all the routers, switches,
# APC UPS, servers, PC, etc. Since the IP address of those devices
# utilize the same last octect in each IP subnet and there is a
# standard naming convention to easily follow programatically.
#
# Notes: This code is really just an example of what's possible using
# the Infoblox REST API interface. I don't expect anyone to actually
# use this code directly, but hopefully they will learn how to
# use the REST API interface in Perl through this example.
#
# Author: Michael McNamara (mfm@michaelfmcnamara.com)
#
# Date: April 15, 2016
#
# Version: 1.0
#
# License:
# Copyright (C) 2016 Michael McNamara (mfm@michaelfmcnamara.com)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>
#
# Changes:
#
# April 30, 2016 (M.McNamara)
# clean up the code, add license
#
# Load Modules
use strict;
use warnings;
use utf8;
use REST::Client;
use JSON;
use MIME::Base64;
use Data::Dumper;
# Infoblox username and password
my $username = 'InfobloxUsername';
my $password = 'InfobloxPassword';
# Declare Variables
my $IP;
my $HOST;
my $NUM;
# Declare Infoblox URL
# replace infoblox.acme.com with your Infoblox URL or IP address
my $host = 'https://infoblox.acme.com/wapi/v2.1';
# Declare the HTML headers needed
my $headers = {Content_Type => 'application/json', Accept => 'application/json', Authorization => 'Basic ' . encode_base64($username . ':' . $password)};
# Declare the REST object
my $client = REST::Client->new();
# Link the REST object to the Infoblox URL
$client->setHost($host);
# Loop across all the subnets in the /16 network
for (my $i=1; $i<=100; $i++) {
# The IP is based on which subnet we're loop through
$IP = "10.246.$i.250";
# In some cases it's necessary to perform some arithmetic on the IP
$NUM = $i - 0;
# Let's determine what the DNS name should be for this object
$HOST = sprintf("store46%02d-printer.acme.com",$NUM);
# Let's echo to the screen the IP address and DNS name
print "IP = $IP \t HOST = $HOST\n";
# Let's set the JSON data set we're going to send to the REST API
my %json_data = ( ipv4addrs => [{
ipv4addr => $IP }],
name => $HOST,
comment => 'HP LasterJet Printer'
);
# Let's encode the JSON data before we send it
my $data = encode_json(\%json_data);
# Let's call the REST API interface and create the host object
$client->POST('/record:host',($data,$headers));
# Let's decode the result so we can see what happened (if debugging)
#my $response = decode_json ($client->responseContent());
# Let's print the respone
print Dumper( $client->responseContent() );
} #end for
exit;
###################################################
Cheers!
I ended up deploying ISC BIND 9.10.2-P3 across a mix of Windows 2003 and Windows 2008 domain controller servers, some 32-bit and some 64-bit.

