This ansible role creates a mesh network based on the B.A.T.M.A.N.-adv protocol on a set of Raspberry Pi's. It further installs a DHCP server on one of the nodes to provide dynamic IP addresses in the mesh.
Install ansible via pip:
pip install -r requirements.txt
On Ubuntu, also install sshpass to enable password usage in Ansible:
sudo apt-get install sshpass
Install ansible-galaxy dependencies
ansible-galaxy install -r requirements.yaml
Adjust the inventory file and add one of the nodes to the dhcp
group , i.e.
[dhcp]
pi-1 ansible_host="192.168.21.153" ansible_user="pi" ansible_password="raspberry"
[clients]
pi-2 ansible_host="192.168.21.123" ansible_user="pi" ansible_password="raspberry"
pi-3 ansible_host="192.168.21.124" ansible_user="pi" ansible_password="raspberry"
Adjust variables in defaults/main.yml
and run the playbook with:
ansible-playbook -i inventory install-mesh.yml
In case the mesh IPs should be configured manually, leave the dhcp
group empty, set manual_ip: "true"
in defaults/main.yml
and provide a mesh_ip
variable for each node in the infrastructure, i.e.:
[dhcp]
[clients]
pi-2 ansible_host="192.168.21.123" ansible_user="pi" ansible_password="raspberry" mesh_ip="10.1.1.1"
pi-3 ansible_host="192.168.21.124" ansible_user="pi" ansible_password="raspberry" mesh_ip="10.1.1.2"
Node-exporter is installed on every node and provides system metrics at http://<NODE-IP>:9100/metrics
.
In addition, a custom exporter is configured to also provide statistics of the underlying mesh network, i.e.
# mesh interface statistics
batman_tx{batdev="bat0"} 26598906
batman_tx_bytes{batdev="bat0"} 10901024476
batman_tx_dropped{batdev="bat0"} 1374
batman_rx{batdev="bat0"} 43662337
batman_rx_bytes{batdev="bat0"} 8647520132
batman_forward{batdev="bat0"} 9005
batman_forward_bytes{batdev="bat0"} 1186985
batman_mgmt_tx{batdev="bat0"} 2441845
batman_mgmt_tx_bytes{batdev="bat0"} 209268554
batman_mgmt_rx{batdev="bat0"} 12848102
batman_mgmt_rx_bytes{batdev="bat0"} 1054782600
batman_frag_tx{batdev="bat0"} 1884876738
batman_frag_tx_bytes{batdev="bat0"} 1464558127462
batman_frag_rx{batdev="bat0"} 1567538519
batman_frag_rx_bytes{batdev="bat0"} 1196031896478
batman_frag_fwd{batdev="bat0"} 54060
batman_frag_fwd_bytes{batdev="bat0"} 42004620
batman_tt_request_tx{batdev="bat0"} 3622
batman_tt_request_rx{batdev="bat0"} 115
batman_tt_response_tx{batdev="bat0"} 115
batman_tt_response_rx{batdev="bat0"} 337
batman_tt_roam_adv_tx{batdev="bat0"} 0
batman_tt_roam_adv_rx{batdev="bat0"} 0
batman_dat_get_tx{batdev="bat0"} 143065
batman_dat_get_rx{batdev="bat0"} 6463
batman_dat_put_tx{batdev="bat0"} 24
batman_dat_put_rx{batdev="bat0"} 0
batman_dat_cached_reply_tx{batdev="bat0"} 728
batman_nc_code{batdev="bat0"} 0
batman_nc_code_bytes{batdev="bat0"} 0
batman_nc_recode{batdev="bat0"} 0
batman_nc_recode_bytes{batdev="bat0"} 0
batman_nc_buffer{batdev="bat0"} 0
batman_nc_decode{batdev="bat0"} 0
batman_nc_decode_bytes{batdev="bat0"} 0
batman_nc_decode_failed{batdev="bat0"} 0
batman_nc_sniffed{batdev="bat0"} 0
# direct neighbors in the mesh network
# tp = throughput
batman_neighbor_tp{neighbor="fa:16:3e:fb:26:c6"} 164.83
batman_neighbor_latency{neighbor="fa:16:3e:fb:26:c6"} 0.217
batman_neighbor_tp{neighbor="fa:16:3e:40:c7:76"} 59.43
batman_neighbor_latency{neighbor="fa:16:3e:40:c7:76"} 0.686
batman_neighbor_tp{neighbor="fa:16:3e:b9:ac:92"} 87.41
batman_neighbor_latency{neighbor="fa:16:3e:b9:ac:92"} 0.229
batman_neighbor_tp{neighbor="fa:16:3e:db:e6:61"} 0
batman_neighbor_latency{neighbor="fa:16:3e:db:e6:61"} 0.465
batman_neighbor_tp{neighbor="fa:16:3e:87:53:fc"} 23.59
batman_neighbor_latency{neighbor="fa:16:3e:87:53:fc"} 21.394