Links der KW 22

Neuer Freitag -> Neue Links:
Ceph beim CERN
Hiera Design Pattern von Puppetlabs
A successful Git branching model
Mein wachsendes VirtAPI Projekt
CERNs OpenStack Blog
The RESTful CookBook
REST API Documentation Best Practices
Exemplarische Beschreibung eines API Endpoints in Markdown
Ein PuppetDB Webfrontend in Python3
Just Sysadmin Things…
Reloading HAProxy without Dropping Packets
puppetlabs-ntp wurde in Version 4 released
puppetlabs-concat wurde vor zwei Wochen in Version 2 released
garethr-docker wurde in Version 4.0.2 released
elasticsearch-elasticsearch wurde in Version 0.9.6 released, hier wurde mein Bugreport gefixt, unter systemd lief elasticsearch immer als root. Außerdem kann man nun gezielt bestimmte ES Pluginversionen installieren.
puppetlabs-firewall wurde in Version 1.6.0 released, jetzt mit besserem IPv4 und IPv6 Support, Arch und Debian 8 Support
puppetlabs-git wurde in Version 0.4.0 released
elasticsearch-logstash wurde vor zwei Wochen in Version 0.5.1 released
zack-r10k wurde in Version 2.8.0 vor 17 Tagen released
Probleme mit dem PRNG bei blockchain.com, sowie eine Erklärung dazu

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

CentOS VM von virtio-blk auf virtio-scsi umstellen inkl. discard

Zur Zeit nutzen die meisten Menschen virtio-blk als Storage Treiber unter Qemu. Möchte man aber neuere Storage Backends wie Ceph oder Trim Support, wird virtio-scsi benötigt. Die nötigen Anpassungen in der Domain.xml via virsh edit Domain sind schnell erledigt. Hier ein Beispiel, zuerst der alte Zustand:

    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/vg0/puppet'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </disk>
    <controller type='pci' index='0' model='pci-root'/>

Und hier einmal die neue Version:

<disk type='block' device='disk' discard='unmap'>
  <driver name='qemu' type='raw' />
  <source dev='/dev/vg0/puppet'/>
  <target dev='sda' bus='scsi'/>
  <boot order='2'/>
  <address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='scsi' index='0' model='virtio-scsi' />

Außerdem sollte man seine /etc/fstab überprüfen und ggf. hardcoded Storage-Pfade austauschen gegen UUIDs:

proc /proc proc defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/sda1 /boot ext3 defaults 0 0
/dev/sda2 / ext3 defaults 0 0

wird also zu:

proc /proc proc defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
UUID="aa1dae6f-4d64-4c84-8010-411e4f149e2f" /boot ext3 defaults 0 0
UUID="8cba5df0-971c-49ed-a281-faf73b2e2a19" / ext3 defaults 0 0

In der Grub Konfiguration ist es ebenfalls möglich dass der Storage-Pfad hardcoded ist, dies kann man überprüfen mit folgendem Befehl:

grep root= /boot/grub2/grub.cfg

Wenn dort noch keine UUIDs angegeben sind kann man Grub dazu veranlassen diese einzutragen, einfach GRUB_DISABLE_LINUX_UUID=false in die /etc/default/grub und danach folgenden Befehl ausführen:

grub2-mkconfig -o /boot/grub2/grub.cfg

Falls Dracut nicht automatisch die richtigen Kernelmodule lädt kann man dies noch erzwingen, dazu muss man in die /etc/dracut.conf folgendes eintragen:
add_drivers+="virtio_balloon virtio_net virtio_blk virtio_pci virtio_ring virtio virtio-scsi"
Danach müssen die initrds neugebaut werden, dies geschieht so.

Sollte dies immer noch nicht reichen um eine bootbare VM zu erzeugen muss man ggf. noch folgendes beachten.

Wenn man nun eine erfolgreich gebootete VM hat kann man die discard mount option setzen:

proc /proc proc defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
UUID="aa1dae6f-4d64-4c84-8010-411e4f149e2f" /boot ext3 defaults,discard 0 0
UUID="8cba5df0-971c-49ed-a281-faf73b2e2a19" / ext3 defaults,discard 0 0

Diese Mountoption in Kombination mit virtio-scsi und der Option discard=’unmap’ sorgt dafür, dass das Betriebssystem in der VM regelmäßig leere Blöcke freigibt und dies an das Hostsystem durchreicht. Thin provisioned LVM2 Volumes, QCOW2 und RAW Images sowie Ceph RBDs können somit online shrinken. Windows unterstützt dies aktuell leider nicht.

Eventuell möchte man nicht automatisch Blöcke freigeben, dafür gibt es das Tool fstrim, dies kann man alternativ zur Mountoption nutzen.

Posted in General, Nerd Stuff, Virtualization | 1 Comment

PDFs der KW 21

Nach langer Zeit gibt es wieder einige PDFs und gute Links:
Measuring and mitigating AS-level adversaries against Tor
LET’S ENCRYPT Draft (thx Bluewind für den Link)
Ein Draft meiner Virtualization API ist nun auf github verfügbar
beaker 2.12.0 released
Puppetlabs Pull Request Triage gibt es jede Woche live im Hangout, des öfteren auch mit mir als Teilnehmer
The PuppetDB module master branch (5.x) will have breaking changes
Puppet 4.1 wurde released
Facter 2.4.4 wurde released

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

Programmiersprachen Fuckups

Hier gibt es einen kurzvortrag über Fuckups in Programmiersprachen, mein Favorit kommt gegen 3:39 :)

Posted in General, Internet found pieces, Nerd Stuff | Leave a comment

Zentrales Logmangement mit Puppet und ELK-Stack

Im Rahmen seiner Praktikumsarbeit habe ich einen Studenten betreut bei der HostEurope GmbH. Zusammen haben wir ein zentrales Logmanagement mit dem ELK-Stack realisiert. Die Dokumentation dazu gibt es hier, die Präsentation hier.

Posted in General, Linux, Puppet | Leave a comment

MySQL Fehler nach Upgrade von 5.5->5.6 fixen

Vor einigen Tagen habe ich meinen MySQL-Server auf einer Debian 8 Kiste aktualisiert. Ich benötigte eine Funktion aus 5.6, Debian liefert allerdings nur 5.5. Zum Update reicht es mysql-apt-config_0.3.5-1debian7_all.deb mit wget herunterzuladen und mit dpkg zu installieren, danach erfolgt der Update von MySQL:

dpkg -i mysql-apt-config_0.3.5-1debian7_all.deb
aptitude -y install mysql-community-server

Beim Ausführen vom mysqlchecker mysqlcheck --all-databases -p erhält man allerdings folgende Fehler in /var/log/syslog:
May 14 18:11:08 mysql01 mysqld: 2015-05-14 18:11:08 7f9d7428e700 InnoDB: Error: Fetch of persistent statistics requested for table "mailserver"."virtual_users" but the re
quired system tables mysql.innodb_table_stats and mysql.innodb_index_stats are not present or have unexpected structure. Using transient stats instead.

Beim Update auf 5.6 werden benötigte Tabellen in der Datenbank MySQL nicht automatisch installiert, dies kann man allerdings manuell erledigen. Die beiden Tabellen sind:

CREATE TABLE IF NOT EXISTS `innodb_index_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `index_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `stat_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `stat_value` bigint(20) unsigned NOT NULL,
  `sample_size` bigint(20) unsigned DEFAULT NULL,
  `stat_description` varchar(1024) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;
CREATE TABLE IF NOT EXISTS `innodb_table_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `n_rows` bigint(20) unsigned NOT NULL,
  `clustered_index_size` bigint(20) unsigned NOT NULL,
  `sum_of_other_index_sizes` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`database_name`,`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;

Der MySQL Server nutzt diese nun automatisch und mysqlchecker ist beruhigt. Außerdem fehlen noch folgende Tabellen die man ebenfalls hinzufügen sollte:

CREATE TABLE IF NOT EXISTS `slave_master_info` (
  `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file.',
  `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log currently being read from the master.',
  `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last read event.',
  `Host` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The host name of the master.',
  `User_name` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The user name used to connect to the master.',
  `User_password` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The password used to connect to the master.',
  `Port` int(10) unsigned NOT NULL COMMENT 'The network port used to connect to the master.',
  `Connect_retry` int(10) unsigned NOT NULL COMMENT 'The period (in seconds) that the slave will wait before trying to reconnect to the master.',
  `Enabled_ssl` tinyint(1) NOT NULL COMMENT 'Indicates whether the server supports SSL connections.',
  `Ssl_ca` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The file used for the Certificate Authority (CA) certificate.',
  `Ssl_capath` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The path to the Certificate Authority (CA) certificates.',
  `Ssl_cert` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the SSL certificate file.',
  `Ssl_cipher` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the cipher in use for the SSL connection.',
  `Ssl_key` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the SSL key file.',
  `Ssl_verify_server_cert` tinyint(1) NOT NULL COMMENT 'Whether to verify the server certificate.',
  `Heartbeat` float NOT NULL,
  `Bind` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'Displays which interface is employed when connecting to the MySQL server',
  `Ignored_server_ids` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The number of server IDs to be ignored, followed by the actual server IDs',
  `Uuid` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The master server uuid.',
  `Retry_count` bigint(20) unsigned NOT NULL COMMENT 'Number of reconnect attempts, to the master, before giving up.',
  `Ssl_crl` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The file used for the Certificate Revocation List (CRL)',
  `Ssl_crlpath` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The path used for Certificate Revocation List (CRL) files',
  `Enabled_auto_position` tinyint(1) NOT NULL COMMENT 'Indicates whether GTIDs will be used to retrieve events from the master.',
  PRIMARY KEY (`Host`,`Port`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Master Information';
CREATE TABLE IF NOT EXISTS `slave_relay_log_info` (
  `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.',
  `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the current relay log file.',
  `Relay_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The relay log position of the last executed event.',
  `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.',
  `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last executed event.',
  `Sql_delay` int(11) NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.',
  `Number_of_workers` int(10) unsigned NOT NULL,
  `Id` int(10) unsigned NOT NULL COMMENT 'Internal Id that uniquely identifies this record.',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Relay Log Information';
CREATE TABLE IF NOT EXISTS `slave_worker_info` (
  `Id` int(10) unsigned NOT NULL,
  `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Relay_log_pos` bigint(20) unsigned NOT NULL,
  `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Master_log_pos` bigint(20) unsigned NOT NULL,
  `Checkpoint_relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Checkpoint_relay_log_pos` bigint(20) unsigned NOT NULL,
  `Checkpoint_master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Checkpoint_master_log_pos` bigint(20) unsigned NOT NULL,
  `Checkpoint_seqno` int(10) unsigned NOT NULL,
  `Checkpoint_group_size` int(10) unsigned NOT NULL,
  `Checkpoint_group_bitmap` blob NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Worker Information';

Wenn man danach noch mal fix alle Tabellen optimieren möchte bietet sich folgender Befehl an:

mysqlcheck --all-databases -p --optimize
Posted in General, Linux | Leave a comment

Short Tip: CentOS initrd bauen die mit wechselnden Festplattentreibern klar kommt

Über die Option persistent_policy=by-uuid in der /etc/dracut.conf kann der initrd mitgeteilt werden wie nach Festplatten und Partitionen beim booten unter /dev/disk/ gesucht werden soll. Mit dieser Einstellung wird immer mit UUIDs gearbeitet. Dies wird interessant wenn man mit virtuellen Maschinen arbeitet und den Festplattentreiber anfangs auf IDE stehen hat und danach z.b. auf virtio-blk umstellt. Sofern die Option gesetzt ist werden die Festplatten auch nach der Umstellung noch problemlos gefunden.

Nach der Änderung der dracut Konfiguration muss die initrd neugebaut werden, dies ist hier beschrieben.

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

Linux Short Tip: Alle initrds unter CentOS neu bauen

cd /boot; for file in vmlinuz-*; do kernel=$(echo $file | cut -d- -f2-); dracut -fv initramfs-$kernel.img $kernel; done

Dieser Einzeiler wechselt erst in das Verzeichnis /boot und iteriert dann über alle vorhandenen Kernel. Für jeden Kernel wird dann dracut aufgerufen um die initrd neu zu generieren.

Posted in General, Linux, Short Tips | 2 Comments

DTAG und das freie Internet Teil 2

Vorab: Hier gibt es Teil 1

Hetzner hat lange gegen die Telekom gekämpft, leider ist Martin Hetzner nun eingeknickt und wird für 5€ Aufpreis im Monat DTAG Upstream via Core Backbone anbieten

bla
(copyright by gifrific.com)

Mal von einem externen Standpunkt betrachtet:
1) es existiert ein DTAG Peering ohne Kundenaufpreis
2) man schaltet es ab
3) Man kann es gegen Gebühr wieder aktivieren

Hut ab Hetzner, macht einen seriösen Eindruck, bösartige Menschen würden hier Absicht unterstellen.

Ich finde es schade dass Hetzner hier einknickt, ein wesentlich offeneres Vorgehen gegen die DTAG hätte ich für sinnvoller erachtet (ähnlich init7). Den meisten Menschen mit DTAG Anschluss ist einfach nicht bewusst dass die langsame Anbindung zu Hetzner und anderen ISPs am verweigerten Peering liegt und nicht am ISP selbst. Ein bisschen mehr Medienpräsenz hätte das Problem ggf. in eine andere Richtung gelenkt.

Update:
Es scheint nun ein asynchrones Routing implementiert worden zu sein sofern man bei Hetzner das DTAG Peering hinzukauft (Zitat eines Kunden):
“Die Route DTAG-Hetzner läuft weiterhin über NTT (daher wohl auch die Beibehaltung der IP-Adressen, sollte aber komplett reichen, da die Überlastung nur in der anderen Richtung auftritt), Rückroute Hetzner-DTAG geht jetzt via Core[-backbone]”

Posted in General | 1 Comment

Geburtstagsgeschenke

Vor 15 Tagen hatte ich Geburtstag, einige Leute aus #archlinux.de haben mir dazu ein Geschenk gechickt, das Unboxing Video dazu gibt es hier. Die Geschenke kamen von aibo, andi_, Bluewind, foxxx0, jokke, kuyatzu, Rasi, katido, Spritzgebaeck, soapsurfer, GrafZahl und taxus13.

Posted in General, Nerd Stuff | Leave a comment