Skip to main content

Referencia de plantillas

Una plantilla es un archivo YAML con tres secciones: tasks, agents (o modules de nivel superior) y transfer. El parseo es estricto: un nombre de campo desconocido es un error, así que las erratas fallan rápido.

Ejemplo mínimo completo

tasks:
  - name: disk
    type: local
    local: { command: "df --output=pcent / | tail -1 | tr -d ' %'" }
    variable: disk_pct

agents:
  - name: "myhost"
    group: "Servers"
    interval: 300
    modules:
      - name: "Disk used"
        type: generic_data
        data: "{{ disk_pct }}"
        unit: "%"

transfer:
  mode: tentacle
  tentacle: { address: "pandora.example.com" }

tasks: — lista ordenada de ejecuciones

Las tareas se ejecutan secuencialmente, en el orden declarado. Una tarea puede usar variables producidas por tareas anteriores en cualquiera de sus campos de cadena (encadenamiento: login → token → petición autenticada).

CampoObligatorioDescripción
nameIdentificador único de tarea (usado en los logs)
typerequest o local
requestsi type=requestEspecificación de petición HTTP (abajo)
localsi type=localEspecificación de comando (abajo)
filternoFiltro de extracción (abajo). Sin él, se almacena la salida bruta recortada
variablenoNombre bajo el que almacenar el resultado. Debe coincidir con [A-Za-z_][A-Za-z0-9_]*

request: (HTTP)

CampoObligatorioPor defectoDescripción
urlURL de destino. Admite {{ }}
methodnoGETGET, POST, PUT, DELETE, PATCH, HEAD
headersnoMapa de cabecera → valor. Los valores admiten {{ }}
bodynoCuerpo de la petición. Admite {{ }}
timeoutno30Segundos
skip_tls_verifynofalseAcepta certificados TLS inválidos

Una respuesta con estado fuera de 2xx es un fallo de tarea. Los cuerpos de respuesta están limitados a 10 MiB.

local: (comando)

CampoObligatorioPor defectoDescripción
commandSe ejecuta con /bin/sh -c. Admite {{ }}. El $ de shell no se toca (awk '{print $5}' funciona tal cual)
timeoutno30Segundos; el proceso se mata al expirar

Un código de salida distinto de cero es un fallo de tarea (stderr se incluye en el log).

filter: — extracción de valores

CampoObligatorioDescripción
typejq o regexp
expressionLa expresión del filtro

Cardinalidad del resultado (ambos tipos de filtro): 0 coincidencias → variable sin definir (semántica de fallo de tarea) · 1 coincidencia → escalar · N coincidencias → array.

jq — la salida de la tarea debe ser JSON válido. La expresión se ejecuta con un motor jq incorporado (no se necesita el binario jq). Cada valor que emite la expresión es un elemento: .token → escalar, .items[].name → array, .items[] → array de objetos.

regexp — sintaxis RE2 de Go (sin backtracking, sin lookahead) aplicada a la salida bruta. Por coincidencia:

Forma del patrónCada coincidencia se convierte en
Sin grupo de captura (cpu\d)La coincidencia completa (cadena)
Un grupo sin nombre ((\d+)%)El grupo de captura 1 (cadena)
2+ grupos sin nombre ((a)(b)(c))Array posicional: [[a, b, c], ...]
Grupos con nombre ((?P<mount>...))Un objeto: nombre del grupo → texto capturado

Usa (?m) para patrones multilínea anclados por línea y (?i) para coincidencia sin distinción de mayúsculas. No mezcles grupos con nombre y sin nombre en la misma regexp si quieres un acceso predecible; la forma con nombre solo expone los campos con nombre.

Coerción de tipos: las cadenas extraídas con aspecto numérico se convierten en números (recursivamente, incluyendo campos de objetos), así que la aritmética funciona con ellas.

Variables y expresiones {{ }}

Cualquier campo de cadena de tareas (después de la tarea que la produce), agentes y módulos puede incluir {{ expresión }}. Las expresiones se evalúan con expr-lang contra el almacén de variables.

ExpresiónResultado
{{ token }}Valor de la variable
{{ 100 - disk_pct }}Aritmética
{{ names[0] }}Indexado de array
{{ value.mount }}Campo de objeto (dentro de for_each)
{{ names[index] }}Array paralelo sincronizado (dentro de for_each)

Referenciar una variable no definida es un error → el módulo afectado se omite (o la ejecución aborta bajo --strict).

agents: — un bloque por agente

Obligatorio a menos que uses modules: de nivel superior (ver el modo agent_plugin). Cada agente se convierte en un documento XML <agent_data>.

CampoObligatorioDescripción
nameNombre del agente
modulesLista de bloques de módulo (al menos uno)
aliasnoAlias del agente
parent_agent_namenoAgente padre
descriptionnoDescripción
versionnoCadena de versión del agente
os_name, os_versionnoIdentificación del SO
timestampnoSobrescribe la marca de tiempo de los datos
addressnoIP/nombre de host
groupnoGrupo de destino
intervalnoSegundos (entero)
agent_modenoModo del agente

Todos los campos de cadena admiten {{ }}.

modules: — bloques de módulo

Los bloques de módulo viven dentro de un agente, o a nivel superior (solo con transfer.mode: agent_plugin).

Campos de control (semántica del ejecutor, no se envían a Pandora):

CampoDescripción
for_eachNombre de variable array. El bloque se expande a un módulo por elemento; {{ value }} e {{ index }} quedan disponibles. Una variable escalar itera como array de 1 elemento. Para grupos de captura sin nombre con 2+ grupos, cada value es un array, así que puedes usar {{ value[0] }}. ¿Varios módulos por elemento? Escribe varios bloques con el mismo for_each
whenExpresión booleana expr-lang en bruto (sin {{ }}). Falso → módulo (o elemento) omitido. Dentro de for_each se evalúa por elemento y ve value/index. Ejemplo: when: 'not (value.mount matches "^/DB")'

Campos de datos — los dos obligatorios más el conjunto completo aceptado por el servidor de datos. Los valores pueden ser números o cadenas en YAML; todos admiten {{ }}:

CampoObligatorioDescripción
nameNombre del módulo
typeTipo de módulo (generic_data, generic_proc, generic_data_string, async_data, ...)
datanoValor del módulo
descriptionnoDescripción
unitnoEtiqueta de unidad
intervalnoIntervalo del módulo
tagsnoEtiquetas
module_groupnoGrupo de módulo
module_parent, module_parent_unlinknoRelación de módulo padre
min_warning, max_warning, min_critical, max_criticalnoUmbrales numéricos
min_warning_forced, max_warning_forced, min_critical_forced, max_critical_forcednoVariantes de umbral forzado
str_warning, str_criticalnoUmbrales por coincidencia de cadena
str_warning_forced, str_critical_forcednoUmbrales de cadena forzados
warning_inverse, critical_inversenoInvertir la lógica del umbral
min, maxnoRango de datos válido
post_processnoMultiplicador aplicado por el servidor
disablednoCrear deshabilitado
statusnoForzar estado
timestampnoSobrescribe la marca de tiempo de los datos
custom_idnoIdentificador personalizado
critical_instructions, warning_instructions, unknown_instructionsnoInstrucciones del operador
quietnoModo silencioso
min_ff_event, min_ff_event_normal, min_ff_event_warning, min_ff_event_criticalnoUmbrales FlipFlop
module_ff_interval, ff_type, ff_timeout, each_ffnoComportamiento FlipFlop
crontabnoPlanificación de módulo estilo cron
extra_datanoCarga extra
alert_templatesnoLista de nombres de plantillas de alerta a vincular

transfer: — entrega

CampoObligatorioDescripción
modetentacle, local o agent_plugin
tentacle.addresspara tentacleDirección del servidor Pandora
tentacle.portno (por defecto 41121)Puerto tentacle
tentacle.binarynoRuta a tentacle_client si no está en $PATH
tentacle.extra_argsnoArgumentos extra del cliente tentacle (lista)
local.directorypara localDirectorio donde se escribe el archivo XML .data
module_prefix_separatorno (por defecto " - ")Separador para el prefijado multi-agente en modo agent_plugin
ModoSalidaCaso de uso
tentacleXML <agent_data> completo enviado vía cliente tentacleEjecución remota (cron, Discovery)
localXML <agent_data> completo escrito en un directorioEjecutarse en el propio servidor Pandora (apuntando al directorio de entrada), o depuración
agent_pluginSolo fragmentos <module> impresos en stdout — el agente real añade la cabeceraEjecutarse como module_plugin de un agente de software

Particularidades de agent_plugin:

  • Se permite modules: de nivel superior sin ningún bloque agents: (y solo se permite en este modo).
  • Con varios agentes definidos, cada nombre de módulo se prefija con <nombre_agente> - <nombre_módulo> para que los módulos no colisionen bajo el único agente real.