LTM Service Creation

Problem this snippet solves:

Looking for an example that adds Data Groups, iRules, Pools and Virtuals? Then this is just what you've been looking for, assuming your iRule is only a single line. Yes, for now creating iRules with iControl REST is a bit...tricky. If you can get things down to a single line it's doable, but otherwise you're likely going to struggle. This is something that's already roadmapped and being tracked, but I wanted to at least show you what's possible right now, out of the gates.

How to use this snippet:

Language

Python

Please, be aware that requests library (HTTP library for Python) depending on your environment, will require to be installed. use "sudo pip install requests" or "sudo easy_install requests" before moving forward with the python code below.

Code :

import requests, json

# define program-wide variables
BIGIP_ADDRESS = '192.168.100.1'
BIGIP_USER = 'admin'
BIGIP_PASS = 'admin'

VS_NAME = 'VS_Demo_DC1'
VS_ADDRESS = '172.16.1.1'
VS_PORT = '0'

RULE_NAME = 'Rule_Demo_'
RULE_CONTENT = 'when CLIENT_ACCEPTED { if { not ([class match [TCP::local_port] eq DG_Demo]) } { drop } }'
DATAGROUP_NAME = ' DG_Demo'
DATAGROUP_CONTENT = [ '80', '81', '82' ]

POOL_NAME = 'Pool_Demo'
POOL_LB_METHOD = 'least-connections-member'
POOL_MEMBERS = [ '192.168.100.200:80', '192.168.100.200:8080', '192.168.100.201:80', '192.168.100.201:8080' ]


#Create DataGroup
def create_dg(bigip, name):
payload = {}

payload['name'] = name
payload['type'] = 'string'
payload['records'] = [ { 'name' : record } for record in DATAGROUP_CONTENT ]
bigip.post('%s/ltm/data-group/internal' % BIGIP_URL_BASE, data=json.dumps(payload))

#Create iRule
def create_irule(bigip,name,content):
payload = {}

        payload['name'] = name
        payload['apiAnonymous'] = RULE_CONTENT
        bigip.post('%s/ltm/rule' % BIGIP_URL_BASE, data=json.dumps(payload))

# create/delete methods
def create_pool(bigip, name, members, lb_method):
payload = {}

# convert member format
members = [ { 'description' : 'Added through python REST script', 'name' : member } for member in POOL_MEMBERS ]

# define test pool
payload['name'] = name
payload['description'] = 'A Python REST client test pool'
payload['loadBalancingMode'] = lb_method
payload['monitor'] = 'http'
payload['members'] = members
bigip.post('%s/ltm/pool' % BIGIP_URL_BASE, data=json.dumps(payload))

def create_http_virtual(bigip, name, address, port, pool):
payload = {}

# define test virtual
payload['name'] = name
payload['description'] = 'A Python REST client test virtual server'
payload['destination'] = '%s:%s' % (address, port)
payload['mask'] = '255.255.255.255'
payload['ipProtocol'] = 'tcp'
payload['sourceAddressTranslation'] = { 'type' : 'automap' }
payload['profiles'] = [ 
{ 'kind' : 'ltm:virtual:profile', 'name' : 'http' }, 
{ 'kind' : 'ltm:virtual:profile', 'name' : 'tcp' }
]
payload['pool'] = pool
payload['rules'] = [ '/Common/%s' % RULE_NAME ]
bigip.post('%s/ltm/virtual' % BIGIP_URL_BASE, data=json.dumps(payload))

def delete_pool(bigip, name):
bigip.delete('%s/ltm/pool/%s' % (BIGIP_URL_BASE, name))

def delete_virtual(bigip, name):
bigip.delete('%s/ltm/virtual/%s' % (BIGIP_URL_BASE, name))

# REST resource for BIG-IP that all other requests will use
bigip = requests.session()
bigip.auth = (BIGIP_USER, BIGIP_PASS)
bigip.verify = False
bigip.headers.update({'Content-Type' : 'application/json'})
print "created REST resource for BIG-IP at %s..." % BIGIP_ADDRESS

# Requests requires a full URL to be sent as arg for every request, define base URL globally here
BIGIP_URL_BASE = 'https://%s/mgmt/tm' % BIGIP_ADDRESS

#create datagroup
create_dg(bigip, DATAGROUP_NAME)

#create iRule
create_irule(bigip, RULE_NAME, RULE_CONTENT)

# create pool
create_pool(bigip, POOL_NAME, POOL_MEMBERS, POOL_LB_METHOD)

# create virtual
create_http_virtual(bigip, VS_NAME, VS_ADDRESS, VS_PORT, POOL_NAME)
Published Mar 09, 2015
Version 1.0
No CommentsBe the first to comment