From 9bd7af9c5a1157efb9be75694800635bcb0bbf89 Mon Sep 17 00:00:00 2001 From: Jakub Filo Date: Sat, 21 Dec 2019 19:55:27 +0000 Subject: [PATCH] Added Raspberry Pi temperature monitoring through zabbix configuration --- libvirthost.yml | 1 + production | 4 + raspberry.yml | 8 + .../files/etc/modules-load.d/i2c.conf | 1 + .../zabbix/zabbix_agentd.conf.d/bme280.conf | 2 + .../files/usr/local/bin/bme280.py | 172 ++++++++++++++++++ roles/bme280sensor/tasks/main.yml | 30 +++ .../etc/zabbix/zabbix_agentd.conf.d/nut.conf | 2 + roles/nutserver/tasks/main.yml | 57 ++++++ roles/raspberry/tasks/main.yml | 27 +++ .../zabbix/zabbix_agentd.conf.d/server.conf | 7 + roles/zabbixagent/files/srv/common/zabbix.psk | 1 + roles/zabbixagent/tasks/main.yml | 37 ++++ site.yml | 1 + 14 files changed, 350 insertions(+) create mode 100644 raspberry.yml create mode 100644 roles/bme280sensor/files/etc/modules-load.d/i2c.conf create mode 100644 roles/bme280sensor/files/etc/zabbix/zabbix_agentd.conf.d/bme280.conf create mode 100755 roles/bme280sensor/files/usr/local/bin/bme280.py create mode 100644 roles/bme280sensor/tasks/main.yml create mode 100644 roles/nutserver/files/etc/zabbix/zabbix_agentd.conf.d/nut.conf create mode 100644 roles/nutserver/tasks/main.yml create mode 100644 roles/raspberry/tasks/main.yml create mode 100644 roles/zabbixagent/files/etc/zabbix/zabbix_agentd.conf.d/server.conf create mode 100644 roles/zabbixagent/files/srv/common/zabbix.psk create mode 100644 roles/zabbixagent/tasks/main.yml diff --git a/libvirthost.yml b/libvirthost.yml index 2600cdc..c0b4723 100644 --- a/libvirthost.yml +++ b/libvirthost.yml @@ -5,3 +5,4 @@ - crypto - libvirthost - iscsitarget + - zabbixagent diff --git a/production b/production index 3e8d3ef..049aed1 100644 --- a/production +++ b/production @@ -3,3 +3,7 @@ [libvirthost] 10.91.1.3 + +[raspberry] +10.91.1.4 + diff --git a/raspberry.yml b/raspberry.yml new file mode 100644 index 0000000..9740bd7 --- /dev/null +++ b/raspberry.yml @@ -0,0 +1,8 @@ +--- +- hosts: raspberry + roles: + - common + - raspberry + - zabbixagent + - nutserver + - bme280sensor diff --git a/roles/bme280sensor/files/etc/modules-load.d/i2c.conf b/roles/bme280sensor/files/etc/modules-load.d/i2c.conf new file mode 100644 index 0000000..0cdf71f --- /dev/null +++ b/roles/bme280sensor/files/etc/modules-load.d/i2c.conf @@ -0,0 +1 @@ +i2c-dev diff --git a/roles/bme280sensor/files/etc/zabbix/zabbix_agentd.conf.d/bme280.conf b/roles/bme280sensor/files/etc/zabbix/zabbix_agentd.conf.d/bme280.conf new file mode 100644 index 0000000..205747c --- /dev/null +++ b/roles/bme280sensor/files/etc/zabbix/zabbix_agentd.conf.d/bme280.conf @@ -0,0 +1,2 @@ +UserParameter=bme[*],/usr/bin/python /usr/local/bin/bme280.py | grep '$1:' | cut -d ' ' -f 2 + diff --git a/roles/bme280sensor/files/usr/local/bin/bme280.py b/roles/bme280sensor/files/usr/local/bin/bme280.py new file mode 100755 index 0000000..7dbe073 --- /dev/null +++ b/roles/bme280sensor/files/usr/local/bin/bme280.py @@ -0,0 +1,172 @@ +#!/usr/bin/python +#-------------------------------------- +# ___ ___ _ ____ +# / _ \/ _ \(_) __/__ __ __ +# / , _/ ___/ /\ \/ _ \/ // / +# /_/|_/_/ /_/___/ .__/\_, / +# /_/ /___/ +# +# bme280.py +# Read data from a digital pressure sensor. +# +# Official datasheet available from : +# https://www.bosch-sensortec.com/bst/products/all_products/bme280 +# +# Author : Matt Hawkins +# Date : 21/01/2018 +# +# https://www.raspberrypi-spy.co.uk/ +# +#-------------------------------------- +import smbus +import time +from ctypes import c_short +from ctypes import c_byte +from ctypes import c_ubyte + +DEVICE = 0x76 # Default device I2C address + + +bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1 + # Rev 1 Pi uses bus 0 + +def getShort(data, index): + # return two bytes from data as a signed 16-bit value + return c_short((data[index+1] << 8) + data[index]).value + +def getUShort(data, index): + # return two bytes from data as an unsigned 16-bit value + return (data[index+1] << 8) + data[index] + +def getChar(data,index): + # return one byte from data as a signed char + result = data[index] + if result > 127: + result -= 256 + return result + +def getUChar(data,index): + # return one byte from data as an unsigned char + result = data[index] & 0xFF + return result + +def readBME280ID(addr=DEVICE): + # Chip ID Register Address + REG_ID = 0xD0 + (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2) + return (chip_id, chip_version) + +def readBME280All(addr=DEVICE): + # Register Addresses + REG_DATA = 0xF7 + REG_CONTROL = 0xF4 + REG_CONFIG = 0xF5 + + REG_CONTROL_HUM = 0xF2 + REG_HUM_MSB = 0xFD + REG_HUM_LSB = 0xFE + + # Oversample setting - page 27 + OVERSAMPLE_TEMP = 2 + OVERSAMPLE_PRES = 2 + MODE = 1 + + # Oversample setting for humidity register - page 26 + OVERSAMPLE_HUM = 2 + bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM) + + control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE + bus.write_byte_data(addr, REG_CONTROL, control) + + # Read blocks of calibration data from EEPROM + # See Page 22 data sheet + cal1 = bus.read_i2c_block_data(addr, 0x88, 24) + cal2 = bus.read_i2c_block_data(addr, 0xA1, 1) + cal3 = bus.read_i2c_block_data(addr, 0xE1, 7) + + # Convert byte data to word values + dig_T1 = getUShort(cal1, 0) + dig_T2 = getShort(cal1, 2) + dig_T3 = getShort(cal1, 4) + + dig_P1 = getUShort(cal1, 6) + dig_P2 = getShort(cal1, 8) + dig_P3 = getShort(cal1, 10) + dig_P4 = getShort(cal1, 12) + dig_P5 = getShort(cal1, 14) + dig_P6 = getShort(cal1, 16) + dig_P7 = getShort(cal1, 18) + dig_P8 = getShort(cal1, 20) + dig_P9 = getShort(cal1, 22) + + dig_H1 = getUChar(cal2, 0) + dig_H2 = getShort(cal3, 0) + dig_H3 = getUChar(cal3, 2) + + dig_H4 = getChar(cal3, 3) + dig_H4 = (dig_H4 << 24) >> 20 + dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F) + + dig_H5 = getChar(cal3, 5) + dig_H5 = (dig_H5 << 24) >> 20 + dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F) + + dig_H6 = getChar(cal3, 6) + + # Wait in ms (Datasheet Appendix B: Measurement time and current calculation) + wait_time = 1.25 + (2.3 * OVERSAMPLE_TEMP) + ((2.3 * OVERSAMPLE_PRES) + 0.575) + ((2.3 * OVERSAMPLE_HUM)+0.575) + time.sleep(wait_time/1000) # Wait the required time + + # Read temperature/pressure/humidity + data = bus.read_i2c_block_data(addr, REG_DATA, 8) + pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4) + temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4) + hum_raw = (data[6] << 8) | data[7] + + #Refine temperature + var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11 + var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14 + t_fine = var1+var2 + temperature = float(((t_fine * 5) + 128) >> 8); + + # Refine pressure and adjust for temperature + var1 = t_fine / 2.0 - 64000.0 + var2 = var1 * var1 * dig_P6 / 32768.0 + var2 = var2 + var1 * dig_P5 * 2.0 + var2 = var2 / 4.0 + dig_P4 * 65536.0 + var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0 + var1 = (1.0 + var1 / 32768.0) * dig_P1 + if var1 == 0: + pressure=0 + else: + pressure = 1048576.0 - pres_raw + pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1 + var1 = dig_P9 * pressure * pressure / 2147483648.0 + var2 = pressure * dig_P8 / 32768.0 + pressure = pressure + (var1 + var2 + dig_P7) / 16.0 + + # Refine humidity + humidity = t_fine - 76800.0 + humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity))) + humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0) + if humidity > 100: + humidity = 100 + elif humidity < 0: + humidity = 0 + + return temperature/100.0,pressure/100.0,humidity + +def main(): + + (chip_id, chip_version) = readBME280ID() + print "Chip ID:", chip_id + print "Version:", chip_version + + temperature,pressure,humidity = readBME280All() + + print "Temperature:", temperature + print "Pressure:", pressure + print "Humidity:", humidity + +if __name__=="__main__": + main() diff --git a/roles/bme280sensor/tasks/main.yml b/roles/bme280sensor/tasks/main.yml new file mode 100644 index 0000000..a7c90bb --- /dev/null +++ b/roles/bme280sensor/tasks/main.yml @@ -0,0 +1,30 @@ +--- +- name: install packages + apt: + state: latest + pkg: + - python-smbus + - i2c-tools + install_recommends: no + force_apt_get: yes + become: yes + +- name: copy config files, scripts and services + copy: + src: "{{ item }}" + dest: "/{{ item }}" + force: yes + mode: preserve + become: yes + with_items: + - etc/modules-load.d/ + - usr/local/bin/ + - etc/zabbix/zabbix_agentd.conf.d/ + +- name: Add user zabbix to i2c group + user: + name: zabbix + groups: i2c + append: yes + become: yes + diff --git a/roles/nutserver/files/etc/zabbix/zabbix_agentd.conf.d/nut.conf b/roles/nutserver/files/etc/zabbix/zabbix_agentd.conf.d/nut.conf new file mode 100644 index 0000000..f1a9ed0 --- /dev/null +++ b/roles/nutserver/files/etc/zabbix/zabbix_agentd.conf.d/nut.conf @@ -0,0 +1,2 @@ +UserParameter=nut[*],/usr/bin/upsc $1 2>/dev/null | grep '$2:' | cut -d ' ' -f 2 + diff --git a/roles/nutserver/tasks/main.yml b/roles/nutserver/tasks/main.yml new file mode 100644 index 0000000..e615250 --- /dev/null +++ b/roles/nutserver/tasks/main.yml @@ -0,0 +1,57 @@ +--- +- name: install packages + apt: + state: latest + pkg: + - nut + install_recommends: no + force_apt_get: yes + become: yes + +- name: copy config files, scripts and services + copy: + src: "{{ item }}" + dest: "/{{ item }}" + force: yes + mode: preserve + become: yes + with_items: + - etc/zabbix/zabbix_agentd.conf.d/nut.conf + +- name: configure nut + lineinfile: + path: /etc/nut/nut.conf + regexp: '^MODE=' + line: 'MODE=standalone' + owner: root + group: root + mode: '0640' + become: yes + +- name: configure ups in nut + blockinfile: + state: present + path: /etc/nut/ups.conf + backup: yes + marker: "# {mark}" + marker_begin: "BEGIN MANAGED BY PLANTROON" + marker_end: "END MANAGED BY PLANTROON" + insertafter: '^maxretry' + block: | + [cyberpower] + driver = usbhid-ups + port = auto + desc = "CP Sineware" + pollinterval = 5 + become: yes + +- name: enable services + systemd: + name: "{{ item }}" + state: restarted + enabled: yes + become: yes + with_items: + - zabbix-agent + - nut-driver + diff --git a/roles/raspberry/tasks/main.yml b/roles/raspberry/tasks/main.yml new file mode 100644 index 0000000..cbbec2a --- /dev/null +++ b/roles/raspberry/tasks/main.yml @@ -0,0 +1,27 @@ +--- +- name: configure firmware + lineinfile: + path: /boot/firmware/config.txt + regexp: '^upstream_kernel=' + line: 'upstream_kernel=1' + owner: root + group: root + mode: '0755' + become: yes + +- name: configure fstab to mount log in RAM + lineinfile: + path: /etc/fstab + regexp: '^tmpfs /var/log' + line: 'tmpfs /var/log tmpfs defaults,noatime,mode=0755 0 0' + become: yes + +- name: configure fstab to mount tmp in RAM + lineinfile: + path: /etc/fstab + regexp: '^tmpfs /tmp' + line: 'tmpfs /tmp tmpfs defaults,noatime,mode=0755 0 0' + become: yes + +#tune2fs -O "^has_journal" /dev/mmcblk* +#noatime,barrier=0,commit=60 diff --git a/roles/zabbixagent/files/etc/zabbix/zabbix_agentd.conf.d/server.conf b/roles/zabbixagent/files/etc/zabbix/zabbix_agentd.conf.d/server.conf new file mode 100644 index 0000000..52e5c3a --- /dev/null +++ b/roles/zabbixagent/files/etc/zabbix/zabbix_agentd.conf.d/server.conf @@ -0,0 +1,7 @@ +Server=91.236.69.232, 2001:470:6e:1c7::2, 10.91.1.0/24 + +TLSConnect=psk +TLSAccept=psk +TLSPSKFile=/srv/common/zabbix.psk +TLSPSKIdentity=Zabbix PSK +EnableRemoteCommands=1 diff --git a/roles/zabbixagent/files/srv/common/zabbix.psk b/roles/zabbixagent/files/srv/common/zabbix.psk new file mode 100644 index 0000000..fa610d2 --- /dev/null +++ b/roles/zabbixagent/files/srv/common/zabbix.psk @@ -0,0 +1 @@ +f75cc714e869007469e792bda8bfea829f4fff998949434e18c7d825261fb7ac diff --git a/roles/zabbixagent/tasks/main.yml b/roles/zabbixagent/tasks/main.yml new file mode 100644 index 0000000..34442c5 --- /dev/null +++ b/roles/zabbixagent/tasks/main.yml @@ -0,0 +1,37 @@ +--- +- name: install packages + apt: + state: latest + pkg: + - zabbix-agent + install_recommends: no + force_apt_get: yes + become: yes + +- name: copy config files, scripts and services + copy: + src: "{{ item }}" + dest: "/{{ item }}" + force: yes + mode: preserve + become: yes + with_items: + - srv/common/ + - etc/zabbix/zabbix_agentd.conf.d/ + +- name: Create zabbix log directory + file: + path: /var/log/zabbix-agent + state: directory + mode: '0755' + owner: zabbix + group: zabbix + become: yes + +- name: enable zabbix-agent + systemd: + name: zabbix-agent + state: started + enabled: yes + become: yes + diff --git a/site.yml b/site.yml index 9936829..61a51ce 100644 --- a/site.yml +++ b/site.yml @@ -3,4 +3,5 @@ - import_playbook: faiserver.yml - import_playbook: libvirthost.yml +- import_playbook: raspberry.yml