
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.yaml
ich 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.yaml
folgende fehlerhafte Datei mit zusätzlichen Anführungszeichen um das metrics_path
und 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 /snmp
die 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.yaml
mit 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 auth
und module
als 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.200
usw. public_v1
) in Anführungszeichen gesetzt werden, da Sie andernfalls die Puppet-Syntaxfehler erhalten, die Sie melden.
Das Puppet Prometheus-Modul konvertiert einfach scrape_configs
direkt 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.