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

ConceptoQué es
iControl RESTAPI REST: https://<mgmt>/mgmt/tm/...
TokenHeader X-F5-Auth-Token, obtenido en /mgmt/shared/authn/login
~Common~Así se escribe /Common/ dentro de una URL de la API
AS3JSON declarativo por aplicación; cada tenant es una partición. Endpoint /mgmt/shared/appsvcs/declare
DO / TS / FASTOnboarding declarativo / envío de telemetría / plantillas sobre AS3
Imperativo vs declarativoPasos 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 lugarQué debes verSi no lo ves
curl … /mgmt/tm/sys/versionJSON con la versiónCredenciales o acceso HTTPS a la gestión
curl … /mgmt/shared/appsvcs/infoVersión de AS3AS3 no instalado
Partición Tenant_App1 en la GUIVS, pool y monitor creadosLee el mensaje de error de la respuesta de AS3
ansible-playbookchanged: [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 message de 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.