knuspermagier.de
Hallo. Ich bins! Philipp!

Erste Schritte mit Ansible

Seit Monaten bin ich auf der Suche nach einer Art Server automatisch zu konfigurieren, für die ich mich nicht drei Wochen in ein dickes Regelwerk einarbeiten muss.

Meine Anforderungen waren ja ganz einfach:

  1. Ich will bestimmen welche Pakete und Services auf dem Server sein sollen und welche Konfigurationsdateien wo rumliegen sollen. Diese sollen aus entsprechenden Templates mit Variablen generiert werden.

  2. Ich will nicht zwei Millionen verschachtelte Ordner mit tausend Dateien anlegen nur um nginx auf einem Server zu installieren.

  3. Ich will nicht auf meinem Rechner und auf dem Server zwanzig neue Services installieren müssen, damit alles automagisch zusammenfindet.

  4. Ich will eine Doku, mit der ich mir in 15 Minuten ein einfaches “nginx + PHP + mysql”-Setup-Script zusammenbauen kann, ohne von den Möglichkeiten total überwältigt zu werden.

Vor ein paar Wochen unternahm ich dann, weil ich beruflich mal wieder Server administrieren musste, einen neuen Versuch, etwas zu finden.

Folgende Sachen erfüllten meine Anforderungen leider nicht: Puppet, Chef, SaltStack.

(Das bedeutet nicht, dass sie nicht vielleicht auch dafür geeignet waren, aber ich fand in meiner Kurzrecherche nicht die nötigen Anhaltspunkte)

Zuerst dachte ich, dass auch Ansible den Test nicht bestehen wird, nach kurzem Studium der Dokumentation waren die Bedenken allerdings wie weggeblasen.

Dank des Getting Started-Guides bekam ich einen guten ersten Einblick und war tatsächlich in der Lage schnell und problemlos ein Playbook zu erstellen, mit dem ich die Server einrichten konnte.

Um diesem Post jetzt noch etwas mehr Inhalt als “Ansible ist toll” zu geben, hier ein wirklich kurzes Playbook.

Ziel soll es sein, einen Ubuntu-EC2-Server mit nginx, PHP und MySQL auszustatten.

---
- hosts: all
  gather_facts: false
  remote_user: ubuntu
  sudo: yes
  vars:
    http_port: 80
    api_root: /var/www/ansibletest.com/
  tasks:
  - name: update apt
    apt: update_cache=yes upgrade=full
  - name: install tools
    apt: name={{item}} state=present
    with_items:
      - vim
      - wget
      - curl
      - python-setuptools
      - screen

Jap. Ihr seht richtig. Yaml. Keine Ahnung was das soll, aber diesen einen Minuspunkt kann man wohl verkraften. Anscheinend startet man ein Playbook (so heißen diese Vorschriften bei Ansible) mit drei Minussen.

Dieser erste Block hier sorgt jedenfalls dafür, dass essentielle Dinge wie vim, wget und screen installiert sind. Vorher wird apt geupdated. Außerdem werden ein paar Variablen gesetzt, die später in die Konfigurations-Templates eingefügt werden. Diese können aber z.B. auch in der Host-Konfiguration pro Host, oder pro Gruppe von Hosts angegeben werden.

Sieht alles ziemlich verständlich aus, oder?

  - name: install nginx
     apt: name=nginx state=present
  - name: install php5 and modules
    apt: name={{item}} state=present
    with_items:
      - php5-fpm
      - php5-cli
      - php5-mcrypt
      - php5-curl
      - php5-mysql
      - php5-json
      - php5-readline
  - name: enable php5 modules
    shell: php5enmod mcrypt curl mysql json readline
  - name: install mysql
    apt: name=mysql-server state=present

Auch hier nur ganz einfache Anweisungen, hauptsächlich für apt. Spannender wird’s im letzten Teil, der die Konfigurationen erzeugt.

  - name: delete default config
    file: path=/etc/nginx/sites-available/default state=absent
    notify:
    - restart webserver
  - name: copy nginx config for api
    notify:
    - restart webserver
    template: src=templates/nginx-site.j2 dest=/etc/nginx/sites-available/ansibletest.conf
  - name: activate config
    file: src=/etc/nginx/sites-available/ansibletest.conf dest=/etc/nginx/sites-enabled/ansibletest.conf state=link
    notify:
    - restart webserver
  - name: ensure nginx is running
    service: name=nginx state=started enabled=yes
  - name: ensure php5-fpm is running
    service: name=php5-fpm state=started enabled=yes
handlers:
  - name: restart webserver
    service: name=nginx state=restarted
    service: name=php5-fpm state=restarted

(Die Templates spare ich mir hier jetzt mal, das sind einfache Jinja2-Templates mit {{ solchen Replacements }})

Das sieht dann schon ein bisschen unübersichtlicher aus, ist aber auch ganz einfach. Die Handler am Ende sind dann noch Tasks, die über das notify nur getriggert werden, wenn auch wirklich was passiert ist. So wird der Webserver nicht 200x neugestartet, sondern nur, wenn die Konfigurationsdatei ausgetauscht wurde.

Das ganze speichern wir jetzt als playbook.yaml.

Ansible will jetzt noch wissen, wo der Kram ausgeführt werden soll, dafür gibt es Inventory-Files. Die können auch ganz einfach aussehen:

[testserver]
ansibletest.com

Fertig. Das ganze dann mit ansible-playbook playbook.yaml -i inventory aufrufen und die Magie mit anschauen.

(Das Playbook gibt es hier nochmal am Stück als Gist)

Das war jetzt natürlich nur ein sehr kleiner Ausschnitt von dem, was mit Ansible möglich ist, und man könnte die Frage stellen, ob es sich schon für so kleine Aufgabenstellungen lohnt — ich finde aber schon. In meinem bisherigen Leben habe ich schon soviel Server aufgesetzt und immer wieder an den gleichen Stellen gegoogelt, was ich nun in die Konfiguration schreiben muss, damit PHP funktioniert, etc — hätte ich mich nur schon früher damit beschäftigt, hätte ich wohl einige Zeit gespart.

Ich freue mich auf jeden Fall darauf, Server in Zukunft nicht mehr anders vorzubereiten.

(Abgesehen vom Yaml, darauf freue ich mich nicht.)

Narcos

Vor ein paar Tagen, auf dem Rückweg vom Sport, entdeckte ich an einer Bushaltestelle mal wieder ein Netflix-Werbebanner, welches mich auf Narcos aufmerksam machte.

Ich glaube, Netflix ist die einzige Firma, deren Offline-Werbung bei mir Erfolg hat. Gerade Netflix!

Naja, ich schrieb es also auf meine Liste und schaute es jetzt am Wochenende komplett. In letzter Zeit habe ich mich echt mit Serien angefreundet, die man an ein oder zwei Wochenenden durchgucken kann. Zehn Folgen sind perfekt.

(Eventuell leichte Spoilerwarnung.)

Narcos erzählt die Geschichten von Pablo Escobar, einem übergewichtigen Drogenbaron und Steve Murphy, einem amerikanischen DEA-Agenten.

In den ersten Folgen erfährt man relativ schnell, was so von 1970-1990 passiert. Große Teile werden hier von Murphy als Off-Stimme begleitet, so dass man sich manchmal fühlt, als wäre man im Geschichtsunterricht. Durch die schnelle Reise durch die Jahre und die verschiedenen Schauplätze ging etwas das Zeitgefühl verloren und man sieht recht viele verschiedene Charaktere, so dass es schwer fällt eine Bindung aufzubauen.

Im zweiten Teil der ersten Staffel verringert sich die Geschwindigkeit dann etwas und man hat mehr Zeit durchzuatmen.

Ich weiß nicht genau, wie viel zur Story hinzugedichtet wurde, die vielen Originalaufnahmen, die zwischendurch eingespielt werden, lassen das ganze aber auf jeden Fall sehr real wirken.

(Und wenn man sich mal die Wikipedia-Seite zu Escobar und seinen ganzen Freunden durchliest, merkt man, dass es wohl nicht stark übertrieben ist.)

Narcos zeigt ganz gut, zu was für Scheiße Menschen in der Lage sind, wenn es um Geld und Macht geht. Das und die Tatsache, dass man sich auch mit keinem der Charaktere so richtig anfreunden kann, hinterlässt sie einen am Ende etwas deprimiert.

Es ist wirklich keine schöne Serie an der man Spaß hat. Trotzdem war ich spätestens nach der dritten Folge dann doch ziemlich gehooked und musste es zu Ende gucken, um zu erfahren was passiert. Wenn man sich also grundlegend für sowas interessiert, und etwas abgehärtet ist, was Gewalt in TV-Serien angeht (ich würde sagen, es ist knapp unter Daredevil-Niveau), sollte man Narcos auf jeden Fall anschauen.

Es ist wieder mal eine sehr sehr gute Netflix-Produktion und ich freue mich auf die zweite Staffel, die von Netflix bereits wenige Tage nach dem Release der ersten beauftragt wurde. Ich freue mich auf das nächste Werbebanner von Netflix.

Noch ein paar Random Facts:

  • Bestimmt 75% der Dialoge sind auf Spanisch, man ist also die ganze Zeit damit beschäftigt Untertitel zu lesen, wenn man kein Spanisch kann. Das wirkt natürlich stimmiger, ist aber auch etwas nervig.
  • Pablo guckt die ganze Zeit sooo traurig, dass man eigentlich Mitleid haben müsste
  • Ich hab etwas gebraucht um Oberyn Martell in seiner Rolle als Peña zu erkennen, freute mich dann aber umso mehr!

watched.li-2.3

(Die interne Versionsnummer ist 0.2. Ich bin schlecht in Versionsnummern.)

Heute vor einer Woche veröffentlichte ich ein Update für watched.li, welches endlich das letzte fehlende Feature aus der Alpha-Phase zurückbringt. Mit den öffentlichen Profilen könnt ihr nun euren Serien-Status überall rumzeigen, verlinken oder Ausdrucken und an die Pinnwand hängen.

U6pJqrUhAcejQzFRT.png

Neben den aktuell verfolgten und abgeschlossenen Serien gibt's eine Zusammenfassung der letzten Aktivitäten und eine Einordnung in die Rangliste aller watched.li-User. Wie interessant das ist, wird sich herausstellen.

Auch dieses mal wieder ein Danke an Hannah für die Designanpassungen und das Logo!

Flugzeuge

IMG_9316.jpg
IMG_9339.jpg

Scheint als würden die Flugzeuge an manchen Tagen so starten, dass ich sie aus dem Schlafzimmerfenster beobachten kann. Da musste ich doch direkt das alte 100-300mm-Objektiv nochmal rauskramen.

Wordpress kopieren

Ihr wollt ein Wordpress kopieren, kommt auf die glorreiche Idee, einfach die Tabellen zu exportieren, mit einem Text-Editor den Tabellen-Prefix wp durch wpneu zu ersetzen?

Vorsicht ist hier geboten. Denn spannender weise fangen auch die Keys in der options-Tabelle (z.b. wp_role und sowas...) mit dem entsprechenden Prefix an. Warum auch nicht?

Da ich jetzt nicht irgendwas kaputt machen wollte, indem ich in der gesamten .sql-Datei wp durch wpneu ersetze, legte ich einfach eine neue Datenbank an. Könnte aber auch einfach klappen. Weiß ich nicht.

Perseiden

IMG_9284.jpg
IMG_9251.jpg
IMG_9271.jpg

Für den 13. August war die aktivste Nacht der diesjährigen Perseiden-Schauer angekündigt, also fuhren Hannah, Max und ich ein paar Meter aus Hamburg raus um der Lichtverschmutzung etwas zu entgehen.

Leider fanden wir kein komplett Baum-freies Feld und die Wolken wollten auch nicht verschwinden.

Nichtsdestotrotz war es ganz schön und wir sahen auch einige Sternschnuppen, leider verirrten sich nur zwei ganz kleine auf die Kamera. Mal gucken, ob wir nächstes Jahr mehr Glück haben!

(Außerdem hab ich nicht so richtig scharfgestellt, glaub ich.)

Montana Jones

Ihr kennt das sicher. In eurem Kopf schwirren gewisse Fakten zu einem Thema und ihr kommt einfach nicht darauf, was genau dieses Thema ist.

So erging es mir jetzt bestimmt die letzten vier oder fünf Jahre. Ich erinnerte mich vage an eine animierte Kindersendung, mit einem Löwen in der Hauptrolle. Dieser Löwe war Detektiv oder Abenteurer, oder etwas vergleichbares und im Intro sprang er einen Wasserfall herunter. Außerdem hatte das Intro Saxophon-Musik, die klang wie Baker Street.

Vor ein paar Jahren verbrachte ich schonmal viele Stunden einer Nacht damit, Listen von Zeichentrickserien Stück für Stück durchzugehen, leider ohne Ergebnis.

Nachdem das Thema dann gestern wieder aufkam, dachte ich mir, ich versuche mein Glück mal bei Reddit und eröffnete in /r/tipofmytongue einen Thread, in dem ich um Hilfe bat. Zu meiner Überraschung bekam ich schon nach wenigen Minuten die Lösung präsentiert. Montana Jones (In Deutschland wohl nur "Montana").

Nachdem ich das Intro dann nochmal anschaute, war ich etwas enttäuscht, denn das Lied war nicht so cool, wie ich es in Erinnerung hatte. Baker Street ist besser. Trotzdem fühlte ich mich danach irgendwie... etwas befreit. Befreit von diesen Gedanken, die ich nicht zuordnen konnte.

Danke, Internet.

Eine süße animierte Karte in drei einfachen Schritten

Dem ein oder anderen, der einen Blick in die Island-Galerien geworfen hat, wird vielleicht die Karte aufgefallen sein, die dort eingebaut ist.

Bereits während des Urlaubs dachte ich, dass ich in die kommenden Galerien eine neue Spielerei einbauen will. Nach reichlicher Überlegung (fünf Minuten) fiel die Wahl auf eine animierte Karte, die zeigt, wo wir uns an den verschiedenen Tagen aufgehalten haben.

Dank meiner Daten aus Moves und der Karte, die Hannah bereits vor dem Urlaub angefertigt hatte, war das ja kein Problem.

VagVBc7uk0oTlTtqW.png

Also, Schritt 1: Die Karte als SVG erstellen, die Route eintragen, die Pins reinwerfen und sich ein bisschen über Adobe Illustrator aufregen.

Danach recherchiert man dann ein bisschen, wie man das eigentlich macht. Ich für meinen Teil fragte einfach Daniel, denn ich erinnerte mich, dass er sowas schonmal machte.

Eigentlich ist es ganz einfach. SVG-Pfade haben die Methoden getTotalLength() und getPositionAtLength(), mit denen man einerseits die gesamte Länge (ha! Wer hätte das gedacht) und andererseits die Koordinaten an jeder Stelle des Pfades bekommen kann.

Damit ist es dann schonmal kein Problem mehr ein Auto an dem Pfad “entlangfahren” zu lassen. Den Pfad nur teilweise zu zeichnen geht auch, mit etwas CSS-Gefrickel, welches ich natürlich bei css-tricks.com fand.

Schritt 2: Daniel fragen, wie man sowas macht, etwas googeln und einen Prototyp bauen.

Sehr zufrieden schaute ich mir ein paar Stunden später das Produkt meiner Arbeit an. Das Auto fuhr schön auf der Karte herum, die PINs ploppten auf und zeigten beim Hovern einen Tooltip an.

Nun wollte ich die Karte in meine Live-Galerie integrieren und schaute es nochmal zur Sicherheit in verschiedenen Browsern an. So als Profi-Webentwickler macht man das ja.

Safari - fast keine Probleme.

Internet Explorer - Egal.

Firefox. Arghl. Nichts funktioniert.

Nach etwas Recherche konnte ich dann feststellen, dass der Firefox wohl bei .getTotalLength() ein Problem hat (zumindest bei meiner SVG) — auch die tolle SnapSVG-Library funktionierte dafür nicht. Einbinden musste ich sie trotzdem, denn auch der Rest war im Firefox nicht so richtig funktional. Die Länge kodierte ich dann einfach hart.

Außerdem unterstützt der Firefox anscheinend keine CSS-Transforms für SVG-Elemente. Nachdem sich die Aufregung gelegt hatte, band ich dann noch GSAP ein, eine schöne JS-Animation-Library. Weitere 100kb.

Wegen dem Firefox musste ich also Libraries im Wert von 150kb einbinden. Tolle Sache. Zum Glück ist das Gesamtkonstrukt (Libraries + Karte + Kleinkram) immer noch wesentlich kleiner als jedes einzelne Bild in der Galerie, von daher ist das wohl egal.

Schritt 3: Den Firefox hassen, alles neu machen und releasen.

In drei einfachen Schritten zum animierten Glück! So einfach ist das. Webentwicklung macht Spaß, bis man seinen Chrome verlassen muss.

(Danke an Hannah für die Karte und das Auto, Daniel für den Stups in die richtige Richtung und an den Chrome, weil er einfach funktioniert)

(Den vollständigen Source-Code findet ihr, wenn ihr auf die Island-Galerie geht, View source in eurem Browser klickt und nach der karte.js sucht. Er ist zu hässlich, als das ich ihn hier präsentieren wollen würde)

Ellie

Wie schon oft erwähnt, bin ich seit langer Zeit (mindestens seitdem es von Facebook gekauft wurde) auf der Suche nach einer Alternative für Moves.

Bisher blieb diese leider erfolglos und nicht zuletzt wegen des Kommentars von Nils unter meinem letzten Post, entschied ich mich dafür es halt selber in die Hand zu nehmen.

Leider ist das alles nicht so einfach, denn Infos wie man seine App nun perfekt dazu bringt im Hintergrund weiter die Location zu holen und dabei vielleicht noch etwas energiesparend zu sein sind spärlich gesäht. Oder ich bin zu schlecht im Googeln.

Abgesehen davon bedeutet vernünftiges Ausprobieren dann auch immer einen Tag warten und am Ende gucken, ob sich etwas bei der Aufzeichnung verbessert hat.

Seit ein paar Tagen feile ich also Abends an der Implementierung, gucke es mir am nächsten Tag an und hoffe, dass es besser wird.

yNVeqz36oQTlj1vkP.png

Mein aktueller Status: Ganz okay! Teilweise gibt's natürlich noch viel Rauschen, vor allem wenn ich mich an einer Position befinde. Dagegen komm ich sicher mit komplizierten Filteralgorithmen an. Andererseits hört er manchmal doch einfach so auf zu tracken, da muss ich nochmal gucken.

Falls jemand Tipps hat, gerne her damit. Ansonsten probiere ich einfach weiter rum. Weitere Ergebnisse dann wie immer hier im Blog und später auf Github!

Updating to nginx-1.8.0 without wasting a whole evening to debug blank pages.

"Let's do a apt-get update && apt-get upgrade to install a lot of fancy security updates!".

Well, somehow in this process my nginx got updated from 1.6.2 to 1.8.0 (I'm using dotdeb packages. I don't know why they made such a big jump?). The result were blank pages for my PHP scripts, without any errors, even after activating all debug switches I found.

After googling for my favorite key words "nginx php-fpm blank page no errors" and trying some things I fixed everything with this line in my PHP location block in the nginx configuration:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

Maybe the nginx update overwrote the default fcgi_params file that's included by default, or it's not nginx' fault after all and PHP-FPM changed its behaviour. Whatever. Its fixed now and I hope the next update will be smoother. Like the 2000 updates before.