F5 es una empresa que provee un conjunto de productos relacionados a networking: firewall, balanceador, etc. Es común encontrarse con balanceador F5 en ambientes productivos de alta carga para repartir carga entre varios nodos.

Al mismo tiempo, en aplicaciones de cierta criticidad, es común que las actualizaciones se hagan siguiendo alguna estrategia tipo "canary", esto es:

  • "Se saca" un nodo del balanceador
  • Se le instala la nueva versión de la aplicación
  • Se verifica que la aplicación funcione correctamente
  • "Se restaura" el nodo en el balanceador
  • Se repite el proceso con cada uno de los restantes nodos

Cuando pretendemos trabajar en un esquema de continuous delivery es imprescindible que este proceso se haga de forma automatizada y para ello es necesario poder interactuar con balanceador programáticamente.

Dicho esto, he aquí un fragmento de código Python para interactuar un F5 Big-IP:

 # este script depende de varias variables: # * f5_login_url (url del balanceador para obtener el token) # * f5_user (usuario de f5 para obtener el api token) # * f5_pass (password de f5 para obtener el api token) # * f5_self_service_url (url de la api del balanceador) # * node_name (nombre del nodo sobre el que queremos operar) # * node_id (id del nodo sobre el que queremos operar) # * pool_id (id del pool del balanceador en el que está el nodo)   import requests import json import sys  # primero hay que loguearse y obtener un token login_request = '{ "username":' + f5_user + ', "password":' + f5_pass }' response = requests.post(f5_login_url, login_request) if response.status_code == 200:   response_json = json.loads(response.text)   token = response_json["token"]["token"] else:   token = {}   print('No pudo obtener token', file=sys.stderr)   exit(1)  # sacamos el nodo headers = { 'X-F5-Auth-Token': token } disable_request = '{"name":"Self-Service_' + node_name + '", "resourceReference":{' \   + '"link":"https://localhost/mgmt/cm/adc-core/working-config/ltm/pool/' + pool_id \   + '/members/' + node_id + '"},"operation":"force-offline"}' response = requests.post(f5_self_service_url, data=disable_request, headers=headers)  # restauramos el nodo enable_request = '{"name":"Self-Service_' + node_name + '", "resourceReference":{' \   + '"link":"https://localhost/mgmt/cm/adc-core/working-config/ltm/pool/' + pool_id \   + '/members/' + node_id + '"},"operation":"enable"}' response = requests.post(f5_self_service_url, data=disable_request, headers=headers)  

Espero les resulte útil.