Enabling or disabling a pool member
Problem this snippet solves:
The script you need for this task must:.
- Identify the Enterprise Manager through which you will access the necessary BIG-IP devices.
- Authenticate your client to the Enterprise Manager.
- Retrieve a list of the BIG-IP devices managed by Enterprise Manager.
- For each managed BIG-IP device, retrieve a list of pools and pool members.
- For each managed BIG-IP device, specify the operation you want to perform (enable/disable).
How to use this snippet:
To enable/disable a pool member:
- Create a script similar to the code sample shown below. Use either the enable or disable parameter to produce the required outcome.
- From a command prompt, run your script.
- When the code finishes running, the specified pool member is enabled or disabled in each pool and on each device on which it resides.
Code :
#!/usr/bin/perl
use SOAP::Lite;
use UNIVERSAL 'isa';
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
# Description: Enables/Disables a pool member in all pools of all BIG-IP devices managed by EM.
# Usage: test-icontrolproxy-pool-member-state.pl host uid pwd pool_member enable|disable
#----------------------------------------------------------------------------
# Validate Arguments
#----------------------------------------------------------------------------
my $sHost = $ARGV[0]; # EM Host
my $sUID = $ARGV[1]; # EM User (administrator role)
my $sPWD = $ARGV[2]; # EM Password
my $sPoolMember = $ARGV[3]; # BIG-IP Pool Member
my $sState = $ARGV[4]; # BIG-IP Pool Member State: enable/disable
my $proxy_uri = sprintf("https://%s:443/iControl/iControlPortal.cgi", $sHost);
my $soap = SOAP::Lite->proxy($proxy_uri);
sub SOAP::Transport::HTTP::Client::get_basic_credentials {
return $sUID => $sPWD;
}
sub checkResponse {
my ($resp) = (@_);
die "$resp->faultcode $resp->faultstring\n" if $resp->fault;
if (@{$resp->result}) {
print "\tItem: $_\n" foreach (@{$resp->result});
}
else {
printf "\tResult: %s\n", $resp->result;
}
}
sub getPoolList()
{
$soapResponse = $soap->uri("urn:iControl:LocalLB/Pool")->get_list();
&checkResponse($soapResponse);
my @pool_list = @{$soapResponse->result};
return @pool_list;
}
sub getMemberLists()
{
my (@pool_list) = (@_);
# Get the list of pool members for all the pools.
$soapResponse = $soap->uri("urn:iControl:LocalLB/Pool")->get_member
(
SOAP::Data->name(pool_names => [@pool_list])
);
&checkResponse($soapResponse);
@member_lists = @{$soapResponse->result};
return @member_lists;
}
sub findPoolsFromMember()
{
my ($node_addr_port) = (@_);
my ($node_addr, $node_port) = split(/:/, $node_addr_port, 2);
my @pool_match_list;
my @pool_list = &getPoolList();
my @member_lists = &getMemberLists(@pool_list);
for $i (0 .. $#pool_list)
{
$pool = @pool_list[$i];
foreach $member (@{@member_lists[$i]})
{
$addr = $member->{"address"};
$port = $member->{"port"};
if ( ($node_addr eq $addr) && ($node_port eq $port) )
{
push @pool_match_list, $pool;
}
}
}
return @pool_match_list;
}
sub setPoolMemberState()
{
my ($node_addr_port, $state) = (@_);
my ($node_addr, $node_port) = split(/:/, $node_addr_port, 2);
my @pool_list = &findPoolsFromMember($node_addr_port);
my $member = { address => $node_addr, port => $node_port };
my $ENABLED_STATE = "STATE_ENABLED";
if ( $state eq "disable" )
{
$ENABLED_STATE = "STATE_DISABLED";
}
my $MemberMonitorState = { member => $member, monitor_state => $ENABLED_STATE };
my @MemberMonitorStateList;
push @MemberMonitorStateList, $MemberMonitorState;
my @MemberMonitorStateLists;
for $i (0 .. $#pool_list)
{
push @MemberMonitorStateLists, [@MemberMonitorStateList];
}
# Make call to set_monitor_state
$soapResponse = $soap->uri("urn:iControl:LocalLB/PoolMember")->set_monitor_state(
SOAP::Data->name(pool_names => [@pool_list]),
SOAP::Data->name(monitor_states => [@MemberMonitorStateLists])
);
&checkResponse($soapResponse);
print "Pool member $node_addr_port set to $ENABLED_STATE in pools: ";
foreach $pool (@pool_list)
{
print "$pool, ";
}
print "\n";
}
#----------------------------------------------------------------------------
# Main application entry point.
#----------------------------------------------------------------------------
# EM: get devices.
print "\nGet devices...\n";
my $resp = $soap->uri('urn:iControl:Management/EM')->get_devices();
my $device_list = $resp->result;
# EM: generate a context ID.
print "\nGenerate context ID...\n";
$resp = $soap->uri("urn:iControl:Management/EM")->get_context_id();
my $context_id = $resp->result;
# Append context ID to SOAP URI.
$proxy_uri = sprintf("%s?context_id=%s", $proxy_uri, $context_id);
$soap = SOAP::Lite->proxy($proxy_uri);
# Iterate through the device list.
foreach (@{$device_list}) {
# Get current device address.
my $device = $_;
# EM: set device context (to proxy to).
print "\nSet device context...\n";
$resp = $soap->uri("urn:iControl:Management/EM")->set_device_context(SOAP::Data->name("ip_address" => $device));
&checkResponse($resp);
# Set pool member state.
&setPoolMemberState($sPoolMember, $sState);
}Published Mar 07, 2015
Version 1.0CodeCentral_194
Cirrostratus
Joined May 05, 2019
CodeCentral_194
Cirrostratus
Joined May 05, 2019
2 Comments
- badri123_123_28
Nimbostratus
this scripts did not work for me . It throws bunch of errors.
- RickB
Nimbostratus
I had the same problem.
Requires adding additional (missing) Perl RPM packages.
- Still have not identified all of them
- Require software/packages needs to be posted here as prerequisites