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).

Campo Obligatorio Descripción
name Identificador único de tarea (usado en los logs)
type request o local
request si type=request Especificación de petición HTTP (abajo)
local si type=local Especificación de comando (abajo)
filter no Filtro de extracción (abajo). Sin él, se almacena la salida bruta recortada
variable no Nombre bajo el que almacenar el resultado. Debe coincidir con [A-Za-z_][A-Za-z0-9_]*

request: (HTTP)

Campo Obligatorio Por defecto Descripción
url URL de destino. Admite {{ }}
method no GET GET, POST, PUT, DELETE, PATCH, HEAD
headers no Mapa de cabecera → valor. Los valores admiten {{ }}
body no Cuerpo de la petición. Admite {{ }}
timeout no 30 Segundos
skip_tls_verify no false Acepta 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)

Campo Obligatorio Por defecto Descripción
command Se ejecuta con /bin/sh -c. Admite {{ }}. El $ de shell no se toca (awk '{print $5}' funciona tal cual)
timeout no 30 Segundos; 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

Campo Obligatorio Descripción
type jq o regexp
expression La 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ón Cada 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ón Resultado
{{ 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>.

Campo Obligatorio Descripción
name Nombre del agente
modules Lista de bloques de módulo (al menos uno)
alias no Alias del agente
parent_agent_name no Agente padre
description no Descripción
version no Cadena de versión del agente
os_name, os_version no Identificación del SO
timestamp no Sobrescribe la marca de tiempo de los datos
address no IP/nombre de host
group no Grupo de destino
interval no Segundos (entero)
agent_mode no Modo 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):

Campo Descripción
for_each Nombre 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
when Expresió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 {{ }}:

Campo Obligatorio Descripción
name Nombre del módulo
type Tipo de módulo (generic_data, generic_proc, generic_data_string, async_data, ...)
data no Valor del módulo
description no Descripción
unit no Etiqueta de unidad
interval no Intervalo del módulo
tags no Etiquetas
module_group no Grupo de módulo
module_parent, module_parent_unlink no Relación de módulo padre
min_warning, max_warning, min_critical, max_critical no Umbrales numéricos
min_warning_forced, max_warning_forced, min_critical_forced, max_critical_forced no Variantes de umbral forzado
str_warning, str_critical no Umbrales por coincidencia de cadena
str_warning_forced, str_critical_forced no Umbrales de cadena forzados
warning_inverse, critical_inverse no Invertir la lógica del umbral
min, max no Rango de datos válido
post_process no Multiplicador aplicado por el servidor
disabled no Crear deshabilitado
status no Forzar estado
timestamp no Sobrescribe la marca de tiempo de los datos
custom_id no Identificador personalizado
critical_instructions, warning_instructions, unknown_instructions no Instrucciones del operador
quiet no Modo silencioso
min_ff_event, min_ff_event_normal, min_ff_event_warning, min_ff_event_critical no Umbrales FlipFlop
module_ff_interval, ff_type, ff_timeout, each_ff no Comportamiento FlipFlop
crontab no Planificación de módulo estilo cron
extra_data no Carga extra
alert_templates no Lista de nombres de plantillas de alerta a vincular

transfer: — entrega

Campo Obligatorio Descripción
mode tentacle, local o agent_plugin
tentacle.address para tentacle Dirección del servidor Pandora
tentacle.port no (por defecto 41121) Puerto tentacle
tentacle.binary no Ruta a tentacle_client si no está en $PATH
tentacle.extra_args no Argumentos extra del cliente tentacle (lista)
local.directory para local Directorio donde se escribe el archivo XML .data
module_prefix_separator no (por defecto " - ") Separador para el prefijado multi-agente en modo agent_plugin
Modo Salida Caso de uso
tentacle XML <agent_data> completo enviado vía cliente tentacle Ejecución remota (cron, Discovery)
local XML <agent_data> completo escrito en un directorio Ejecutarse en el propio servidor Pandora (apuntando al directorio de entrada), o depuración
agent_plugin Solo fragmentos <module> impresos en stdout — el agente real añade la cabecera Ejecutarse 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.