Problema de sintaxis de títeres al configurar un raspado de Prometheus en un exportador SNMP

Problema de sintaxis de títeres al configurar un raspado de Prometheus en un exportador SNMP

Algún contexto

Tengo un exportador SNMP ejecutándose como servicio en un servidor que me permite acceder a los datos de algunas PDU usando la siguiente URL:http://my.host.name:9116/snmp?target=10.0.1.200&auth=public_v1&module=apcups

Tengo un servidor Prometheus que configuré usando Puppet en el mismo host. Quiero agregar un trabajo raspado para recuperar la información proporcionada por las PDU.

Confiando en el tutorialen esta páginay algunas otras fuentes, pude confirmar que modificar manualmente el /etc/prometheus/prometheus.yamlarchivo para insertar lo siguiente me da el resultado esperado. Para abreviar, solo incluyo la parte relevante del archivo de configuración.

- job_name: snmp_scrapper
  scrape_interval: 60s
  scrape_timeout: 10s
  metrics_path: /snmp
  static_configs:
  - targets:
    - my.host.name:9116
  params:
    target: [10.0.1.200]          # IP of the PDU on the private network
    auth: [public_v1]             # authentication method
    module: [apcups]              # module to retrieve APC PDU/UPS information

Esto funciona exactamente como esperaba, puedo trazar mi consumo de energía en Prometheus y Grafana, etc.

Mi problema

Para configurar Puppet para producir la configuración de Prometheus anterior, agregué el siguiente trabajo en el perfil en el que está configurado Prometheus (tengo otro trabajo de extracción de node_exporter en varios hosts en los que pude inspirarme):

        {
          'job_name'        => 'snmp_scrapper',
          'scrape_interval' => '60s',
          'scrape_timeout'  => '10s',
          'metrics_path'    => '/snmp',
          'static_configs'  => [{ 'targets' => ['my.host.name:9116'], }],
          'params' => {
            'target' => '[10.0.1.200]',
            'auth' => '[public_v1]',
            'module' => '[apcups]',
          }
        },

El problema es que esto produce el prometheus.yamlsiguiente archivo erróneo con comillas adicionales alrededor de metrics_pathy tres elementos dentro params.

 - job_name: snmp_scrapper
   scrape_interval: 60s
   scrape_timeout: 10s
   metrics_path: "/snmp"
   static_configs:
   - targets:
     - my.host.name:9116
   params:
     target: "[10.0.1.200]"
     auth: "[public_v1]"
     module: "[apcups]"

El analizador de configuración de Prometheus falla con el siguiente error:

  FAILED: parsing YAML file /etc/prometheus/prometheus.yaml20231023-1016214-j3iqrx: yaml: unmarshal errors:
  line 47: cannot unmarshal !!str `[10.0.1...` into []string
  line 48: cannot unmarshal !!str `[public...` into []string
  line 49: cannot unmarshal !!str `[apcups]` into []string

Ingenuamente, pensé que eliminar las comillas alrededor /snmpde los corchetes en los parámetros solucionaría mi problema, es decir:

          'job_name'        => 'snmp_scrapper',
          'scrape_interval' => '60s',
          'scrape_timeout'  => '10s',
          'metrics_path'    => /snmp,
          'static_configs'  => [{ 'targets' => ['my.host.name:9116'], }],
          'params' => {
            'target' => [10.0.1.200],
            'auth' => [public_v1],
            'module' => [apcups],

Pero esto da como resultado un error de sintaxis de Puppet.

Mi pregunta

¿Cómo obtengo lo que deseo /etc/prometheus/prometheus.yamlque se muestra en la parte superior de esta pregunta a través de Puppet? Supongo que debe haber algún tipo de sintaxis que permita la producción de una cadena de texto sin comillas, pero no sé cómo.

Estoy usando Puppet versión 8.2.0 y elmarioneta/prometeoMódulo v13.3.0.

Respuesta1

Estás a mitad de camino: no quieres eliminar las comillas, pero sí moverlas:

'job_name'        => 'snmp_scrapper',
      'scrape_interval' => '60s',
      'scrape_timeout'  => '10s',
      'metrics_path'    => '/snmp',
      'static_configs'  => [{ 'targets' => ['my.example.com:9116'], }],
      'params' => {
        'target' => ['10.0.1.200'],
        'auth' => ['public_v1'],
        'module' => ['apcups'],

Tanto en YAML como en Puppet DDL, [e ]indican matrices, en este caso matrices de cadenas; target: [10.0.1.200]en YAML es una matriz de un solo elemento que contiene una sola cadena ( 10.0.1.200), que también podría escribirse como:

      target:
        - 10.0.1.200

Para generar la configuración correcta de Prometheus, debe asegurarse de que target, authy modulese generen como matrices, lo que simplemente significa que deben ser matrices Puppet en el camino de entrada. Esto significa tener las comillas [y ]el exterior, ya que son parte de la sintaxis del lenguaje en lugar de parte de las cadenas, pero debido a que Puppet requiere que las cadenas estén entre comillas, sus valores reales ( 10.0.1.200, public_v1etc.) deben citarse; de ​​lo contrario, obtendrá los errores de sintaxis de Puppet que está informando.

El módulo Puppet Prometheus simplemente se convierte scrape_configsdirectamente a YAML, por lo que las matrices Puppet se expresan como matrices YAML, y las cadenas Puppet erróneas se expresan como cadenas YAML, incluso cuando no desea que lo sean.

información relacionada