diff --git a/roles/collector/README.md b/roles/collector/README.md index 8c89aa5..77c4f93 100644 --- a/roles/collector/README.md +++ b/roles/collector/README.md @@ -1,19 +1,18 @@ Set up metric collection with prometheus and telegraf as the SNMP proxy. -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: +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: { - "prometheus_config": [ + "prometheus_hosts": [ { "name": "classroom", - "hosts": "role=desktop-computer status=active location=classroom", - "interval": 300 + "nb_filter": "role=desktop-computer status=active location=classroom" } ], - "snmp_hosts": "role=switch name__isw=sw- status=active status=staged status=planned", - "snmp_interval": 300 + "snmp_hosts": [ + { + "name": "switch", + "nb_filter": "role=switch name__isw=sw- status=active status=staged status=planned" + } + ] } diff --git a/roles/collector/tasks/main.yml b/roles/collector/tasks/main.yml index f365f7f..a5176ba 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_config }}" + loop: "{{ prometheus_hosts }}" 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 94e7a11..7e24f05 100644 --- a/roles/collector/templates/prometheus-job.yml.j2 +++ b/roles/collector/templates/prometheus-job.yml.j2 @@ -1,14 +1,10 @@ -{% set devices = query("netbox.netbox.nb_lookup", "devices", api_filter="{{ item.hosts }}", raw_data=true) +{% set devices = query("netbox.netbox.nb_lookup", "devices", api_filter="{{ item.nb_filter }}", 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 ec9aedb..d0de538 100644 --- a/roles/collector/templates/snmp.conf.j2 +++ b/roles/collector/templates/snmp.conf.j2 @@ -1,13 +1,13 @@ [[inputs.snmp]] -{% if snmp_interval is defined %} - interval = "{{ snmp_interval }}s" -{% endif %} + interval = "300s" agent_host_tag = "source" agents = [ -{% for address in query("netbox.netbox.nb_lookup", "devices", api_filter=snmp_hosts, raw_data=true) +{% for item in snmp_hosts %} +{% for address in query("netbox.netbox.nb_lookup", "devices", api_filter=item.nb_filter, raw_data=true) | selectattr("primary_ip4") | map(attribute="primary_ip4.address") - | ipaddr("int") | sort | ipaddr("address") %} + | ipaddr("address") %} "{{ address }}", +{% endfor %} {% endfor %} ] version = 3 diff --git a/roles/debian/tasks/main.yml b/roles/debian/tasks/main.yml index 66b0761..19e265d 100644 --- a/roles/debian/tasks/main.yml +++ b/roles/debian/tasks/main.yml @@ -39,9 +39,8 @@ - git - ifupdown2 - rsync - - tmux - vim - - wget + - tmux # for base Debian the main interfaces file is just an include - name: Remove interface definitions added by installer diff --git a/roles/friwall/README.md b/roles/friwall/README.md deleted file mode 100644 index a6fe6a3..0000000 --- a/roles/friwall/README.md +++ /dev/null @@ -1 +0,0 @@ -Install and configure the [FRIwall](https://git.fri.uni-lj.si/rc/friwall) web application for managing firewall nodes. For settings and operation refer to that project. diff --git a/roles/friwall/tasks/main.yml b/roles/friwall/tasks/main.yml index d0f85ae..0164136 100644 --- a/roles/friwall/tasks/main.yml +++ b/roles/friwall/tasks/main.yml @@ -38,18 +38,17 @@ extra_args: --user --break-system-packages --no-warn-script-location notify: restart uwsgi -- name: Ensure setting files exist - copy: - dest: "/srv/friwall/{{ item }}.json" - content: | - {} +- name: Configure base settings + template: + dest: "/srv/friwall/{{ item }}" + src: "{{ item }}.j2" owner: friwall group: friwall mode: 0600 force: no loop: - - nodes - - settings + - nodes.json + - settings.json notify: restart uwsgi - name: Configure list of networks diff --git a/roles/friwall/templates/interfaces.j2 b/roles/friwall/templates/interfaces.j2 new file mode 100644 index 0000000..d738c99 --- /dev/null +++ b/roles/friwall/templates/interfaces.j2 @@ -0,0 +1,14 @@ +auto lo +iface lo inet loopback + +{% for iface in interfaces %} +auto {{ iface.name }} +iface {{ iface.name }} inet static +{% for address in iface.ip_addresses %} + address {{ address.address }} +{% endfor %} +{% if iface.custom_fields.gateway %} + gateway {{ iface.custom_fields.gateway.address | ipaddr('address') }} +{% endif %} + +{% endfor %} diff --git a/roles/friwall/templates/nodes.json.j2 b/roles/friwall/templates/nodes.json.j2 new file mode 100644 index 0000000..c4ba065 --- /dev/null +++ b/roles/friwall/templates/nodes.json.j2 @@ -0,0 +1,11 @@ +{% set nodes = query('netbox.netbox.nb_lookup', 'devices', api_filter='role=firewall', raw_data=true) + | selectattr('config_context') | selectattr('config_context', 'contains', 'master') + | selectattr('config_context.master', '==', inventory_hostname) + | map(attribute='name') -%} + +{ +{% for node in nodes %} + "{{ hostvars[node] | device_address | selectattr('family.value', '==', 4) + | map(attribute='address') | ipaddr('address') | first }}": -1{{ '' if loop.last else ',' }} +{% endfor %} +} diff --git a/roles/friwall/templates/settings.json.j2 b/roles/friwall/templates/settings.json.j2 new file mode 100644 index 0000000..3086ff3 --- /dev/null +++ b/roles/friwall/templates/settings.json.j2 @@ -0,0 +1,10 @@ +{ + "ldap_host": "{{ domain }}", + "ldap_user": "{{ password.ldap_user }}", + "ldap_pass": "{{ password.ldap_pass }}", + "ldap_base_dn": "{{ ldap_base_dn }}", + "oidc_server": "{{ password.oidc_server }}", + "oidc_client_id": "{{ password.oidc_client_id }}", + "oidc_client_secret": "{{ password.oidc_client_secret }}", + "wg_net": "{{ wg_net }}" +}