diff --git a/roles/collector/README.md b/roles/collector/README.md index 77c4f93..8c89aa5 100644 --- a/roles/collector/README.md +++ b/roles/collector/README.md @@ -1,18 +1,19 @@ Set up metric collection with prometheus and telegraf as the SNMP proxy. -NetBox config context should contain the lists `prometheus_hosts` and `snmp_hosts` with job definitions. Each entry should define `name` and `nb_filter` user to query hosts from NetBox. For example: +Each entry in `prometheus_config` should define `name`, `hosts` and optionally `interval`. As above, `hosts` is used as a query filter. + +For SNMP the properties `snmp_hosts` and optional `snmp_interval` should define respectively the NetBox query filter and poll interval. + +For example: { - "prometheus_hosts": [ + "prometheus_config": [ { "name": "classroom", - "nb_filter": "role=desktop-computer status=active location=classroom" + "hosts": "role=desktop-computer status=active location=classroom", + "interval": 300 } ], - "snmp_hosts": [ - { - "name": "switch", - "nb_filter": "role=switch name__isw=sw- status=active status=staged status=planned" - } - ] + "snmp_hosts": "role=switch name__isw=sw- status=active status=staged status=planned", + "snmp_interval": 300 } diff --git a/roles/collector/tasks/main.yml b/roles/collector/tasks/main.yml index a5176ba..f365f7f 100644 --- a/roles/collector/tasks/main.yml +++ b/roles/collector/tasks/main.yml @@ -28,7 +28,7 @@ template: dest: "/etc/prometheus/conf.d/{{ item.name }}.yml" src: "prometheus-job.yml.j2" - loop: "{{ prometheus_hosts }}" + loop: "{{ prometheus_config }}" loop_control: label: "{{ item.name }}" notify: reload prometheus diff --git a/roles/collector/templates/prometheus-job.yml.j2 b/roles/collector/templates/prometheus-job.yml.j2 index 7e24f05..94e7a11 100644 --- a/roles/collector/templates/prometheus-job.yml.j2 +++ b/roles/collector/templates/prometheus-job.yml.j2 @@ -1,10 +1,14 @@ -{% set devices = query("netbox.netbox.nb_lookup", "devices", api_filter="{{ item.nb_filter }}", raw_data=true) +{% set devices = query("netbox.netbox.nb_lookup", "devices", api_filter="{{ item.hosts }}", raw_data=true) | selectattr("primary_ip") | map(attribute="name") | map("extract", hostvars) -%} scrape_configs: - job_name: "{{ item.name }}" +{% if item.interval is defined %} + scrape_interval: {{ item.interval }}s + scrape_timeout: {{ item.interval // 5 }}s +{% endif %} relabel_configs: - source_labels: [__address__] regex: '([^.]+).*' diff --git a/roles/collector/templates/snmp.conf.j2 b/roles/collector/templates/snmp.conf.j2 index d0de538..ec9aedb 100644 --- a/roles/collector/templates/snmp.conf.j2 +++ b/roles/collector/templates/snmp.conf.j2 @@ -1,13 +1,13 @@ [[inputs.snmp]] - interval = "300s" +{% if snmp_interval is defined %} + interval = "{{ snmp_interval }}s" +{% endif %} agent_host_tag = "source" agents = [ -{% for item in snmp_hosts %} -{% for address in query("netbox.netbox.nb_lookup", "devices", api_filter=item.nb_filter, raw_data=true) +{% for address in query("netbox.netbox.nb_lookup", "devices", api_filter=snmp_hosts, raw_data=true) | selectattr("primary_ip4") | map(attribute="primary_ip4.address") - | ipaddr("address") %} + | ipaddr("int") | sort | ipaddr("address") %} "{{ address }}", -{% endfor %} {% endfor %} ] version = 3