Forum Discussion
Query to retrieve VIP name from Node IP input
- Jun 06, 2018
This should do it, though it is fairly resource-intensive if you have a lot of virtual servers / pools / nodes:
!/usr/bin/env python3 from f5.bigip import ManagementRoot from getpass import getpass from pprint import pprint hostname = 'my.f5.ltm.net' username = 'foo' node_ips = ['192.168.1.1', 192.168.1.2', '192.168.1.3'] mgmt = ManagmentRoot(hostname, username, getpass()) Get node names that have IPs in the list nodes = [] for node in mgmt.tm.ltm.nodes.get_collection(): if node.address in node_ips: fullPath is /PARTITION/NAME nodes.append(node.fullPath) Get pool names which nodes in list belong pools = [] for pool in mgmt.tm.ltm.pools.get_collection(): members = pool.members_s.get_collection() for member in members: Member fullpath is '/PARTITION/NODENAME:SERVICE_PORT' if member.fullPath.split(':')[0] in nodes: pools.append(pool.fullPath) break Get virtual server names which pools in list belong virtuals = [] for virtual in mgmt.tm.ltm.virtuals.get_collection(): if hasattr(virtual, 'pool') and virtual.pool in pools: virtuals.append(virtual.fullPath) pprint(virtuals)
This should do it, though it is fairly resource-intensive if you have a lot of virtual servers / pools / nodes:
!/usr/bin/env python3
from f5.bigip import ManagementRoot
from getpass import getpass
from pprint import pprint
hostname = 'my.f5.ltm.net'
username = 'foo'
node_ips = ['192.168.1.1', 192.168.1.2', '192.168.1.3']
mgmt = ManagmentRoot(hostname, username, getpass())
Get node names that have IPs in the list
nodes = []
for node in mgmt.tm.ltm.nodes.get_collection():
if node.address in node_ips:
fullPath is /PARTITION/NAME
nodes.append(node.fullPath)
Get pool names which nodes in list belong
pools = []
for pool in mgmt.tm.ltm.pools.get_collection():
members = pool.members_s.get_collection()
for member in members:
Member fullpath is '/PARTITION/NODENAME:SERVICE_PORT'
if member.fullPath.split(':')[0] in nodes:
pools.append(pool.fullPath)
break
Get virtual server names which pools in list belong
virtuals = []
for virtual in mgmt.tm.ltm.virtuals.get_collection():
if hasattr(virtual, 'pool') and virtual.pool in pools:
virtuals.append(virtual.fullPath)
pprint(virtuals)
- paul_dawson_258Jun 08, 2018
Nimbostratus
Thanks Jason, how can I output them on one line i.e. [node_ip, node, pool, virtual].
I'm not strong on Python.
- Jason_Nance_333Jun 11, 2018
Cirrus
Give this version a try. It will print the same virtual server / pool multiple times - one for each member (node) with an IP in the list. Please make sure to spot check this before relying on its data as it was done quickly and I could have easily overlooked some detail.
!/usr/bin/env python3 from f5.bigip import ManagementRoot from getpass import getpass from pprint import pprint hostname = 'my.f5.ltm.net' username = 'foo' node_ips = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] mgmt = ManagmentRoot(hostname, username, getpass()) Get node names that have IPs in the list nodes = {} for node in mgmt.tm.ltm.nodes.get_collection(): if node.address in node_ips: fullPath is /PARTITION/NAME (or /PARTITION/SUB_PATH/NAME) nodes[node.fullPath] = node.address Get pool names which nodes in list belong pools = {} for pool in mgmt.tm.ltm.pools.get_collection(): members = pool.members_s.get_collection() for member in members: Member fullpath is /PARTITION/NODENAME:SERVICE_PORT (or /PARTITION/SUB_PATH/NODENAME:SERVER_PORT) if member.fullPath.split(':')[0] in nodes: if pool.fullPath in pools: pools[pool.fullPath].append(member.fullPath.split(':')[0]) else: pools[pool.fullPath] = [member.fullPath.split(':')[0]] Get virtual server names which pools in list belong virtuals = {} for virtual in mgmt.tm.ltm.virtuals.get_collection(): if hasattr(virtual, 'pool') and virtual.pool in pools: virtuals[virtual.fullPath] = virtual.pool Print CSV print('Node IP,Node,Pool,Virtual') Use iteritems() instead of items() with Python 2.x for virtual, pool in virtuals.items(): for node in pools[pool]: print('{},{},{},{}'.format( nodes[node], node, pool, virtual, )) - paul_dawson_258Jun 14, 2018
Nimbostratus
Thanks Jason this is extremely helpful and working. I just have one last question. As we are using route domains and there is a % in the node_ip, we have to put the route domain in for the script to find the associated Pools/VIPs etc. Is there any way to query the DB without having to include the partition in the node_ip?
Thanks again for your help.
- Jason_Nance_333Jun 14, 2018
Cirrus
That notation (
) is called a route domain. There's a couple ways to deal with it depending on your situation but it can be a bit iffy if you have duplicate IPs in use on a different route domains (one of the primary reasons to use route domains).w.x.y.z%somethingThe easy/cheesy option is to use a little script to generate the
list for you with the route domains included:node_ips!/usr/bin/env python3 from f5.bigip import ManagementRoot from getpass import getpass from pprint import pprint hostname = 'my.f5.ltm.net' username = 'foo' Node IPs without route domain node_ips_wo_rd = ['192.168.1.1', '192.168.1.2', '192.168.1.3'] node_ips = [] mgmt = ManagmentRoot(hostname, username, getpass()) Pull back all nodes that have an IP in the list (regardless of route domain) and print out a list with the route domain included This will be slow for LTMs with lots of nodes for node in mgmt.tm.ltm.nodes.get_collection(): if node.address.split('%')[0] in node_ips_wo_rd: node_ips.append(node.address) print('node_ips = [{}]'.format(', '.join(["'{}'".format(x) for x in node_ips])))That will print out something like:
node_ips = ['192.168.1.1%400', '192.168.1.2%300', '192.168.1.2%301', '192.168.1.3']...which you can clean up (such as if you have duplicate IPs on different route domains and don't want them all) and then copy/paste into the other script.
If that doesn't fit the need let me know what's up and we can come up with a different option.
- paul_dawson_258Jul 03, 2018
Nimbostratus
Jason this works like a charm. May I request an additional feature? Is it possible ti include the VIP IP address? Last request!
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com