Automatización y API (F5)
Contenido complementario
No se vio en mis lecciones; es lo que piden muchas ofertas de trabajo. Teoría en 20 - Automation and APIs. Pruébalo en el lab antes de usarlo en producción.
Pendiente: validar en el lab
Este contenido no salió de mis clases. Probar estos comandos y pasos en BIG-IP VE antes de usarlos en un trabajo real, y corregir lo que difiera en mi versión.
Resumen
Todo lo que se hace en la GUI o en tmsh se puede hacer por la API REST (iControl REST). Encima de ella F5 ofrece AS3, que describe una aplicación completa en un JSON declarativo (el estado final que quieres), y herramientas como Ansible y Terraform para integrarlo con pipelines. Esta nota muestra los comandos básicos de cada uno.
Requisitos previos
- Acceso HTTPS a la IP de gestión desde la máquina que automatiza
- Usuario con rol adecuado (nunca pongas contraseñas reales en scripts guardados en Git)
- Para AS3: el paquete RPM de AS3 instalado
-
curl,python3, Ansible o Terraform en tu PC
Conceptos clave
| Concepto | Qué es |
|---|---|
| iControl REST | API REST: https://<mgmt>/mgmt/tm/... |
| Token | Header X-F5-Auth-Token, obtenido en /mgmt/shared/authn/login |
~Common~ | Así se escribe /Common/ dentro de una URL de la API |
| AS3 | JSON declarativo por aplicación; cada tenant es una partición. Endpoint /mgmt/shared/appsvcs/declare |
| DO / TS / FAST | Onboarding declarativo / envío de telemetría / plantillas sobre AS3 |
| Imperativo vs declarativo | Pasos uno a uno vs estado final deseado (idempotente) |
Objetos de AS3
Lo creado con AS3 se modifica solo con AS3 (igual que los iApps). Un cambio manual se pierde en la siguiente declaración.
Configuración (Ejemplo, Lab CBT Nuggets)
1. iControl REST con curl
curl -sk -u admin:'<clave>' https://192.168.121.11/mgmt/tm/ltm/pool | python3 -m json.tool
Obtener un token:
curl -sk -X POST https://192.168.121.11/mgmt/shared/authn/login -H "Content-Type: application/json" -d '{"username":"admin","password":"<clave>","loginProviderName":"tmos"}'
Deshabilitar un miembro con el token:
curl -sk -X PATCH -H "X-F5-Auth-Token: <token>" -H "Content-Type: application/json" https://192.168.121.11/mgmt/tm/ltm/pool/~Common~HTTP_APP1_Pool/members/~Common~10.10.101.101:80 -d '{"session":"user-disabled"}'
Ejecutar un comando tmsh por la API:
curl -sk -u admin:'<clave>' -X POST https://192.168.121.11/mgmt/tm/util/bash -H "Content-Type: application/json" -d '{"command":"run","utilCmdArgs":"-c \"tmsh show sys version\""}'
2. Instalar AS3
iApps > Package Management LX > Import > el archivo f5-appsvcs-*.noarch.rpm (de GitHub de F5) > Upload.
3. Declaración AS3 de ejemplo (app1.json)
{
"class": "AS3",
"action": "deploy",
"declaration": {
"class": "ADC",
"schemaVersion": "3.0.0",
"id": "app1-lab",
"Tenant_App1": {
"class": "Tenant",
"App1": {
"class": "Application",
"service": {
"class": "Service_HTTP",
"virtualAddresses": ["172.16.101.30"],
"virtualPort": 80,
"pool": "web_pool",
"persistenceMethods": ["cookie"]
},
"web_pool": {
"class": "Pool",
"loadBalancingMode": "least-connections-member",
"monitors": ["http"],
"members": [
{ "servicePort": 80, "serverAddresses": ["10.10.101.101", "10.10.101.102"] }
]
}
}
}
}
}
Enviar, consultar y borrar:
curl -sk -u admin:'<clave>' -X POST https://192.168.121.11/mgmt/shared/appsvcs/declare -H "Content-Type: application/json" -d @app1.json
curl -sk -u admin:'<clave>' https://192.168.121.11/mgmt/shared/appsvcs/declare
curl -sk -u admin:'<clave>' -X DELETE https://192.168.121.11/mgmt/shared/appsvcs/declare/Tenant_App1
4. Ansible (drenar un miembro)
- name: Mantenimiento de servidor web
hosts: localhost
connection: local
gather_facts: false
vars:
provider:
server: 192.168.121.11
user: admin
password: "{{ vault_f5_password }}"
validate_certs: false
tasks:
- name: Deshabilitar el miembro
f5networks.f5_modules.bigip_pool_member:
provider: "{{ provider }}"
pool: HTTP_APP1_Pool
host: 10.10.101.101
port: 80
state: disabled
ansible-galaxy collection install f5networks.f5_modules
ansible-playbook drenar_miembro.yml --ask-vault-pass
5. Terraform con AS3
terraform {
required_providers {
bigip = { source = "F5Networks/bigip" }
}
}
provider "bigip" {
address = "192.168.121.11"
username = "admin"
password = var.f5_password
}
resource "bigip_as3" "app1" {
as3_json = file("app1.json")
}
terraform init
terraform plan
terraform apply
Verificación
| Comando o lugar | Qué debes ver | Si no lo ves |
|---|---|---|
curl … /mgmt/tm/sys/version | JSON con la versión | Credenciales o acceso HTTPS a la gestión |
curl … /mgmt/shared/appsvcs/info | Versión de AS3 | AS3 no instalado |
Partición Tenant_App1 en la GUI | VS, pool y monitor creados | Lee el mensaje de error de la respuesta de AS3 |
ansible-playbook | changed: [localhost] | Revisa la colección y el provider |
Errores comunes
401 Unauthorized en la API
- Causa: credenciales, token vencido o usuario sin permisos.
- Solución: renueva el token; revisa el rol.
AS3 responde 422
- Causa: el JSON no cumple el esquema (nombre de clase, campo mal escrito).
- Solución: lee el campo
messagede la respuesta y valida contra el esquema de AS3.
Mis cambios manuales desaparecieron
- Causa: el objeto pertenece a una declaración AS3.
- Solución: cambia la declaración y vuelve a enviarla.
El script funciona en el lab y falla en producción
- Causa: certificados (
validate_certs), proxies o permisos distintos. - Solución: usa certificados de confianza en la gestión y cuentas de servicio con permisos mínimos.