Check_MK Agent – JSON Daten auslesen

Mit diesem lokalen Check kann man zwei Messwerte (Temperatur und Luftfeuchtigkeit) von einer Messstation per JSON auslesen und an den Check_MK Agent übergeben. Die Daten werden von Check_MK ausgelesen und als Statistik angezeigt.

Für die Verarbeitung von JSON brauchen wir ein kleines Tool mit dem Namen JSON Query, kurz JQ.

sudo apt-get install jq

Die Messwerte haben folgendes JSON Format.

{"sensor":{"temperature":24,"humidity":33},"timestamp":1464340616}

Jetzt erstellen wir ein Shell Script im Verzeichnis /usr/lib/check_mk_agent/local/.

#!/bin/sh
NAME="Sensor"
URL="http://hostname/sensor.json"
 
RESULT=$(curl -s $URL)
TEMP=$(echo $RESULT | jq '.sensor.temperature')
HUMI=$(echo $RESULT | jq '.sensor.humidity')
TIME=$(echo $RESULT | jq '.timestamp')
DATE=$(date -d @$TIME)
 
#TEMP-WARNING=30
#TEMP-CRITICAL=40
#HUMI-WARNING=(Min=20/Max=40)
#HUMI-CRITICAL=(Min=10/Max=60)
 
echo "P ${NAME} Temperature=${TEMP};30;40|Humidity=${HUMI};20:40;10:60;0;100; ${DATE}"

Will man die Daten für 120 Sekunden vom Check_MK Agent zwischen speichern, so erstellt man das Script im Verzeichnis /usr/lib/check_mk_agent/local/120/. Die Daten werden dann im Verzeichnis /etc/check_mk/cache/ für 120 Sekunden gespeichert und erst nach Ablauf der Zeit von einem Hintergrundprozess aktualisiert.

Nach der Inventarisierung in Check_MK, wird ein neue Service „Sensor“ mit zwei Statistiken erzeugt.

Ubuntu 16.04 mit ZFS

Ab Ubuntu 16.04 (Kernel 4.4) wird auch ZFS mit geliefert. Hier will ich zeigen, wie man ZFS installiert und nutzt.

sudo apt-get install zfsutils-linux

Nach der Installation sollte ZFS als Kernel Modul geladen sein.

lsmod |grep zfs

Mit den Tool „zpool“ kann man sich die Volumes und den Status von ZFS anzeigen lassen.

sudo zpool list
sudo zpool status

2GB Volume erstellen in Image-Datei

dd if=/dev/zero of=/home/user/example.img bs=1M count=2048
sudo zpool create mypool /home/user/example.img

ZFS Raid1 (mirror) Volume mit zwei Festplatten erstellen

sudo zpool create mypool mirror /dev/sdb /dev/sdc

ZFS Raid5 (strip parity) Volume mit 4 Festplatten erstellen

sudo zpool create mypool raidz /dev/sdb /dev/sdc /dev/sdd /dev/sde

ZFS Raid6 (double parity) Volume mit 5 Festplatten erstellen

sudo zpool create example raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf

Volume löschen

sudo zpool destroy mypool

ZFS 10GByte File System erstellen und Kompression setzen

sudo zfs create mypool/projects
sudo zfs set quota=10G mypool/projects
sudo zfs set compression=on mypool/projects

ZFS File System anzeigen

sudo zfs list

ZFS File System löschen

sudo zfs destroy mypool/tmp

ZFS Snapshots erstellen und anzeigen (read only)

sudo zfs snapshot -r mypool/projects@snap1
sudo zfs list -t snapshot

ZFS Snapshot zurück rollen

sudo zfs rollback mypool/projects@snap1

ZFS Snapshot löschen

sudo zfs destroy mypool/projects@snap1

ZFS Clone erstellen (writeable copy)

Ein Clone ist eine beschreibare Kopie von einem Snapshot.

sudo zfs snapshot -r mypool/projects@snap1
sudo zfs clone mypool/projects@snap1 mypool/projects-clone

ZFS Send / Receive (Backup / Restore) erstellen

Ein Snapshot erstellen und an eine Datei senden

sudo zfs snapshot -r mypool/projects@snap2
sudo zfs send mypool/projects@snap2 > ~/projects-snap.zfs

Ein Snapshot zurück schreiben.

sudo zfs receive -F mypool/projects-copy < ~/projects-snap.zfs

Weitere Information zu ZFS Ditto Blocks, ZFS Deduplication, ZFS Pool Scrubbing und ZFS compression finden Sie im Wiki ZFS.

ZFS kann mit LXD genutzt werden.

sudo apt-get install lxd

Nach der Installation können wir LXD konfigurieren.

sudo ldx init

Name of the storage backend to use (dir or zfs): zfs
Create a new ZFS pool (yes/no)? yes
Name of the new ZFS pool: lxd
Would you like to use an existing block device (yes/no)? no
Size in GB of the new loop device (1GB minimum): 2
Would you like LXD to be available over the network (yes/no)? no 
LXD has been successfully configured.

Jetzt erstellen wir einen Container und starten ihn.

sudo lxc launch ubuntu:14.04 my-ubuntu

Partitionsgröße mit Fdisk ändern

Wenn man in Linux die Partiongröße ändern will, muss man die alte Partion löschen und eine neue Partion an legen.

Diese Schritte sind dafür notwendig.

A. Ausgabe der Partionsinformationen
B. Löschen der Partion Nummer #2
C. Neu Partion #2 erstellen
D. Partionen speichern

Mit dem Tool „fdisk“ sind diese Kommandos notwendig.

A. [p] (Print)
B. [d,2] (Delete, Partition #2)
C. [n,p,2,{default},{default}] (New, Primary, Partition #2, First sector, Last sector)
D. [w] (Write)

Die Ausgabe von „fdisk“ sieht so aus.

# sudo fdisk /dev/mmcblk0

Welcome to fdisk (util-linux 2.26.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
 
 
Command (m for help): p
Disk /dev/mmcblk0: 29,3 GiB, 31440502784 bytes, 61407232 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf9315c16
 
Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1 *      2048  133119  131072   64M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      133120 7679999 7546880  3,6G 83 Linux
 
Command (m for help): d
Partition number (1,2, default 2):
 
Partition 2 has been deleted.
 
Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p):
 
Using default response p.
Partition number (2-4, default 2):
First sector (133120-61407231, default 133120):
Last sector, +sectors or +size{K,M,G,T,P} (133120-61407231, default 61407231):
 
Created a new partition 2 of type 'Linux' and of size 29,2 GiB.
 
Command (m for help): p
Disk /dev/mmcblk0: 29,3 GiB, 31440502784 bytes, 61407232 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xf9315c16
 
Device         Boot  Start      End  Sectors  Size Id Type
/dev/mmcblk0p1 *      2048   133119   131072   64M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      133120 61407231 61274112 29,2G 83 Linux
 
Command (m for help): w
The partition table has been altered.

Jetzt ist ein Reboot notwendig.

# sudo reboot

Das Dateisystem ext4 kann im Betrieb vergrössert werden.

# sudo apt-get install e2fsprogs

# sudo resize2fs -p /dev/mmcblk0p2

Bildbearbeitung (Größen, Format) in Linux

Für die Bildbearbeitung in Linux gibt es das Programm „Imagemagick“.

sudo apt-get install imagemagick

Konvertieren von einem Bildformat in ein anderes Bildformat. Optional kann man die Qualität von 95% an geben.

convert -quality 95 source.png dest.jpg

Die Auflösung von Bildern kann man auch ändern auf einen Fix-Wert von 200×100 Pixeln. Mit einem Ausrufezeichen kann man die Werte erzwingen.

convert -resize 200×100! source.jpg dest.jpg

Will man nur den Horizont auf 200 Pixel oder die Vertikale auf 100 Pixel ändern, so kann man den jeweils anderen Wert weg lassen. Der jeweils andere Wert wird an den Seitenverhältnissen von dem Bild errechnet.

convert -resize 200 source.jpg dest.jpg
convert -resize ×100 source.jpg dest.jpg

Auch die Angabe von Prozent ist möglich.

convert -resize 50% source.jpg dest.jpg

Ein Bild zu drehen ist auch möglich.

convert -rotate 90 source.jpg dest.jpg

Es gibt auch Bilddefekte, welche man anwenden kann.

convert -charcoal 2 source.jpg dest.jpg

Will man viele Dateien umwandeln, kann man sich ein Shell Script erstellen.

for file in *.jpg; do convert $file -resize 50% low-$file; done

Update von MySQL image in Docker

Wir wollen in Docker ein MySQL container auf die letzte Verion updaten. Wichtig dafür ist, das unsere Daten nicht in dem Container gespeichert werden, sondern auf dem Host im Verzeichnis /my/data/

1. Letzte MySQL Version hinzufügen

docker pull mysql:latest

2. Container stoppen

docker stop mysql1

3. Container löschen

docker rm mysql1

4. Neuen Container erstellen

docker run --name=mysql1 --restart=always -e MYSQL_ROOT_PASSWORD=mypwd -v /my/data:/var/lib/mysql -d mysql

XML SOAP Request senden

Wer einen WebService verwendet, muß nicht immer gleich einen eigenen Client entwickeln. Es ist auch möglich SOAP Request mit Tools zu senden. In diesem Beispiel wird ein WebService zum Löschen von Nachrichten angesprochen.

Zu erst erstellen Datei mit dem XML SOAP Request.

vim soap_request.xml

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns1:removeNachricht xmlns:ns1="http://exposed.storage.service.de/"
<arg0>4860</arg0>
</ns1:removeNachricht>
</soap:Body>
</soap:Envelope>

Mit dem Tool curl senden wir einen HTTP Post Request, als HTTP Header wird die Methode „removeNachricht“ von dem WebService gesendet.

curl -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction: removeNachricht" -d @soap_request.xml -X POST http://localhost:7010/soa-infra/services/StorageService/StorageWebService

Wenn wir eine Liste von Nachrichten löschen wollen, können wir diese Shell Script verwenden. Die NachrichtenID werden in der Datei „list.txt“ gespeichert. Die SOAP Datei wird immer wieder kopiert und in der Datei die ID ersetzt.

#!/bin/sh
URL=http://localhost:7010/soa-infra/services/StorageService/StorageWebService
 
cat list.txt | while read ID
do
 echo "Delete Nachricht: ${ID}"
 cp soap_request.xml.org soap_request.xml
 sed -i s/##NACHRICHT_ID##/${ID}/g soap_request.xml
 curl \
  -H "Content-Type: text/xml; charset=utf-8" \
  -H "SOAPAction: removeNachricht" \
  -d @soap_request.xml -X POST ${URL}
 sleep 2
done

Große Dateien teilen und übertragen

Wenn man eine große Datei über das Internet übertragen will, kann das lange dauern. Eine Unterbrechung der Netzwerkverbindung kann ein Problem dar stellen. Besser ist es, die Datei zu erst zu packen und in kleine Teile zu trennen. Dann kann man diese kleinen Dateien einzeln übertragen und wieder zusammen setzten.

0. 500MB Testdatei erstellen

dd if=/dev/urandom of=myfile.out bs=1M count=500

1. Packen und teilen

gzip -c myfile.out | split -b 20M - myfile.gz_

2. Übertragen

rsync -avzP myfile.gz_* -e ssh user@hostname:/tmp/

3. Zusammensetzen

cat myfile.gz_* | gunzip -c > myfile.out

In Windows kann man die Dateien zusammen kopieren.

copy /b file1 + file2 + file3 + file4 filetogether