<commit_before>---
layout: post
title: "Docker-Hosts mit Puppet provisionieren und testen"
modified: 2014-07-24 20:33:04 +0200
tags: [draft,tech,docker,vagrant,puppet,serverspec,andreasschmidt,peterrossbach ]
category: docker
links:
  - Backends für die Entwicklung mit Vagrant und Docker starten: http://maori.geek.nz/post/vagrant_with_docker_how_to_set_up_postgres_elasticsearch_and_redis_on_mac_os_x
  - Vagrant Docker Provisioner: http://docs.vagrantup.com/v2/provisioning/docker.html
  - Vagrant Docker Provider: https://docs.vagrantup.com/v2/docker/basics.html
  - PuppetForge Docker Modul: https://forge.puppetlabs.com/garethr/docker
  - Puppet: https://www.puppetlabs.com/
  - SaltStack: http://www.saltstack.com/
  - Ansible: http://www.ansible.com/
  - Chef: http://www.getchef.com/
  - Packer: http://www.packer.io/
keywords:
  - docker
  - serverspec
  - puppet
  - vagrant
---

Die ersten Schritte mit Docker gestalten sich durch [boot2docker](2014-06-30-docker-mit-boot2docker-starten.md)
recht einfach, so hat man schnell eine Spielwiese erstellt, um die Funktionalität
ausprobieren zu können. Aber spätestens wenn Docker-Container im Test- oder Produktionssystem live gestellt werden sollen,
stellt sich die Frage nach dem reproduzierbaren Aufsetzen eines Docker-Hosts.

Da wir für dieses Beispiel gar nicht so viele Dinge zu installieren, bzw. konfigurieren haben, ist ein leichtgewichtiges Tool wie z.B. [Ansible](http://www.ansible.com) oder [SaltStack](http://www.saltstack.com/) naheliegend. Viele Unternehmen
setzen allerdings seit geraumer Zeit auf [Puppet](https://www.puppetlabs.com/), das allgemein bekannt sein dürfte.

Um die Hürde nicht zu hoch zu legen und zuviel Veränderung auf einmal anzubringen, bauen wir dieses Beispiel
mit Puppet auf. Um die Installation testbar zu bekommen, empfiehlt
<<<<<<< HEAD:_drafts/hosts-mit-docker-und-puppet-provisionieren.md
sich der Einsatz von [serverspec](http://www.serverspec.org). Wer noch nicht so vertraut mit ServerSpec ist, sollte unseren [Einführungs- Post](2014-04-25-serverspec-server-spezifizieren-und-testen.md) dazu kurz lesen.
=======
sich der Einsatz von [serverspec](http://www.serverspec.org). Wer noch nicht so vertraut mit ServerSpec ist, sollte unsere [Einführungs Post](http://www.infrabricks.de/blog/2014/04/25/serverspec-server-spezifizieren-und-testen/) dazu hier kurz lesen.
>>>>>>> 5e5297c3ca7a484d46993998d7c958f8acef6456:_posts/2014-07-24-hosts-mit-docker-und-puppet-provisionieren.md


## Vagrant/Docker-Provisioner

Vagrant bietet selber einen [Docker-Provisioner](http://docs.vagrantup.com/v2/provisioning/docker.html) an.
Dieser ist nicht zu verwechseln mit dem Docker-Provider, der Docker als Backend verwendet, damit Vagrant
Container anstelle von VMs startet. Der Provisioner hingegen ist in der Lage, Docker
auf der gestartetem VM zu installieren, mit Images zu bestücken und
daraus Container zu starten. Die Konfiguration des Docker-Servers ist davon noch ausgenommen.

Das ist schon eine gute Abkürzung auf dem Weg in Richtung Reproduzierbarkeit, sie hängt
allerdings auch davon ab, wie weit Vagrant in der Continuous Delivery Kette zum Einsatz kommt. Wenn z.B.
das Livesystem auf einer Virtualisierung beruht, die nicht durch ein Vagrant-Backend
unterstützt wird, kommt man mit dem Docker-Provisioner an der Stelle nicht weiter.
Dann werden Entwicklungs- und vielleicht auch Testsystem nachvollziehbar bestückt, beim Sprung
auf das Livesystem ergibt sich ein Bruch.

## Puppet-Modul für Docker

Eine mögliche Lösung ist, Puppet für die Installation und Konfiguration des Docker-Servers
zu verwenden. Ein Puppet-Modul kann getestet werden, lässt sich in Vagrant über den
Puppet-Provisioner integrieren und auf allen Stages der Delivery-Chain nutzen.

Wenn man in der PuppetForge nach Docker sucht, wird man schnell bei dem [Modul von Gareth Rushgrove](https://forge.puppetlabs.com/garethr/docker) fündig.
Damit lässt sich Docker installieren, in Teilen konfigurieren,
Images lassen sich herunterladen und Container können gestartet werden.

Und wir möchten die Installation natürlich mit Serverspec's testen, um nachhaltig zu beweisen das wir korrekt provisioniert haben.

Alle Schritte können mit dem Github-Repository [aschmidt75/docker-testing-playground](https://github.com/aschmidt75/docker-testing-playground)
nachvollzogen werden. Im Text finden sich in den Abschnitten (Git-Tag)-Einträge, die
auf Tags im Repository verweisen. So lassen sich einzelne Stände nachvollziehen.

Los geht's!

### Mit der leere VM beginnen ...

Wir starten mit einem einfach Vagrant-Konfiguration, das eine einzelne VM auf Basis
Ubuntu 14.04 aufbaut. Da wir auf einen fest benannten Paketstand aufsetzen
möchten, führen wir kein Update durch. Sinnvoll ist es, hier genau das Image
mit Werkzeugen wir z.B. [Packer](http://www.packer.io/) selber zu bauen und vorzuhalten, das man für den Betrieb
der eigenen Plattform haben möchte.

```ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "trusty64"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/20140723/   /trusty-server-cloudimg-amd64-vagrant-disk1.box"

  config.vm.define "docker-test1", primary: true do |s|
  end

end
```
(Git-Tag v1)

Wer das ganze schnell ausprobieren möchte, kann sich den Code von github auschecken:

```<commit_msg>fix bugs, add link<commit_after>---
layout: post
title: "Docker-Hosts mit Puppet provisionieren und testen"
modified: 2014-07-24 20:33:04 +0200
tags: [tech,docker,vagrant,puppet,serverspec,andreasschmidt,peterrossbach ]
category: docker
links:
  - Backends für die Entwicklung mit Vagrant und Docker starten: http://maori.geek.nz/post/vagrant_with_docker_how_to_set_up_postgres_elasticsearch_and_redis_on_mac_os_x
  - Vagrant Docker Provisioner: http://docs.vagrantup.com/v2/provisioning/docker.html
  - Vagrant Docker Provider: https://docs.vagrantup.com/v2/docker/basics.html
  - PuppetForge Docker Modul: https://forge.puppetlabs.com/garethr/docker
  - Puppet: https://www.puppetlabs.com/
  - SaltStack: http://www.saltstack.com/
  - Ansible: http://www.ansible.com/
  - Chef: http://www.getchef.com/
  - Packer: http://www.packer.io/
keywords:
  - docker
  - serverspec
  - puppet
  - vagrant
---

Die ersten Schritte mit Docker gestalten sich durch [boot2docker](2014-06-30-docker-mit-boot2docker-starten.md)
recht einfach, so hat man schnell eine Spielwiese erstellt, um die Funktionalität
ausprobieren zu können. Aber spätestens wenn Docker-Container im Test- oder Produktionssystem live gestellt werden sollen,
stellt sich die Frage nach dem reproduzierbaren Aufsetzen eines Docker-Hosts.

Da wir für dieses Beispiel gar nicht so viele Dinge zu installieren, bzw. konfigurieren haben, ist ein leichtgewichtiges Tool wie z.B. [Ansible](http://www.ansible.com) oder [SaltStack](http://www.saltstack.com/) naheliegend. Viele Unternehmen
setzen allerdings seit geraumer Zeit auf [Puppet](https://www.puppetlabs.com/), das allgemein bekannt sein dürfte.

Um die Hürde nicht zu hoch zu legen und zuviel Veränderung auf einmal anzubringen, bauen wir dieses Beispiel
mit Puppet auf. Um die Installation testbar zu bekommen, empfiehlt
<<<<<<< HEAD:_drafts/hosts-mit-docker-und-puppet-provisionieren.md
sich der Einsatz von [serverspec](http://www.serverspec.org). Wer noch nicht so vertraut mit ServerSpec ist, sollte unseren [Einführungs- Post](2014-04-25-serverspec-server-spezifizieren-und-testen.md) dazu kurz lesen.
=======
sich der Einsatz von [serverspec](http://www.serverspec.org). Wer noch nicht so vertraut mit ServerSpec ist, sollte unsere [Einführungs Post](http://www.infrabricks.de/blog/2014/04/25/serverspec-server-spezifizieren-und-testen/) dazu hier kurz lesen.
>>>>>>> 5e5297c3ca7a484d46993998d7c958f8acef6456:_posts/2014-07-24-hosts-mit-docker-und-puppet-provisionieren.md


## Vagrant/Docker-Provisioner

Vagrant bietet selber einen [Docker-Provisioner](http://docs.vagrantup.com/v2/provisioning/docker.html) an.
Dieser ist nicht zu verwechseln mit dem Docker-Provider, der Docker als Backend verwendet, damit Vagrant
Container anstelle von VMs startet. Der Provisioner hingegen ist in der Lage, Docker
auf der gestartetem VM zu installieren, mit Images zu bestücken und
daraus Container zu starten. Die Konfiguration des Docker-Servers ist davon noch ausgenommen.

Das ist schon eine gute Abkürzung auf dem Weg in Richtung Reproduzierbarkeit, sie hängt
allerdings auch davon ab, wie weit Vagrant in der Continuous Delivery Kette zum Einsatz kommt. Wenn z.B.
das Livesystem auf einer Virtualisierung beruht, die nicht durch ein Vagrant-Backend
unterstützt wird, kommt man mit dem Docker-Provisioner an der Stelle nicht weiter.
Dann werden Entwicklungs- und vielleicht auch Testsystem nachvollziehbar bestückt, beim Sprung
auf das Livesystem ergibt sich ein Bruch.

## Puppet-Modul für Docker

Eine mögliche Lösung ist, Puppet für die Installation und Konfiguration des Docker-Servers
zu verwenden. Ein Puppet-Modul kann getestet werden, lässt sich in Vagrant über den
Puppet-Provisioner integrieren und auf allen Stages der Delivery-Chain nutzen.

Wenn man in der PuppetForge nach Docker sucht, wird man schnell bei dem [Modul von Gareth Rushgrove](https://forge.puppetlabs.com/garethr/docker) fündig.
Damit lässt sich Docker installieren, in Teilen konfigurieren,
Images lassen sich herunterladen und Container können gestartet werden.

Und wir möchten die Installation natürlich mit Serverspec's testen, um nachhaltig zu beweisen das wir korrekt provisioniert haben.

Alle Schritte können mit dem Github-Repository [aschmidt75/docker-testing-playground](https://github.com/aschmidt75/docker-testing-playground)
nachvollzogen werden. Im Text finden sich in den Abschnitten (Git-Tag)-Einträge, die
auf Tags im Repository verweisen. So lassen sich einzelne Stände nachvollziehen.

Los geht's!

### Mit der leere VM beginnen ...

Wir starten mit einem einfach Vagrant-Konfiguration, das eine einzelne VM auf Basis
Ubuntu 14.04 aufbaut. Da wir auf einen fest benannten Paketstand aufsetzen
möchten, führen wir kein Update durch. Sinnvoll ist es, hier genau das Image
mit Werkzeugen wir z.B. [Packer](http://www.packer.io/) selber zu bauen und vorzuhalten, das man für den Betrieb
der eigenen Plattform haben möchte.

```ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "trusty64"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/trusty/20140723/trusty-server-cloudimg-amd64-vagrant-disk1.box"

  config.vm.define "docker-test1", primary: true do |s|
  end

end
```
(Git-Tag v1)

Wer das ganze schnell ausprobieren möchte, kann sich den Code von github auschecken:

```
{'fraction_non_alphanumeric': 0.08679809399233859, 'fraction_numerical': 0.019807530598897505, 'mean_word_length': 4.894273127753304, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 17, 'https://': 12, 'lorem ipsum': 0, 'www.': 24, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4626214', 'n_tokens_mistral': 3925, 'n_tokens_neox': 3720, 'n_words': 1124}