Verweiste/Unvollständige Duply Backups löschen

Manchmal zeigt duply list folgende Ausgabe:

-------------------------
Chain start time: Mon Mar  2 04:00:02 2015
Chain end time: Sat Mar  7 04:00:02 2015
Number of contained backup sets: 6
Total number of contained volumes: 199
 Type of backup set:                            Time:      Num volumes:
                Full         Mon Mar  2 04:00:02 2015               194
         Incremental         Tue Mar  3 04:00:02 2015                 1
         Incremental         Wed Mar  4 04:00:02 2015                 1
         Incremental         Thu Mar  5 04:00:02 2015                 1
         Incremental         Fri Mar  6 04:00:03 2015                 1
         Incremental         Sat Mar  7 04:00:02 2015                 1
-------------------------
Also found 0 backup sets not part of any chain,
and 2 incomplete backup sets.
These may be deleted by running duplicity with the "cleanup" command.
--- Finished state OK at 02:00:56.586 - Runtime 00:00:01.884 ---

Dies sagt uns unter anderem dass es zwei Backups gibt die unvollständig oder veraltet sind. Zuerst einmal ist es interessant zu sehen welche Kommandos Duply überhaupt benutzt um an die unvollständigen Dumps zu kommen/sie zu löschen(duply cleanup --dryrun):

Start duply v1.9.1, time is 2015-03-08 02:04:28.
Using profile '/root/.duply/backup'.
Using installed duplicity version 0.6.24, python 2.7.9, gpg 1.4.18 (Home: ~/.gnupg), awk 'GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p3, GNU MP 6.0.0)', bash '4.3.30(1)-release (x86_64-pc-linux-gnu)'.
Autoset found secret key of first GPG_KEY entry '*' for signing.
-- Run cmd -- Checking TEMP_DIR '/tmp' is a folder --
test -d /tmp 2>&1
-- Run cmd -- Checking TEMP_DIR '/tmp' is writable --
test -w /tmp 2>&1
TODO: reimplent tmp space check
-- Run cmd -- Test - Encrypt to '*' & Sign with '*' --
echo * | /usr/bin/gpg --sign --default-key * --passphrase-fd 0 --batch -r * --status-fd 1 -o /tmp/duply.2427.1425776669_ENC -e /usr/bin/duply 2>&1
-- Run cmd -- Test - Decrypt --
echo * | /usr/bin/gpg --passphrase-fd 0 --batch -o /tmp/duply.2427.1425776669_DEC -d /tmp/duply.2427.1425776669_ENC 2>&1
-- Run cmd -- Test - Compare --
test "$(cat '/usr/bin/duply')" = "$(cat '/tmp/duply.2427.1425776669_DEC')" 2>&1
Cleanup - Delete '/tmp/duply.2427.1425776669_*'(FAILED)

--- Start running command CLEANUP at 02:04:29.439 ---
TMPDIR='/tmp' PASSPHRASE=* FTP_PASSWORD=* duplicity cleanup --name duply_backup --encrypt-key * --sign-key * --verbosity '4' --full-if-older-than 1W --volsize 512 --asynchronous-upload 'ftp://user@*.de:21//webserver01'
--- Finished state OK at 02:04:29.523 - Runtime 00:00:00.083 ---

Um zu sehen was Duply löschen würde reicht ein einfaches duply cleanup. Schlussendlich können wir die Backups löschen mit dem Kommando duply backup cleanup --force:

Start duply v1.9.1, time is 2015-03-08 02:05:35. 
Using profile '/root/.duply/backup'.             
Using installed duplicity version 0.6.24, python 2.7.9, gpg 1.4.18 (Home: ~/.gnupg), awk 'GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p3, GNU MP 6.0.0)', b
ash '4.3.30(1)-release (x86_64-pc-linux-gnu)'.   
Autoset found secret key of first GPG_KEY entry '*' for signing.
Checking TEMP_DIR '/tmp' is a folder (OK)        
Checking TEMP_DIR '/tmp' is writable (OK)        
TODO: reimplent tmp space check                  
Test - Encrypt to '*' & Sign with '*' (OK)
Test - Decrypt (OK)                              
Test - Compare (OK)                              
Cleanup - Delete '/tmp/duply.3373.1425776736_*'(OK)
                                                 
--- Start running command CLEANUP at 02:05:36.778 ---
NcFTP version is 3.2.5                           
Local and Remote metadata are synchronized, no sync needed.
Warning, found incomplete backup sets, probably left from aborted session
Last full backup date: Mon Mar  2 04:00:02 2015  
Deleting these files from backend:               
duplicity-full.20140512T020004Z.vol1.difftar.gpg 
duplicity-full.20140512T020004Z.vol2.difftar.gpg
.
.
.
duplicity-full.20140602T020005Z.vol99.difftar.gpg
duplicity-full.20140602T020005Z.vol100.difftar.gpg

--- Finished state OK at 02:07:43.568 - Runtime 00:02:06.789 ---
root@webserver01 ~ #
Posted in General, Linux | Leave a comment

Duply Fehler

Mein duply schmeißt mir folgende Fehlermeldung entgegen (Debian Wheezy):

root@caesar ~ # duply backup status
Start duply v1.5.5.5, time is 2015-03-08 01:51:11.
Using profile '/root/.duply/backup'.
Using installed duplicity version 0.6.18, python 2.7.3, gpg 1.4.12 (Home: ~/.gnupg), awk 'GNU Awk 4.0.1', bash '4.2.37(1)-release (x86_64-pc-linux-gnu)
'.                                                                                                                                                     Autoset found secret key of first GPG_KEY entry '*' for signing.
Test - Encrypt to * & Sign with * (OK)
Test - Decrypt (OK)
Test - Compare (OK)
Cleanup - Delete '/tmp/duply.20341.1425775872_*'(OK)

--- Start running command STATUS at 01:51:12.565 ---
Import of duplicity.backends.giobackend Failed: No module named gio
BackendException: ssh connection to *.de:22 failed: [Errno 111] Connection refused
01:51:13.794 Task 'STATUS' failed with exit code '23'.
--- Finished state FAILED 'code 23' at 01:51:13.794 - Runtime 00:00:01.229 --

Um dies zu beheben reicht ein das Folgende Kommando für Debian basierte Systeme:

aptitude install python-paramiko python-gobject-2

Alternativ für RHEL/CentOS:

yum -y install duply python-paramiko pygobject2
Posted in General, Linux, Short Tips | Leave a comment

Puppet Puppet Puppet

Hier habe ich malwieder einige Infos zu Puppet zusammengetragen:
1) Hier gibt es eine Mailingliste rund um die Entwicklung von Puppet
2) Hier gibt es eine weitere Mailingliste, diesmal für Security Announcements
3) Eine Übersicht der CVEs die Produkte von Puppetlabs betreffen gibt es hier
4) Puppet betreibt drei IRC Channel, #puppet, #puppet-dev und #puppet-razor. Alle Channel befinden sich auf freenode.net, Statistiken dazu gibt es hier. Außerdme gibt es noch den Channel #r10k, für das gleichnamige Script zum erstellen dynamischer Environments
5) How to contribute to Puppet
6) Puppetlabs hat eine Contributor License Agreement, wenn man über seinen Github Account Pull Requests an Puppetlabs stellt kann/sollte man im Vorfeld die CLA unterschreiben, dazu einfach hier mit seinen Github Daten einloggen.
7) Community Guidelines and Code of Conduct for Puppet Communities
8) Facter ist ein essentieller Bestandteil von Puppet, funktioniert aber auch standalone, es liefert Key=>Value Werte eines Systems, ist in Ruby geschrieben und kann in jeder Sprache erweitert werden. Aktuell gibt es einen rewrite in C++, cfacter
9) Vor einiger Zeit hatte ich bereits über meinen Fork von dem Puppetmodul stephenrjohnson/puppetmodule gebloggt. Für den Pullrequest fehlen aktuell “nur noch” Unit Tests um gemerged zu werden, er ist schon komplett nutzbar. Was tut dieser? Er erweitert das Modul um Puppetmaster nicht nur mit Apache/Passenger einzurichten, sondern auch mit nginx/Unicorn. Das Modul funktioniert in kleineren Umgebungen in denen sich nginx als zentraler Reverse-Proxy vor der PuppetDB als auch vor dem Puppetmaster befindet, sowie in großen Umgebungen in denen man einen zentralen Loadbalancer zum aufbrechen von SSL hat und mehrere Puppetmaster sowie eine PuppetDB dahinter (das Modul kümmert sich um den LB und die Master)
10) Puppet unterstützt seit einiger Zeit neben pson (aktueller Standard – json + Binärblob), b64_zlib_yaml, yaml und raw auch msgpack, um dies auf den agents sowie den Mastern zu aktivieren habe ich Puppetmodul erweitert. msgpack ist schneller zu erstellen/parsen als pson/json und hat weniger Overhead, weshalb es in großen Installationen genutzt werden sollte.
11) Es ist möglich innerhalb eines Agent Runs ein Feature hinzuzufügen und dies im späteren Verlaufs des Runs zu nutzen. Dies setzt voraus das Puppet innerhalb des Runs nach neuen Features scannt. Dieses Verhalten kann man deaktivieren, dann scannt Puppet ausschließlich beim Start des Runs nach Features was in einem deutlichen Performanceboost resultiert. Um dies einzustellen via eines Puppetmodules habe ich ebenfalls einen Future Parser. Dieser ist effizienter als der herkömmliche. Damit das Modul stephenrjohnson/puppetmodule auch mit dem Future Parser arbeitet habe ich einen mini PR erstellt

Posted in General, Linux, Nerd Stuff, Puppet | Leave a comment

Alte Logdateien in Piwik importieren

for i in $(find /home/blog.bastelfreak.de/logs/ -name "access.log.*.gz"); do gunzip --stdout $i > /tmp/logfile; /usr/bin/python /home/bastelfreakonline.de/htdocs/piwik/misc/log-analytics/import_logs.py --url=https://bastelfreak.de/piwik --recorders=4 --enable-http-errors --enable-http-redirects --enable-static --enable-bots --enable-reverse-dns --idsite=1 --recorders=4 /tmp/logfile; rm /tmp/logfile; done

Alle vorhandenen gezippten Logdatein werden zunächst gefunden, sequentiell entpackt nach /tmp, über ein Python Script in Piwik gepumpt und danach gelöscht. Die originalen gezippten Datein bleiben erhalten.

Posted in General, Linux, Short Tips | Leave a comment

Die besten 20 (oder so) Tools für den Sysadmin

Posted in General, Internet found pieces, Linux, Short Tips | Leave a comment

PDFs der KW10

Diese Woche gibt es nicht so viele PDFs, daher ein paar Links als Ersatz:
DE-CIX Newsletter für Februar
Don’t Roll Your Own Crypto
How to migrate OpenVZ/Virtuozzo to KVM
Activate nginx microcaching
Puppetmaster performance tuning with mod_mem_cache
Client zum Testen von RFC 5077 (TLS Session Resumption without Server-Side State)
RFC 5077
Erklärung und Hintergründe zu RFC 5077
HTTP/FTP Download Mirror Loadbalancer/Redirector vom VLC Team
Details zum Serverumbau bei Serverfault (inkl tollen Fotos)
Artikel von Netzpolitik über Netzneutralität
TLS in HTTP/2

Posted in General, Internet found pieces, IT-Security, Linux, Puppet, Virtualization | Leave a comment

IT-Security für Admins

Wer kennt das nicht, man ist im Rechenzentrum unterwegs und der Akku vom Smartphone ist leer:

Mal Hand aufs Herz, wer von euch denkt bei so einer Aktion daran ein USB Kabel zu nehmen über dass das Smartphone ausschließlich geladen wird (kein Datacable)? :)

Posted in General, IT-Security, Nerd Stuff | Leave a comment

Parallels Kacke nach KVM/Ceph migrieren

Paralles Cloud Server 6 bzw. Parallels Server Bare Metall haben diverse Devizite auf dich ich jetzt nicht näher eingehen möchte. Falls man mal deren Images auf ein KVM Setup migrieren möchte geht das sehr einfach mit qemu-img:

qemu-img convert -c -p -f parallels -O qcow2  root.hds  myNewVM.qcow2

Dies erzeugt eine qcow2 Datei, das aktuell bevorzugte Format für lokalen Storage bei KVM. Für Ceph sieht der Aufruf ein wenig anders aus:

qemu-img convert -p -f parrallels -O raw root.hds rbd:pool/imgname

Quellen:
http://vanappdeveloper.com/
http://docs.ceph.com

Posted in General, Internet found pieces, Linux, Short Tips, Virtualization | Leave a comment

Mit Juniper Hardware NTP filtern

Seit Junos 14.2 ist es möglich auf bestimmte Byte/Bit Werte in Paketheadern zu prüfen. Damit kann man z.B. prüfen ob an Stelle X eines UDP Pakets an Port 123 der Wert 0x2a steht und dann das Paket verwerfen. Dabei handelt es sich um Monlist Anfragen :)

Posted in General, IT-Security, Linux, Short Tips | Leave a comment

Noch mehr tolle IRC Geschichten / Howto VMs deployen

Folgendes Problem: Eine große Menge an virtuellen Maschinen muss angelegt werden und verwaltet werden auf mehreren Hypervisors. Um die Verwaltung zu vereinheitlichen sollen die Arbeiten über eine zentrale API erledigt werden. Nach aktuellem Stand der Technik nutzt man JSON für die API Kommunikation nach außen, zusätzlich ist es hilfreich wenn man eine grafische Oberfläche zur Verfügung hat. Hierfür bietet sich z.B. das Ruby on Rails Framework an. Dies bietet mit einfachen Mitteln die Erstellung einer JSON-API + HTML Oberfläche in einer App.

Nur wie greift diese API wiederum auf die einzelnen Hypervisor zu?

1) Die einfachste Möglichkeit ist hier eine SSH Verbindung und dann direkt Shellkommandos ausführen. SSH hat hier den Vorteil der starken Verschlüsselung, allerdings dauert der Verbindungsaufbau relativ lange, dies kann mit Connection Pools und Queueing umgangen werden was allerdings nicht trivial in der Implementierung ist. Wenn Zielserver eine hohe Auslastung haben werden SSH Verbindungen sehr träge und brechen ab da Sie dafür nicht konzipiert sind. Dies könnte wiederum mit Mosh geworkarounded werden, entspricht dann aber auch nicht mehr dem KISS Prinzip. Ein großes Problem ist hier die Sicherheit, die API müsste zusammengesetzte Strings via SSH ausführen, viele Kommandos benötigen Rootrechte. Der Aufwand um Strings auf eingeschleusten Code zu überprüfen und zu bereinigen (data serialization) ist sehr hoch.

2) AMQP bietet eine einfache Möglichkeit serialisierte Nachrichten von einem Server zu beliebig vielen anderen zu schicken. Die meisten Daemons die dieses Protokoll implementieren bieten die Verschlüsselung über SSL Zertifikate an, sowie Clustering. AMQP stellt sicher das Nachrichten schnell verschickt werden können, Queueing ist ebenfalls eingebaut sowie der Support für HA Setups um dem Verlust von Nachrichten vorzubeugen. Openstack nutzt ebenfalls AMQP und hat sich dort bewährt. Doch was nutzt man auf den Hypervisors um die Nachrichten zu interpretieren?
Hier müsste ein eigener Daemon entwickelt werden welcher die Nachrichten parst, mit doppelten Nachrichten umgehen kann, die passenden Libraries triggert und Antworten verschicken kann. Mir sind hier keine fertigen Open Source Lösungen bekannt weshalb man “From Scratch” entwickeln müsste.

3) Ich nutze exzessiv Puppet zum Automatisieren meiner Infrastrukturen, Puppet ist in erster Linie ein Configuration Management System und kümmert sich darum dass auf allen Systemen die benötigten Pakete installiert sind, alle Konfigurationsdateien entsprechend angepasst sind und alle benötigten Dienste laufen. Im Regelfall verbinden sich Puppet Agents alle X Minuten zu einem Master und erfragen eine Konfiguration welche Sie dann anwenden (Details). Im Optimalfall installiert man auf einem Server eine Standarddistribution + Puppet, lässt den Agent einmalig laufen und hat danach ein komplett eingerichtetes System. Bei einem minimalen Hypervisor komme ich auf ca 370 Ressourcen pro Node die Puppet verwalten muss (Jedes Paket, jede Konfigurationsänderung ist eine Ressource). Neben eingebauter Verschlüsselung und Authentifizierung mit Client-SSL-Zertifikaten bietet Puppet eine eigene Datenbank für Reports um Änderungen naczuvollziehen, automatisierte Tests + Testumgebungen sowie diverse andere Tolle Features, aber das Feature, weshalb Puppet überhaupt hier im Vergleich ist, ist die Möglichkeit eine Konfiguration dynamisch aus einer Datenbank oder einem Scriptaufruf heraus zu erzeugen. Benötigt wird dazu eine API mit zwei Seiten, auf der einen befinden sich die Administratoren, dann kommt die API und dahinter die Hypervisors + Puppet. Die Admins legen über die API neue VMs an oder änderen deren Specs, auf der anderen Seite befindet sich der Puppet Master welcher sich bei jeder eingehenden Agent Verbindung zu API verbindet und fragt welche VMs mit welchen Specs auf den Nodes liegen sollen. Puppet kann die VMs dann entsprechend anlegen(z.B. mit diesem Modul).

Diese Idee schwebt mir schon lange im Kopf und ist meine favorisierte, hat allerdings einen Nachteil:
Das managen von 100 VMs mit diversen Attributen + das verwalten von ~370 Ressourcen benötigt eine gewisse Zeit und erzeugt eine gewisse Systemlast. Um schnell Änderungen der VMs zu aktivieren sollte der Agent alle 5 Minuten laufen. Es ist aber sinnlos die zusätzlichen 370 Ressourcen so häufig zu überprüfen. Um dieses Problem zu lösen habe ich vorhin eine Lösung mit Adrien Thebo von Puppetlabs erdacht (ganz unten zu finden).

Grobe Zusammenfassung:
Zum Einen kann ich verschiedene Laufzeitumgebungen auf dem Puppet Master für die Agents konfigurieren die in verschiedenen Zeitintervallen abgefragt werden, zum Anderen kann ich einen Katalog aufsplitten in einen infrastructure Bereich und einen virtualization Bereich (mit Tags), die dritte Option ist das Setzen von bestimmten Attributen auf dem Hypervisor (FACTER_doodoo=”infra”) welche dann einen Infrastrukturspezifischen Katalog oder einen Virtualisierungsspezifischen Katalog erstellen lassen auf dem Master.

Das Regelmäßige springen zwischen Laufzeitumgebungen entspricht nicht den Best Practices, das Setzen von Tags funktioniert, führt aber manchmal zu komischen Effekten. Lösung Eins möchte ich ausschließen, Lösung zwei und drei muss ich in der Praxis evaluieren.

Von diesen drei Ansätzen eines API Konzepts halte ich die Puppet Variante für die einzig skalierende, ich bin hier aber für weitere Vorschläge und Anregungen offen.

2015-02-27 22:20:58 bastelfreak finch: I need to do dirty stuff with puppet and you're probably the right guy to help me
2015-02-27 22:21:35 bastelfreak I manage many hypervisors with puppet, managing their configs, installing packages, stuff like that
2015-02-27 22:21:48 bastelfreak currently around 360 resources on each node
2015-02-27 22:22:07 bastelfreak I also want to deploy my virtual maschines on these nodes via puppet
2015-02-27 22:22:32 +finch kay
2015-02-27 22:22:44 bastelfreak handling xml shit with libvirt takes some time, and I've around 100 maschines on each node
2015-02-27 22:22:59 bastelfreak deploying VMs should happen every 5minutes
2015-02-27 22:23:25 +finch https://github.com/carlasouza/puppet-virt ?
2015-02-27 22:23:25 bastelfreak handling all VMs + the normal 360 resources would create a huge system load if I do it every 5min
2015-02-27 22:23:39 +finch oh, you want to avoid touching certain resources
2015-02-27 22:23:41 bastelfreak so my thought was to create two environments
2015-02-27 22:24:20 +finch you might be able to use https://docs.puppetlabs.com/puppet/latest/reference/lang_tags.html#restricting-catalog-runs
2015-02-27 22:24:21 bastelfreak the agent runs every 5min in the env virtualisation and every hour or so in the env infrastructure
2015-02-27 22:24:52 bastelfreak uh
2015-02-27 22:24:54 bastelfreak sweet
2015-02-27 22:24:56 +finch one catalog, one environment, and if you're using roles and profiles then you just run puppet with `--tag profile::virt
` or `--tag profile::env` 2015-02-27 22:25:21 +finch be aware that tags are strange, and you should definitely test with --noop first to make sure it works like you expect
2015-02-27 22:25:29 +finch barring that, two environments would work.
2015-02-27 22:25:32 bastelfreak can the daemon handle tags?
2015-02-27 22:25:35 +finch that, or you change the classification via a fact
2015-02-27 22:25:40 +finch `puppet agent -t --tags etc`
2015-02-27 22:25:43 bastelfreak ah cool
2015-02-27 22:26:01 +finch you could also do FACTER_classification='infra' puppet agent -t
2015-02-27 22:26:15 +finch in your site.pp you inspect the classification fact, and then conditionally include classes
2015-02-27 22:26:42 +finch be warned that you need to validate the hell out of a fact if you do this; don't allow the fact to include arbitrary cl
asses 2015-02-27 22:26:53 bastelfreak oh yeah
2015-02-27 22:27:02 bastelfreak but doesn't sound as dirty as I thought
2015-02-27 22:27:38 bastelfreak current style is "A API does a login via ssh and trigger a shell script"
2015-02-27 22:27:44 bastelfreak I want to avoid ssh access
2015-02-27 22:27:45 +finch FACTER_doodoo="infra"
2015-02-27 22:27:47 +finch it's dirty now
2015-02-27 22:27:50 bastelfreak :D
2015-02-27 22:28:22 +finch if it's viable to run different command invocations, either of these approaches, with tags or with fact based classific
ation, could work 2015-02-27 22:28:25 +finch anywho. meeting, bbl
2015-02-27 22:28:31 bastelfreak bb, thanks

(Toll formatiert gibt es den Text Hier)

Posted in General, Internet found pieces, Linux, Puppet, Virtualization | Leave a comment