Puppet-Syntaxproblem beim Konfigurieren eines Prometheus-Scrapes auf einem SNMP-Exporteur

Puppet-Syntaxproblem beim Konfigurieren eines Prometheus-Scrapes auf einem SNMP-Exporteur

Etwas Kontext

Ich habe einen SNMP-Exporteur, der als Dienst auf einem Server läuft und mir den Zugriff auf die Daten einiger PDUs über die folgende URL ermöglicht:http://my.host.name:9116/snmp?target=10.0.1.200&auth=public_v1&module=apcups

Ich habe einen Prometheus-Server, den ich mit Puppet auf demselben Host konfiguriert habe. Ich möchte einen Scrape-Job hinzufügen, um die von den PDUs bereitgestellten Informationen abzurufen.

Verlassen Sie sich auf das Tutorialauf dieser Seiteund einigen anderen Quellen konnte ich bestätigen, dass /etc/prometheus/prometheus.yamlich das gewünschte Ergebnis erziele, wenn ich die Datei manuell ändere und Folgendes einfüge. Der Kürze halber füge ich nur den relevanten Teil der Konfigurationsdatei ein.

- 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

Das funktioniert genau wie erwartet, ich kann meinen Stromverbrauch in Prometheus und Grafana usw. darstellen.

Mein Problem

Um Puppet so zu konfigurieren, dass die obige Prometheus-Konfiguration erstellt wird, habe ich dem Profil, in dem Prometheus konfiguriert ist, den folgenden Job hinzugefügt (ich habe einen anderen Job, der node_exporter auf einer Reihe von Hosts durchsucht und von dem ich mich inspirieren lassen konnte):

        {
          '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]',
          }
        },

Das Problem besteht darin, dass dadurch die prometheus.yamlfolgende fehlerhafte Datei mit zusätzlichen Anführungszeichen um das metrics_pathund drei Elementen darin erstellt wird 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]"

Der Konfigurationsparser von Prometheus schlägt dann mit dem folgenden Fehler fehl:

  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

Naiverweise dachte ich, das Entfernen der Anführungszeichen um /snmpdie eckigen Klammern in den Parametern würde mein Problem beheben, also:

          '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],

Dies führt jedoch zu einem Puppet-Syntaxfehler.

Meine Frage

Wie erhalte ich /etc/prometheus/prometheus.yamlmit Puppet das gewünschte Ergebnis, das oben in dieser Frage angezeigt wird? Ich vermute, es muss eine Art Syntax geben, die die Erstellung einer Textzeichenfolge ohne Anführungszeichen ermöglicht, aber ich weiß nicht, wie.

Ich verwende Puppet Version 8.2.0 und dieMarionette/PrometheusModul v13.3.0.

Antwort1

Sie sind auf halbem Weg – Sie möchten die Anführungszeichen nicht entfernen, sondern verschieben:

'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'],

Sowohl in YAML als auch in Puppet DDL geben [und ]Arrays an, in diesem Fall Arrays von Zeichenfolgen. target: [10.0.1.200]In YAML ist dies ein einelementiges Array, das eine einzelne Zeichenfolge ( 10.0.1.200) enthält, die auch folgendermaßen geschrieben werden könnte:

      target:
        - 10.0.1.200

Um eine korrekte Prometheus-Konfiguration zu generieren, müssen Sie sicherstellen target, dass authund moduleals Arrays generiert werden. Dies bedeutet einfach, dass es sich beim Eingehen um Puppet-Arrays handeln muss. Dies bedeutet, dass [und ]außerhalb der Anführungszeichen stehen müssen, da sie Teil der Sprachsyntax und nicht Teil der Zeichenfolgen sind. Da Puppet jedoch erfordert, dass Zeichenfolgen in Anführungszeichen gesetzt werden, müssen Ihre tatsächlichen Werte ( 10.0.1.200usw. public_v1) in Anführungszeichen gesetzt werden, da Sie andernfalls die Puppet-Syntaxfehler erhalten, die Sie melden.

Das Puppet Prometheus-Modul konvertiert einfach scrape_configsdirekt in YAML, sodass Puppet-Arrays als YAML-Arrays ausgedrückt werden – und fehlerhafte Puppet-Strings als YAML-Strings ausgedrückt werden, auch wenn Sie das nicht möchten.

verwandte Informationen