For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

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