Archive for Linux

Опыт мониторинга SMART жёстких дисков при помощи Zabbix

Задача: мониторить критические параметры SMART жёстких дисков с автообнаружением самих дисков.

Системные требования: наличие sg модуля ядра Linux, интерпретатор python.

Для Debian: apt-get install sg3-utils python3

Сначала сам скрипт автообнаружения /etc/zabbix/scripts/sg_discovery.py:

#!/usr/bin/python3
import os
disks = os.popen("sg_map |awk '{print $1'}").read()
disks = disks.split('\n')
devtypes=('sat','scsi','ata')
k=0
print('{\n\t\"data\":[')
for i in disks:
        for j in devtypes:
                if (i and j):
                        line='smartctl -d {0} -a {1} > /dev/null'.format(j,i)
                        exit_code=os.system(line)
                        if not exit_code:
                                if k:
                                        print(',')
                                newline='\t\t{ "{#DEVNAME}":"%s", "{#DEVTYPE}":"%s" }'
                                print(newline %(i,j))
                                k=k+1
print("\n\t]\n}")

Теперь конфиг Zabbix агента /etc/zabbix/zabbix-agent.conf:

UserParameter=sg.discovery,sudo /etc/zabbix/scripts/sg_discovery.py
UserParameter=sg.get[*],sudo /usr/sbin/smartctl -a -d $1 $2 |grep $3 | awk ‘{ print $ 10; }’
UserParameter=sg.model[*],sudo /usr/sbin/smartctl -a -d $1 $2 |grep «Device Model» | awk ‘{ print $ 3; }’
UserParameter=sg.serial[*],sudo /usr/sbin/smartctl -a -d $1 $2 |grep «Serial Number» | awk ‘{ print $ 3; }’

И наконец шаблон для Zabbix:sg_stat

В sudoers должно быть:

zabbix ALL = NOPASSWD: /usr/sbin/smartctl
zabbix ALL = NOPASSWD: /etc/zabbix/scripts/sg_discovery.py

Скрипт создания json объектов для zabbix

#!/bin/bash
# Formating discovering device list to JSON format for zabbix

echo -e «{\n\t\»data\»:[»
LN=0
while read -r -a attribute; do
if [[ $LN != 0 ]]; then
echo «,»
fi
echo -e «\t\t{ \»{#DEVNAME}\»:\»${attribute[0]}\», \»{#DEVTYPE}\»:\»${attribute[1]}\» }\c»
LN=1
done < /dev/stdin
echo -e «\n\t]\n}»

Скрипт создания резервных копий mysql

#!/bin/bash
backuppath=»/mnt/backup/mysql»
username=»логин»
password=»пароль»
count=3
date=`date +%d%m%y`
dbs=`mysql -u $username -p$password -e ‘show databases;’ | grep -v information_schema | grep -v Database |grep -v mysql |grep -v performance_schema`

for i in $dbs ; do
cd $backuppath
mkdir -p $i
cd $backuppath/$i
mysqldump -u $username -p$password $i > $date.sql
gzip $date.sql && rm -f $date.sql
old=`ls -t $backuppath/$i`
x=1
for j in $old ; do
if [ $x -le $count ] ; then
((x++))
continue
fi
# echo $j
rm $backuppath/$i/$j
done
done

Обновление серверов на Debian с помощью Ansible

Добрый день. Как очень просто обновить сразу много серверов на Debian? Конечно же используем систему управления конфигурациями. Например Ansible.

Пишем сценарий в файл debian-update.yml:

# debian-update.yml

— hosts: debian_upd
user: root

tasks:
— name: Update apt cache
apt: update_cache=yes
sudo: no

— name: Install latest updates
apt: upgrade=dist
sudo: no

Создаём файл hosts с хостами:

[debian_upd] localhost ansible_connection=local # локальный
192.168.0.1 ansible_connection=ssh # сервер 1
192.168.73.2 ansible_connection=ssh # сервер 2
192.168.1.10 ansible_connection=ssh # сервер 3

Создаём файл ansible.cfg:

[defaults] hostfile = hosts

Запускаем: ansible-playbook debian-update.yml.

PS Должна быть настроена аутентификация по ключу ssh под пользователем, который указан в сценарии debian-update.yml. Также можно использовать sudo (смотрим всё тот же сценарий).