icontrol ruby library
3 TopicsCreate Maintenance Page iRule
Problem this snippet solves: This is a script will generate an iRule that will display a maintenance page to users when attached to a virtual server. If the iRule already exists, it can be updated from the script. If a virtual server is specified, the iRule will be applied to it. As a result, the virtual will immediately be shunted to the maintenance page. How to use this snippet: Requirements Ruby Ruby Gems F5 iControl for Ruby library other dependencies will be installed with the iControl gem Installation Steps Install Ruby, Ruby's OpenSSL library, Ruby Gems, and the Ruby iControl libraries Copy this code to /usr/local/bin and chmod +x to make the script executable Run it! create-maintenace-page-irule.rb -b 192.168.1.245 -u admin -p admin -f www.mysite.com-maintenance.html -v mymaintenancevirtual Code : #!/usr/bin/ruby require "rubygems" require "f5-icontrol" require "getoptlong" options = GetoptLong.new( [ "--bigip-address", "-b", GetoptLong::REQUIRED_ARGUMENT ], [ "--bigip-user", "-u", GetoptLong::REQUIRED_ARGUMENT ], [ "--bigip-pass", "-p", GetoptLong::REQUIRED_ARGUMENT ], [ "--html-file", "-f", GetoptLong::REQUIRED_ARGUMENT ], [ "--maintenance-vs", "-v", GetoptLong::OPTIONAL_ARGUMENT ], [ "--irule-name", "-n", GetoptLong::OPTIONAL_ARGUMENT ], [ "--help", "-h", GetoptLong::NO_ARGUMENT ] ) def usage puts $0 + " -b -u -f " puts " -b (--bigip-address) BIG-IP management-accessible address)" puts " -u (--bigip-user) BIG-IP username" puts " -p (--bigip-pass) BIG-IP password (will prompt if left blank" puts " -f (--html-file) source HTML file for maintenance page" puts " -v (--maintenance-vs) virtual server to apply maintenance page (will immediiately put virtual server in maintenance mode)" puts " -n (--irule-name) name of maintenance iRule (defaults to maintenance_page_)" puts " -h (--help) shows this help/usage dialog" exit end # initial parameter values bigip_address = '' bigip_user = '' bigip_pass = '' maintenance_html_file = '' maintenance_vs = '' maintenance_irule_name = '' options.each do |option, arg| case option when "--bigip-address" bigip_address = arg when "--bigip-user" bigip_user = arg when "--bigip-pass" bigip_pass = arg when "--html-file" maintenance_html_file = arg when "--maintenance-vs" maintenance_vs = arg when "--irule-name" maintenance_irule_name = arg when "--help" usage end end # at the very least, the user should provide be BIG-IP address and username usage if bigip_address.empty? or bigip_user.empty? or maintenance_html_file.empty? # make sure that the maintenance page source HTML file exists, if not display error and exit unless File.exists? maintenance_html_file puts "Error: #{maintenance_html_file} could not be located. Check the path and try again." exit 1 end # if no iRule name is specified, built the default if maintenance_irule_name.empty? maintenance_irule_name = "maintenance_page_#{File.basename(maintenance_html_file).gsub('.', '_')}" end # if no BIG-IP password is provided, prompt for it if bigip_pass.empty? puts "Please enter the BIG-IPs password..." print "Password: " system("stty", "-echo") bigip_pass = gets.chomp system("stty", "echo") end # create iControl interfaces bigip = F5::IControl.new(bigip_address, bigip_user, bigip_pass, ["LocalLB.VirtualServer", "LocalLB.Rule"]).get_interfaces puts "Connected to BIG-IP at #{bigip_address} with user '#{bigip_user}'..." puts # ensure that that virtual server exists before proceeding unless maintenance_vs.empty? unless bigip["LocalLB.VirtualServer"].get_list.include? maintenance_vs puts "Error: virtual server '#{maintenance_vs}' could not be located on BIG-IP" exit end end maintenance_irule = "priority 1\n\nwhen HTTP_REQUEST {\n HTTP::respond 200 content {#{File.read(maintenance_html_file)}}\n}" irule_definition = {"rule_name" => maintenance_irule_name, "rule_definition" => maintenance_irule} if bigip["LocalLB.Rule"].get_list.include? maintenance_irule_name puts "An iRule named '#{maintenance_irule_name}' already exists. Would you like to replace it? (yes/no)" answer = gets if answer == "yes\n" puts "Updating '#{maintenance_irule_name}' on BIG-IP..." bigip["LocalLB.Rule"].modify_rule([irule_definition]) else puts "Nothing to do. Exiting..." exit end else puts "Creating iRule '#{maintenance_irule_name}' on BIG-IP..." bigip["LocalLB.Rule"].create([irule_definition]) end # assemble a list of iRules already assigned to virtual server vs_irules = [] bigip["LocalLB.VirtualServer"].get_rule(maintenance_vs)[0].each { |irule| vs_irules << irule['rule_name'] } unless maintenance_vs.empty? unless maintenance_vs.empty? or vs_irules.include? maintenance_irule_name puts "Are you absolutely sure that you want to enable the maintenance iRule for virtual server '#{maintenance_vs}'? (yes/no)" answer = gets if answer == "yes\n" puts "Applying maintenance page iRule to virtual server '#{maintenance_vs}'..." bigip["LocalLB.VirtualServer"].add_rule([maintenance_vs], [[{"rule_name" => maintenance_irule_name, "priority" => 1}]]) end end puts "Done!"557Views0likes0CommentsAutomated Nagios monitoring for F5 BigIP devices
Problem this snippet solves: Complete Nagios solution for automated monitoring of F5 BigIP using API & SNMP in Ruby. Generates Nagios config automatically. How to use this snippet: Readme here: https://github.com/anordby/plugins/blob/master/nagios/f5/README.md Ideally I would have this code linked up as Ruby code sample on these pages: https://devcentral.f5.com/wiki/iControl.System__Session.ashx https://devcentral.f5.com/wiki/iControl.System__Failover__get_failover_state.ashx https://devcentral.f5.com/wiki/iControl.System__Session__get_active_folder.ashx https://devcentral.f5.com/wiki/iControl.System__Session__set_active_folder.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__Pool.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__Pool__get_list.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__Pool__get_object_status.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__Pool__get_member_v2.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__Pool__get_member_object_status.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__VirtualServer.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__VirtualServer__get_list.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__VirtualServer__get_object_status.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__NodeAddressV2.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__NodeAddressV2__get_list.ashx https://devcentral.f5.com/wiki/iControl.LocalLB__NodeAddressV2__get_object_status.ashx Code : https://github.com/anordby/plugins/tree/master/nagios/f5405Views0likes0CommentsNodeInitiator
Problem this snippet solves: This will add a member to a pool on a BIG-IP. This script was written for use in the F5-node-initiator cookbook for Opscode Chef. Automating-Web-App-Deployments-with-Opscode-Chef-and-iControl.aspx How to use this snippet: Requirements Ruby Ruby Gems F5 iControl for Ruby library (Getting-Started-With-Ruby-and-iControl.aspx) other dependencies will be installed with the iControl gem Installation Steps Install Ruby, Ruby Gems, and the Ruby iControl libraries Getting-Started-With-Ruby-and-iControl.aspx Copy this code to /usr/local/bin and chmod +x to make the script executable Run it! f5-node-initiator -b 192.168.1.245 -u admin -p admin -n my_test_pool -d 10.0.0.10:80 Code : #!/usr/bin/ruby # # == Synopsis # # f5-node-initiator - Quickly add nodes to pools # # == Usage # # f5-node-initiator [OPTIONS] # # -h, --help: # show help # # --bigip-address, -b [hostname]: # specify the destination BIG-IP for virtual and pool creation # # --bigip-user, -u [username]: # username for destination BIG-IP # # --bigip-pass, -p [password]: # password for destination BIG-IP # # --pool-name, -n [name]: # name of pool to add node to # # --node-definition, -d [ip address:port]: # definition for node being added to pool, example: 10.2.1.1:443 require 'rubygems' require 'f5-icontrol' require 'getoptlong' require 'rdoc/usage' options = GetoptLong.new( [ '--bigip-address', '-b', GetoptLong::REQUIRED_ARGUMENT ], [ '--bigip-user', '-u', GetoptLong::REQUIRED_ARGUMENT ], [ '--bigip-pass', '-p', GetoptLong::REQUIRED_ARGUMENT ], [ '--pool-name', '-n', GetoptLong::REQUIRED_ARGUMENT ], [ '--node-definition', '-d', GetoptLong::REQUIRED_ARGUMENT ], [ '--help', '-h', GetoptLong::NO_ARGUMENT ] ) bigip_address = '' bigip_user = '' bigip_pass = '' pool_name = '' node_address = '' node_port = 80 options.each do |option, arg| case option when '--bigip-address' bigip_address = arg when '--bigip-user' bigip_user = arg when '--bigip-pass' bigip_pass = arg when '--pool-name' pool_name = arg when '--node-definition' if arg =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+/ node_address = arg.split(':')[0] node_port = arg.split(':')[1] end when '--help' RDoc::usage end end RDoc::usage if bigip_address.empty? or bigip_user.empty? or bigip_pass.empty? or pool_name.empty? or node_address.empty? # Initiate SOAP RPC connection to BIG-IP bigip = F5::IControl.new(bigip_address, bigip_user, bigip_pass, ['LocalLB.Pool']).get_interfaces # Insure that target pool exists unless bigip['LocalLB.Pool'].get_list.include? pool_name puts 'ERROR: target pool "' + pool_name +'" does not exist' exit 1 end # collect list of existing pool member definitions pool_members = bigip['LocalLB.Pool'].get_member([ pool_name ])[0].collect do |pool_member| pool_member['address'] + ':' + pool_member['port'].to_s end # don't attempt to add member if it already exists unless pool_members.include?(node_address + ':' + node_port.to_s) bigip['LocalLB.Pool'].add_member([ pool_name ], [[{ 'address' => node_address, 'port' => node_port.to_i }]]) end232Views0likes0Comments