Slide 1

Slide 1 text

codecentric AG Mit Puppen spielen Testsysteme automatisieren mit Vagrant und Puppet Bastian Spanneberg @spanneberg

Slide 2

Slide 2 text

codecentric AG Testsysteme ?

Slide 3

Slide 3 text

codecentric AG [Gefühlte] Wahrheit: Wo verbringen Entwickler/QAs? Testsystem Produktion

Slide 4

Slide 4 text

codecentric AG Dokumentation?

Slide 5

Slide 5 text

codecentric AG Wie solide sind Testsysteme gebaut?

Slide 6

Slide 6 text

codecentric AG Das geht besser!

Slide 7

Slide 7 text

codecentric AG Los geht's ... > vagrant init precise64 http://.../precise64.box > vagrant up > vagrant ssh

Slide 8

Slide 8 text

codecentric AG Vagrantfile Vagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.box_url = “..." end

Slide 9

Slide 9 text

codecentric AG ... > vagrant package > vagrant halt > vagrant destroy > vagrant provision

Slide 10

Slide 10 text

codecentric AG Synced Folders config.vm.synced_folder "path_on_host", "/opt/guest_path" config.vm.synced_folder ... owner: “foo”, group: “bar”, nfs: true, disabled: true

Slide 11

Slide 11 text

codecentric AG Networking config.vm.network :forwarded_port, guest: 80, host: 8080 [,auto_correct: true] config.vm.network :private_network, ip: "192.168.50.4" config.vm.network :public network

Slide 12

Slide 12 text

codecentric AG Multi VM Umgebungen config.vm.define "app01" do |app01| app01.vm.host_name = “app.local” app01.vm.box = "appserver­image" end config.vm.define "db01" do |db01| db01.vm.host_name = “db.local” db01.vm.box = "dbserver­image" end

Slide 13

Slide 13 text

codecentric AG Provisioning (Shell) Vagrant.configure("2") do |config| config.vm.box = "precise64" config.vm.provision :shell, inline: "echo 'Vagrant was here!' > /etc/motd.tail" end

Slide 14

Slide 14 text

codecentric AG Provisioning (Puppet) config.vm.provision :puppet do |puppet| puppet.manifests_path = "manifests" puppet.module_path = "modules" puppet.manifest_file = "site.pp" puppet.options = "..." end

Slide 15

Slide 15 text

codecentric AG Puppet – Resourcen resource_type { 'name' : attribut1 => wert1, attribut2 => wert2, … } ● Zustandbeschreibung ● Keine garantierte Reihenfolge ● Idempotenz

Slide 16

Slide 16 text

codecentric AG Puppet – Verbreitete Resourcen (1) file { '/etc/motd.tail' : ensure => present, owner => root, group => root, mode => 644, content => 'This machine is managed by Puppet' } ● Für Files, Links, Directories ● “source” für Verweis auf externe Dateien ● Ruby Templates

Slide 17

Slide 17 text

codecentric AG Puppet – Verbreitete Resourcen (2) package { 'apache2' : ensure => installed, } service { 'apache2' : ensure => running, require => Package['apache2'], }

Slide 18

Slide 18 text

codecentric AG Puppet – Verbreitete Resourcen (3) group { 'foo' : ensure => present, } user { 'foo' : ensure => present, gid => 'foo', managehome => true, shell => '/bin/bash', }

Slide 19

Slide 19 text

codecentric AG Puppet – Verbreitete Resourcen (4) exec { 'dl­tomcat' : command => '/usr/bin/wget … foo.tgz', cwd => '/tmp', creates => '/tmp/foo.tgz', } exec { 'unpack­tomcat' : command => '/bin/tar ­xzf …', unless => '/usr/bin/test ­d …', require => Exec['dl­tomcat'], }

Slide 20

Slide 20 text

codecentric AG Puppet – Metaparameter type { 'foobar' : before => …, require => …, notify => …, subscribe => …, alias => …, } ● Auf alle Typen anwendbar ● Modellierung von Abhängigkeiten

Slide 21

Slide 21 text

codecentric AG Puppet – Fakten, Klassen, Module, Nodes ● Fakten → Infos über das System ● Klassen → Gruppierung von Resourcen ● Module → Wiederverwendung ● Nodes → Beschreibung von Hosts → Demo

Slide 22

Slide 22 text

codecentric AG Puppet - Forge → forge.puppetlabs.com > puppet module install mysql ● Module für nahezu jeden Zweck ● Guter Startpunkt zum Vertiefen

Slide 23

Slide 23 text

codecentric AG Puppet – Best Practice ● Komma nach den Attributes ● Einrückung. Spaces. ● Execs vermeiden! ● Pakte verwenden wenn möglich ● Lohnt sich ein eigenes Paket? ● Potentiale für Wiederverwendung finden

Slide 24

Slide 24 text

codecentric AG Next step: Infrastruktur-Projekt ./modules/ ./manifests/ ./hiera/common.yaml ./hiera/local.yaml ./hiera/test.yaml ./hiera/staging.yaml ./Vagrantfile ● Grundlage für Zusammenarbeit mit Betrieb ● Reviews. Pair Programming. DevOps-Kultur :)

Slide 25

Slide 25 text

codecentric AG Next interesting steps ● Puppetmaster ● Dashboards: The Foreman, Puppet Enterprise ● mcollective ● Puppet + rspec ● Vagrant Cloud Provider (AWS, OpenStack) ● Vagrantfile = Ruby-Skript ● Custom Facts + Function mit Ruby

Slide 26

Slide 26 text

codecentric AG Danke! Fragen? ● Wir suchen Kollegen! ● Karlsruhe :) ● München ● Hamburg ● Frankfurt ● Berlin ● Düsseldorf ● Solingen