From f6d484ffe91e3a64c651481c8e7481d32d801152 Mon Sep 17 00:00:00 2001
From: Paul Maruhn <paulmaruhn@posteo.de>
Date: Tue, 16 Nov 2021 02:37:46 +0100
Subject: [PATCH] wip: add monitoring configs

---
 group_vars/{all.yml => gateways.yml}          |  0
 hosts.yml                                     |  7 ++
 playbook.yml                                  |  5 ++
 roles/services/files/authorized_keys          | 11 +++
 roles/services/files/etc/apt/sources.list     |  8 ++
 .../services/files/etc/cron.d/update-apt-list |  4 +
 roles/services/files/etc/motd                 | 26 ++++++
 roles/services/files/etc/resolv.conf          |  4 +
 roles/services/files/grafana.list             |  1 +
 .../services/files/prometheus/first_rules.yml | 34 +++++++
 .../services/files/prometheus/prometheus.yml  | 88 +++++++++++++++++++
 roles/services/tasks/base.yml                 | 42 +++++++++
 roles/services/tasks/main.yml                 | 16 ++++
 roles/services/tasks/monitoring.yml           | 31 +++++++
 roles/services/tasks/software.yml             | 46 ++++++++++
 15 files changed, 323 insertions(+)
 rename group_vars/{all.yml => gateways.yml} (100%)
 create mode 100644 roles/services/files/authorized_keys
 create mode 100644 roles/services/files/etc/apt/sources.list
 create mode 100644 roles/services/files/etc/cron.d/update-apt-list
 create mode 100644 roles/services/files/etc/motd
 create mode 100644 roles/services/files/etc/resolv.conf
 create mode 100644 roles/services/files/grafana.list
 create mode 100644 roles/services/files/prometheus/first_rules.yml
 create mode 100644 roles/services/files/prometheus/prometheus.yml
 create mode 100644 roles/services/tasks/base.yml
 create mode 100644 roles/services/tasks/main.yml
 create mode 100644 roles/services/tasks/monitoring.yml
 create mode 100644 roles/services/tasks/software.yml

diff --git a/group_vars/all.yml b/group_vars/gateways.yml
similarity index 100%
rename from group_vars/all.yml
rename to group_vars/gateways.yml
diff --git a/hosts.yml b/hosts.yml
index d36ef30..ec06d1d 100644
--- a/hosts.yml
+++ b/hosts.yml
@@ -1,4 +1,7 @@
 gateways:
+  vars:
+    ansible_python_interpreter: /usr/bin/env python3
+    ansible_ssh_user: root
   hosts:
     kaisertor:
       ansible_ssh_host: kaisertor.mesh.ffhl.chaotikum.org
@@ -10,6 +13,10 @@ gateways:
       ansible_ssh_host: muehlentor.mesh.ffhl.chaotikum.org
     test:
       ansible_ssh_host: test.mesh.ffhl.chaotikum.org
+service_hosts:
   vars:
     ansible_python_interpreter: /usr/bin/env python3
     ansible_ssh_user: root
+  hosts:
+    srv02:
+      ansible_ssh_host: srv02.luebeck.freifunk.net
diff --git a/playbook.yml b/playbook.yml
index e9a3039..e4a8184 100644
--- a/playbook.yml
+++ b/playbook.yml
@@ -8,3 +8,8 @@
   become: yes
   roles:
     - icvpn
+
+- hosts: service_hosts
+  become: yes
+  roles:
+    - services
diff --git a/roles/services/files/authorized_keys b/roles/services/files/authorized_keys
new file mode 100644
index 0000000..0acdd27
--- /dev/null
+++ b/roles/services/files/authorized_keys
@@ -0,0 +1,11 @@
+# paul
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFEE6VP2jNtotQHEdc+qyw9jHA8Z2Bj2BAwKyhH/SjRG paul@tapas
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMNci5346re/3QqOhjC9PW1Zo0MA47hMm2r1GcEvdgff paul@taco
+
+# yksflip
+ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGFEc3u8Zffw9l7kIJRBB5p1RXHtA7LSDl6li/Zr6C1e yksflip@laptop
+
+# linus
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEApOTMJ+6z+x7jKeMRKj0imqdNdc65T+n8GKtNtf9KZjHf17K547JfDc0i4/SdCJO6Kud8gaoSm4YxhzOsJ/9c3GmyedvtyMJ1KFyTqd0PDOmvsgjviD4EfdENen55rYRwovKAHFgBN7vksgdcZcgVBCkApTrJelHVaHRukji7lNDNdA09qZBYkBPluPWA5MxFkntfarKzkSxdPnspkVmjSYYJ+PRiVJ5kcFv+FwjwmWjBSg8Ua5CSQ4kpUfCzXVXdnWKaaOcOqDkoIyr7/FHPNt9t35MpTjFrZ9s9o0DvPjaMW6fG6m0oq7IqBIZQR/iI8zTG+3LqkNwE0UH1gfidGrWLLNfZsP6HWKuJ6aUSaEBLBQV03wrj+9TDbCj4BiJHEUoG8rtPomsoP/kVuxvQhazJtGBvi2dY7lvirNrDdL+Cx3Po6DhTsJ4ScadWBjIiLJD4aN/k7WEp5i71du0PesyMiWlFyFlUXJh04OR7S7lD09s6m1bpNnyYXsyekJDbROckCZJCBd6Nq9JS0OekbFhGD2a9Yn9SZwl6qxsxvvadr0DoGVKBAo5VBOEsCFOZdQ9GPhBg8alQLBpjfG7M1rIP4Fq+5GYgsApq0SXP9HUXqpCTU1G3GKuaPO6dU1onJn9CxaJ/IrPzkbah7pLEtCypu2NjD0LXEFVfmzi/vm0= linus@Linus-Debian
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDVrG1RXV37uiljc2NuBnrJ3j4t29sdmGTk7LsWohevSM7hhFxv2d3gEaaHqW0GXtDjtGJBYruDo+/rDdsyx10Sc94WkIoWYaSEqE5h9VSCgzeLPZZdV79HtEdsS989wvOyQ6ontNkkPv3WE4Xn9WgVd2ZKvTmglWt8kr6bzUfrIw2FduZqcogs/QmkCmVbsPjCVN9GChqPfGYy/rvfibA4KgJ81mbvFnQEfaCVgIoqBjdxsrLPFVYULsYOozNRvxNMNbZwVhqLO52ixY1sDEH7fsPHGmAX/KLJykJeD+m5Hq6y0y2CVO6/xs7rbENItq8bzwI2jom3Afvfdtjh3IxKSVmda+oXYVPrLdpd8nK8757gimWjHhSofJyybKpyxj6GhuJy+v+7SbBTY4jxPzyQxI1TDtCxrYD8hoM8oGHtjitNuP/GeMjPZTpkapvELiuDKZtSUrMKqRtQhDOQDFF2TwOIfIqUWp2YoMZCEvov0uR3CyHQVLR3+0GFoN1kYcAAALzFGWDGjH/KgBdjIBz7USAKRCjeMzy48DG/Qy4Xoz6fRBvyIZRAK3JJIAcCJWwRYi35LhT11kAqtM34qshvTXD6OulpbCOiBxXJCt383ILUcbPQYYbHaEptTs0QDtMJziE3PyVcSNKmvVB/IIJc4cC4W2adKnk9fwL4auoYmw== linus@work-lptp-sw
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYFR2UBd/Kv2eBCq3uYJWHhnxmC7903lQizTx2s6iTaFKR69qDjwdRP+bLHGwO0/uvlgDOh+SH+im3wA4mqGQCSaKB2eTJszkiuFCczLfx0ivhoGVu8myGLmSwbwP6COyQoFDvpayCL3lV4nVGFxgukOb89LiGlzScgKQEaQxPMNT+xijt1uPACxtybNtKLXmXlz1tDPgJzmswZM0tSuPVCjIqNAgvC+T70mow1KfSh3sE5e12PLQ8J43sD8UwuC1j0o6taZ2PleUSiCYOy+mzQjdN2+Ibq88pfRByWE18RfQEkvOygSv0rvMynjN7Cd/72jAActuhQZeAKDXQsxtB l@flausch
diff --git a/roles/services/files/etc/apt/sources.list b/roles/services/files/etc/apt/sources.list
new file mode 100644
index 0000000..4209473
--- /dev/null
+++ b/roles/services/files/etc/apt/sources.list
@@ -0,0 +1,8 @@
+deb http://deb.debian.org/debian bullseye main
+deb-src http://deb.debian.org/debian bullseye main
+
+deb http://deb.debian.org/debian-security/ bullseye-security main
+deb-src http://deb.debian.org/debian-security/ bullseye-security main
+
+deb http://deb.debian.org/debian bullseye-updates main
+deb-src http://deb.debian.org/debian bullseye-updates main
diff --git a/roles/services/files/etc/cron.d/update-apt-list b/roles/services/files/etc/cron.d/update-apt-list
new file mode 100644
index 0000000..eb550fd
--- /dev/null
+++ b/roles/services/files/etc/cron.d/update-apt-list
@@ -0,0 +1,4 @@
+# update the package lists so prometheus can alert us
+# if there are many updates available
+
+7 22 * * * apt-get update
diff --git a/roles/services/files/etc/motd b/roles/services/files/etc/motd
new file mode 100644
index 0000000..bed787c
--- /dev/null
+++ b/roles/services/files/etc/motd
@@ -0,0 +1,26 @@
+The programs included with the Debian GNU/Linux system are free software;
+the exact distribution terms for each program are described in the
+individual files in /usr/share/doc/*/copyright.
+
+Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
+permitted by applicable law.
+
+MMMMMMMMMMMMMMMMMMMMMMMMMWMMMMMMWWMMMMMMMMWNKkdlc:;,,,,;;:lox0XWMMMMMMMMMMMMMMMM
+MMMMMMMMMMMMMMMMMMMMMMMMNKXWWWWWKKMMMMMWNKxl:,,;cloddddooc:,,;cd0NWMMMMMMMMMMMMM
+MMMMMMMMMMMMWWMMMMMMMMWN0okXXXXKddKXNNKdl:,,:okOKXXNNNNXXK0kdc;,;lONMMMMMMMMMMMM
+MMMMMWWNXKK0000KKXNWNXXXkckWMMMNooXN0xl;,;cx0XXNNWWWNXWWWNNNXKOo;,;dKWMMMMMMMMMM
+MMMWXKOO0000OO0000OOO0NMk,dWMMMK:cKXd::cldKXXNWMMMMM0ONMMMMWWNXXkc,,l0WMMMMMMMMM
+MWX0O000KKXKxkXXK0OOOO0Ko'lXMMMO,;kd;,:kK0KNWMMMMMMWxlKMMMMMMWNXX0l,,lKWMMMMMMMM
+WKOOKKKXNWMXokWMWKO0KKOx:.:KMMWx''::,;xXXK0XWMMMMMMNl;OMMMMMMMWXKKOl::dKXXNWMMMM
+KO0K0KWMMMM0:oNMNKXNKK0o'.'dNM0:...',l0XKXXKWNNMMMMK:'xWMMMMWXXXKKKd,,c0WNXXXWMM
+OOK0KWMMMMWx':KMNKNMWKkc...:0Wx'...',oXXKNXKNOkWMMMO,.oNMMWNKXWMXk0x;':OWMMWNKXW
+OOK0XMMMMMNo.,OMNKNMMXx:...:0Wx'...',oKXKXXKXdlXMW0c..;xNWXKNMMMKokx;':0MMMMMWKX
+OOK0KMMMMWk;..lXWXKWWKk:...:0Wx'...',:OXKKKXKc:0MNo....;0NKNMMMWk:ll,.cKMMMMMMNK
+0O0K0NMMMNl...,kMWXXX0Oc...:0Xo.....',l0KKKNk,'dNNo....;0XKWMMWXo'','.:0MMMMMMWK
+X0OKK0XWMXl...,kMMN0k0k:...,:;'.......;oxOXO:..:0MO;...oNXKWMWN0l..''.,kMMMMMMWK
+WN0O0KKKX0c...,xXXKK0Od;...............,;ckk:..;0M0:..'xWNKXNXXx,......cKMMMMMNK
+MMWX0O000k:...'o0000O0O:................'';;'..;kNO;..'dXNX00kl,.......,kMMMMNKX
+MMMMWXKOdc'....;ok0OkXXc.................,;,...'okl'...:xkdlcc;'.......,kMMNXXNM
+MMMMMW0o'........;l:':o;.................','.............'''',,'.......,xXXXNWMM
+MMMMNx,................................................................,xNWMMMMM
+MMMMXc.................................................................,kMMMMMMM
diff --git a/roles/services/files/etc/resolv.conf b/roles/services/files/etc/resolv.conf
new file mode 100644
index 0000000..86434c7
--- /dev/null
+++ b/roles/services/files/etc/resolv.conf
@@ -0,0 +1,4 @@
+search luebeck.freifunk.net ffhl.de
+nameserver 1.1.1.1
+nameserver 2001:4860:4860::8888
+nameserver 8.8.4.4
diff --git a/roles/services/files/grafana.list b/roles/services/files/grafana.list
new file mode 100644
index 0000000..adbad20
--- /dev/null
+++ b/roles/services/files/grafana.list
@@ -0,0 +1 @@
+deb https://packages.grafana.com/oss/deb stable main
diff --git a/roles/services/files/prometheus/first_rules.yml b/roles/services/files/prometheus/first_rules.yml
new file mode 100644
index 0000000..fdf8d95
--- /dev/null
+++ b/roles/services/files/prometheus/first_rules.yml
@@ -0,0 +1,34 @@
+groups:
+  - name: ffhl
+    rules:
+    - record: "fastd_peer_traffic_sum"
+      expr: 'sum by (key, name) (rate(fastd_peer_traffic{iface=~"ffhl_mesh_vpn.*", kind="bytes", type=~"rx|tx"}[1m]))'
+    - record: "ffhl_mesh_links"
+      expr: 'count by (link_type) (link_tq{link_type!="undefined"})'
+
+    - record: "ffhl_nodes_online_percentage"
+      expr: 'meshnodes_online_total{job="hopglass"} / meshnodes_total{job="hopglass"}'
+
+    - record: "ffhl_mesh_avg_link_quality"
+      expr: 'avg by (link_type)(link_tq{link_type!="undefined"})'
+
+    - record: "ffhl_mesh_connected_clients_24"
+      expr: 'avg_over_time(total_clients{job="hopglass",instance_!="hopglass"}[24h])'
+
+    - record: 'ffhl_firmware_distribution'
+      expr: 'count by (firmware)(online{firmware!="", instance_!="hopglass"})'
+
+    - record: 'ffhl_device_distribution'
+      expr: 'count by (model)(online{model!="", instance_!="hopglass"})'
+
+    - record: 'ffhl_gateway_distribution'
+      expr: 'count by (gateway) (online{gateway!="", job="hopglass"})'
+
+    - record: 'ffhl_mesh_sum_traffic_type'
+      expr: 'sum by (type) (rate(statistics_traffic[300s]))'
+
+    - record: "ffhl_mesh_sum_traffic_mtype"
+      expr: 'sum by (mtype) (rate(statistics_traffic[300s]))'
+
+    - record: 'ffhl_node_statistics_traffic'
+      expr: 'sum by (nodeid, mtype) (rate(statistics_traffic{site="ffhl", instance_!="hopglass"}[5m]) * 8)'
diff --git a/roles/services/files/prometheus/prometheus.yml b/roles/services/files/prometheus/prometheus.yml
new file mode 100644
index 0000000..5e2a665
--- /dev/null
+++ b/roles/services/files/prometheus/prometheus.yml
@@ -0,0 +1,88 @@
+# Sample config for Prometheus.
+
+global:
+  scrape_interval:     90s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
+  evaluation_interval: 60s # Evaluate rules every 15 seconds. The default is every 1 minute.
+  # scrape_timeout is set to the global default (10s).
+
+# Alertmanager configuration
+alerting:
+  alertmanagers:
+  - static_configs:
+    - targets: ['localhost:9093']
+
+# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
+rule_files:
+  - "first_rules.yml"
+  #- "second_rules.yml"
+
+# A scrape configuration containing exactly one endpoint to scrape:
+# Here it's Prometheus itself.
+scrape_configs:
+  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
+  - job_name: 'hopglass'
+    static_configs:
+      - targets: ['localhost:4000']
+  - job_name: 'gateways'
+    static_configs:
+    - targets:
+      - "muehlentor.mesh.ffhl.chaotikum.org:9100"
+      - "holstentor.mesh.ffhl.chaotikum.org:9100"
+      - "kaisertor.mesh.ffhl.chaotikum.org:9100"
+      - "huextertor.mesh.ffhl.chaotikum.org:9100"
+      - "builder.luebeck.freifunk.net:9100"
+      - "srv02.luebeck.freifunk.net:9100"
+      - "srv03.luebeck.freifunk.net:9100"
+      - "blueberry.luebeck.freifunk.net:9100"
+      - "strawberry.luebeck.freifunk.net:9100"
+  - job_name: powerdns
+    static_configs:
+    - targets:
+      - 'blueberry.luebeck.freifunk.net:8082'
+      - 'srv02.luebeck.freifunk.net:8082'
+      - 'kaisertor.luebeck.freifunk.net:8082'
+      - 'huextertor.luebeck.freifunk.net:8082'
+      - 'holstentor.luebeck.freifunk.net:8082'
+      - 'muehlentor.luebeck.freifunk.net:8082'
+  - job_name: gitea
+    static_configs:
+      - targets: ['git.luebeck.freifunk.net']
+  - job_name: requestd
+    scrape_interval: 60s
+    metrics_path: "/hooks/metrics"
+    static_configs:
+    - targets: ['localhost:21001']
+  - job_name: fastd
+    scrape_interval: 15s
+    static_configs:
+    - targets:
+      - 'kaisertor.luebeck.freifunk.net:9281'
+      - 'muehlentor.luebeck.freifunk.net:9281'
+      - 'holstentor.luebeck.freifunk.net:9281'
+      - 'huextertor.luebeck.freifunk.net:9281'
+      - 'testgw.luebeck.freifunk.net:9281'
+  - job_name: bird
+    scrape_interval: 15s
+    static_configs:
+      - targets:
+        - 'kaisertor.luebeck.freifunk.net:9324'
+        - 'huextertor.luebeck.freifunk.net:9324'
+        - 'holstentor.luebeck.freifunk.net:9324'
+        - 'muehlentor.luebeck.freifunk.net:8082'
+  - job_name: 'blackbox'
+    metrics_path: /probe
+    scrape_interval: 15s
+    params:
+      module: [icmp]
+    static_configs:
+    - targets:
+      - 'google.com'
+      - 'ipv6.google.com'
+      - '1.1.1.1'
+    relabel_configs:
+    - source_labels: [__address__]
+      target_label: __param_target
+    - source_labels: [__param_target]
+      target_label: target
+    - target_label: __address__
+      replacement: '192.168.1.22:9115'
diff --git a/roles/services/tasks/base.yml b/roles/services/tasks/base.yml
new file mode 100644
index 0000000..2a5e024
--- /dev/null
+++ b/roles/services/tasks/base.yml
@@ -0,0 +1,42 @@
+---
+
+- name: Disable root login with password
+  tags: [base]
+  lineinfile:
+    dest: /etc/ssh/sshd_config
+    regexp: "^#?PermitRootLogin"
+    line: "PermitRootLogin prohibit-password"
+
+
+# configurations and stuff
+- name: set local timezone
+  file:
+    state: link
+    src: /usr/share/zoneinfo/Europe/Berlin
+    dest: /etc/localtime
+
+
+- name: set locales
+  tags: [base]
+  block:
+    - lineinfile: dest=/etc/locale.gen line="en_US.UTF-8 UTF-8"
+    - lineinfile: dest=/etc/locale.gen line="de_DE.UTF-8 UTF-8"
+    - command: locale-gen
+
+- name: Copy authorized keys file
+  ansible.builtin.copy:
+    src: authorized_keys
+    dest: /root/.ssh/authorized_keys
+    owner: root
+    group: root
+
+- name: copy base configs
+  tags: [base, etc, apt, powerdns]
+  copy:
+    src: etc/
+    dest: /etc
+
+
+- name: install base tools
+  include: software.yml
+  tags: [base, apt, software]
diff --git a/roles/services/tasks/main.yml b/roles/services/tasks/main.yml
new file mode 100644
index 0000000..399967c
--- /dev/null
+++ b/roles/services/tasks/main.yml
@@ -0,0 +1,16 @@
+---
+- name: base config
+  tags: [base]
+  include_tasks:
+    file: base.yml
+    apply:
+      tags: [base]
+
+
+- name: install packages
+  include: software.yml
+  tags: [base, apt, software]
+
+- name: install packages
+  include: monitoring.yml
+  tags: [base, apt, software]
diff --git a/roles/services/tasks/monitoring.yml b/roles/services/tasks/monitoring.yml
new file mode 100644
index 0000000..fc92473
--- /dev/null
+++ b/roles/services/tasks/monitoring.yml
@@ -0,0 +1,31 @@
+---
+- name: copy prometheus config files
+  copy:
+    src: prometheus
+    dest: /etc/
+
+- name: restart prometheus
+  systemd:
+    state: restarted
+    name: prometheus
+
+
+#
+# Install Grafana
+#
+
+- name: add grafana repo pubkey
+  shell:
+    cmd: wget -q -O - https://packages.grafana.com/gpg.key | apt-key add -
+    warn: false
+
+- name: setup grafana repo
+  copy:
+    src: grafana.list
+    dest: /etc/apt/sources.list.d/
+
+- name: install grafana
+  apt:
+    update_cache: yes
+    state: present
+    name: grafana
diff --git a/roles/services/tasks/software.yml b/roles/services/tasks/software.yml
new file mode 100644
index 0000000..3ab69da
--- /dev/null
+++ b/roles/services/tasks/software.yml
@@ -0,0 +1,46 @@
+---
+
+- name: install python3-apt
+  command:
+    cmd: apt-get install -y python3-apt
+    warn: false
+
+- name: remove packages that are not needed
+  apt:
+    update_cache: yes
+    state: absent
+    name:
+      - cron-apt
+      - mutt
+
+- name: install tools
+  apt:
+    autoremove: yes
+    update_cache: yes
+    state: present
+    name:
+      # essential packages
+      - git
+      - openssh-server
+      - prometheus-node-exporter
+      - python3-apt
+      - apt-transport-https
+      - curl
+      # other useful tools
+      - apt-file
+      - bridge-utils
+      - dnsutils
+      - htop
+      - iftop
+      - iperf3
+      - iputils-ping
+      - jq
+      - molly-guard
+      - openssh-client
+      - python3-yaml
+      - socat
+      - tcpdump
+      - vim
+      - wget
+      - rsync
+      - nmap
-- 
GitLab