iControlREST: Ruby: To Output a List of Virtual Servers and their Associated Pools and Pool Members.

Problem this snippet solves:

This script enumerates virtual servers and their associated pools and pool members and their status, each virtual server on a line of its own in the ";' delimited format. Essentially, the code shows a way to parse the 'ltm/virtual' object and get the information required. It had a specific need to address when it was written, and it can be modified to suit other similar requirements.

How to use this snippet:

This code has been tested with Ruby 2.3.1p112.

Code :

#!/usr/local/bin/ruby -w
    #
    # This script enumerates virtual servers and their associated pools and 
    # pool members and their status, each virtual server on a line of its own 
    # in the ";' delimited format.
    #
    #-------------------------------------------------------------------------

    require 'rubygems'
    require 'rest-client'
    require 'json'

    # define program-wide variables
    BIGIP_ADDRESS = 'mgmt_IP_addr'
    BIGIP_USER = 'admin'
    BIGIP_PASS = 'admin'
    SLEEP_TIME = 20

    bigip = RestClient::Resource.new(
           "https://#{BIGIP_ADDRESS}/mgmt/tm/", 
           :user => BIGIP_USER, 
           :password => BIGIP_PASS, 
           :headers => { :content_type => 'application/json' },
           :verify_ssl => false
    )

    # Get virtual servers:

    vservers = bigip['ltm/virtual'].get
    vservers_obj = JSON.parse(vservers)

    # Get pools:

    pools = bigip['ltm/pool?expandSubcollections=true'].get
    pools_obj = JSON.parse(pools)

    # Output header:
    puts "Virtual Server Name;Virtual Server Destination;Virtual Server Partition;Pool Name;Pool LB Mode;Pool Member Name (address)(state)"
    $output = ''

    # Process data:

    vservers_obj.each do |vserver_obj|
        vserver_obj.each do |vserver_obj_element|
            if vserver_obj_element.is_a?(Array)
                vserver_obj_element.each do |vserver_obj_element_property|
                    if vserver_obj_element_property.is_a?(Hash)
                        if vserver_obj_element_property.has_key?("name")
                            vs_name = vserver_obj_element_property.fetch("name")
                            $output = $output + vs_name + ';'
                        end
                        if vserver_obj_element_property.has_key?("destination")
                            vs_destination = vserver_obj_element_property.fetch("destination")
                            $output = $output + vs_destination + ';'
                        end
                        if vserver_obj_element_property.has_key?("partition")
                            vs_partition = vserver_obj_element_property.fetch("partition")
                            $output = $output + vs_partition + ';'
                        end
                        if vserver_obj_element_property.has_key?("pool")
                            pool_name_from_vs = vserver_obj_element_property.fetch("pool")
                            pools_obj.each_pair do |key, val|
                                next if key == "kind"
                                next if key == "selfLink"
                                for x in 0..(val.length-1)
                                    if val[x]["fullPath"] == pool_name_from_vs
                                        $output = $output + val[x]["name"] + ";" + val[x]["loadBalancingMode"]
                                        if val[x].has_key?("membersReference")
                                            val[x]["membersReference"].each_pair do |mrefkey,mrefval|
                                                next if mrefkey == "link"
                                                next if mrefkey == "isSubcollection"
                                                for i in 0..(mrefval.length-1)
                                                    if i == 0
                                                        $output = $output + ";" + mrefval[i]["name"] + "(" + mrefval[i]["address"] + ")(" + mrefval[i]["state"] + "),"
                                                    else
                                                        $output = $output + mrefval[i]["name"] + "(" + mrefval[i]["address"] + ")(" + mrefval[i]["state"] + "),"
                                                    end
                                                    if i == mrefval.length-1
                                                        $output.chop!
                                                        $output += "\n"
                                                    end
                                                end
                                            end
                                        else
                                            $output = $output + ";;\n"
                                        end
                                        break
                                    end
                                end
                            end
                        else
                            $output = $output + ";;\n"
                        end
                    end
                end
            end
        end
    end

    puts $output

    #---END---

Tested this on version:

11.6
Published Aug 06, 2016
Version 1.0
No CommentsBe the first to comment