SlideShare una empresa de Scribd logo
1 de 70
DevOps für PHP
International PHP Conference
Spring Edition 2011




                               © 2010 Mayflower GmbH
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 2
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 3
2007

 Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 4
http://www.flickr.com/photos/johnmueller/52621490/
                               Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 5
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 6
http://www.flickr.com/photos/johnmueller/52621490/
                               Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 7
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 8
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 9
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 10
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 11
Nicht schnell.




   Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 12
Nicht schnell.




   Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 13
auch schnell.




   Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 14
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 15
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 16
Das bin ich.


Johann-Peter Hartmann
@johannhartmann
hartmann@mayflower.de
IRC: Freenode, EFNet
johann__




                        Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
Und das auch.


Johann-Peter Hartmann
PHP Developer
CTO of 65 developers
Likes PHP, Agility, System
Administration and
Security




                             Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
Wer seid Ihr?




                Developer?
                Sysadmin?




                         Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
(Zeit schinden durch Publikumsfragen)




                   Agile?
                   Scrum?



                               Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
(noch mehr Zeit schinden)




                   Releases / Jahr?




                            Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
(... ich muss mich beeilen)




                    Cloud?




                              Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
==
Hardware =
Software
      Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 23
API


Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 24
Immer noch
   Hardware
(nur woanders)
     Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 25
2009

 Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 26
Hardware = Software =
Configuration



             Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 27
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 28
Dokumentationsgetrieben
     DomainSpecificLangu
     age


         Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 29
PuppetMaster

  PuppetD


   Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 30
Mach ma hin

 So Isset.


   Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 31
Facter




Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 32
class web {
  package {“httpd“:
    ensure => present
  }

    file {“/etc/httpd/conf/httpd.conf“:
      owner => root,
      group => root,
      mode => 664,
      source => puppet:///modules/apache/httpd.conf,
      require => Package[“httpd“],
      notify => Service[“httpd“]
    }

    service {“httpd“:
      ensure => running,
      enable => true,
      require => File[“/etc/httpd/conf/httpd.conf“]
    }
}

node “web01.mydomain.test“ {
  include web
}


                               Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 33
Puppet-Modules
• apache, nginx, varnish
• php, ruby, tomcat
• mysql, postgresql, memcache,
  ejabberd
• heartbeat, dns
  (gibt eigentlich für fast alles etwas)



                   Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 34
Monitoring




Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 35
Quelle: http://www.puppetlabs.com/puppet/related-projects/dashboard/
                                  Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 36
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 37
Vagra


Ich weiss, wie meine Server
aussehen.
Das Development soll
maximal ähnlich sein.

             Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 38
Vagrant


VirtualBox-basierte
automatische
Erzeugung von VMs
mit Puppet/Chef
    Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 39
Vagrant


Voll versioniert!
On-Demand
Erzeugung
Developer-Self-
Service
    Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 40
$ gem install vagrant
$ vagrant box add maverick64 http://mathie-vagrant-
boxes.s3.amazonaws.com/maverick64.box
$ mkdir maverick_demo
$ cd maverick_demo
$ vagrant init maverick64
$ vagrant up
$ vagrant ssh
vagrant@maverick64:~$




                            Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 41
Vagrant-Cluster mit
20 Maschinen lokal?



        Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 42
McCloud
    Wrapper around
    Vagrant and Fog

    Transparent local &
    cloud usage

                                    https://github.com/jedi4ever/
                                    mccloud
          Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 43
Und wenn ich 500
Maschinen will?



       Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 44
mCollective
ssh-for-loop on steroids

fast management for loads
of servers

uses puppet/facter, MQ-
based
            Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 45
$    mc-package -W "architecture=x86" status apache

 *
[ ============================================================>
] 10 / 10

host01.example.com                         version            =    apache-2.2.9-7
host02.example.com                         version            =    apache-2.2.9-7
host03.example.com                         version            =    apache-2.2.9-7
host04.example.com                         version            =    apache-2.2.9-7
host05.example.com                         version            =    apache-2.2.9-7
host06.example.com                         version            =    apache-2.2.9-7
host07.example.com                         version            =    apache-2.2.9-7
host08.example.com                         version            =    apache-2.2.9-7
host09.example.com                         version            =    apache-2.2.9-7
host10.example.com                         version            =    apache-2.2.9-7

---- package agent summary ----
           Nodes: 10 / 10
        Versions: 10 * 0.25.5-1.el5
    Elapsed Time: 1.03 s




                              Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 46
The most dangerous
vegetable on earth!
            Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 47
• eigentlich ein BDD-Tool
• trotzdem Bestandteil in DevOps
• und Bestandteil in Lean Startup
• cucumber-nagios
• cucumber-puppet



                         Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
Feature: Manualsearch
  In order to find an article
  As an developer
  I want to use the search function
  Scenario: Search for bdd and check resulting page
    Given I go to "http://it-republik.de/php/"
    When I fill in "search_itr" with "bdd"
    And I click "search2"
    Then I should see "Suche"




                            Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 49
Given /^I go to "([^"]*)"$/ do |url|
  visit url
end

When /^I fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
  fill_in field, :with => value
end

When /^I click "([^"]*)"$/ do |button|
   click_button(button)
end

Then /^I should see "([^"]*)"$/ do |text|
  response_body.should include(text)
end




                            Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 50
johann$ cucumber
Feature: Manualsearch
  In order to find an article
  As an developer
  I want to use the search function

  Scenario: Search for bdd and check resulting page # features/
search.feature:5
    Given I go to "http://it-republik.de/php/"      # features/
step_definitions/search_steps.rb:1
    When I fill in "search_itr" with "bdd"          # features/
step_definitions/search_steps.rb:5
    And I click "search2"                           # features/
step_definitions/search_steps.rb:9
    Then I should see "Suche"                       # features/
step_definitions/search_steps.rb:13

1 scenario (1 passed)
4 steps (4 passed)
0m1.615s




                            Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 51
Feature: Install inetd
  In order to serve the web
  the httpd service
  must be installed

  Scenario: Setup httpd
    Given a node of class “web“
    When I compile the catalog
    Then package “httpd“ should be “installed“
    Then there should be a resource “Service[httpd]“
    And the service should have “enable“ set to “true“
    And State should be “running“
    And the service should require “Package[httpd]“




                              Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 52
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 53
Das verstehe sogar ich!
Und ich bin seit 20
Jahren im Marketing!




                          Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 54
Unit Tests
                             Acceptance
                             Tests
                             Metrics
                             Coding Style

                             ... you get the
                             idea.




Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 55
... and even
                             more ...

                             Packaging
                             Releasing
                             Deployment




Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 56
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 57
Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 58
Wetware
Refactoring



    Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 59
Work together




        Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 60
Own together




        Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 61
Eat together




        http://www.flickr.com/photos/vilavelosa/
        3815032524/ - und dann? I Mayflower GmbH I 28. Oktober 2010
           Kontinuierliche Entiwcklung                               I 62
Plan
together




           Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 63
Mayflower
DevOpsification




      Kontinuierliche Entiwcklung - und dann?   I   Mayflower GmbH   I   28. Oktober 2010   I 64
DevOpsification of Mayflower (Wetware)




 1-2 Admins pro Team
 –Admin & Development-
  Aufgaben
 –Vollzeit dem Team
  zugeordnet

                              Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
DevOpsification of Mayflower (Wetware)




Enge Zusammenarbeit mit zentralem
Admin

Volle Root-Rechte auf Developer-
Infrastruktur



                              Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
DevOpsification of Mayflower (Software)




 1+n Puppet-Master
  – zentraler Firmenmaster
  – Teammaster pro Team / Projekt
  – Firmenmaster ist Startpunkt der
    Teamkonfiguration




                              Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
DevOpsification of Mayflower (Software)




 Beispiel-Setup:
  – lokale Developer-VM
  – CI-Deployment-Server in der DMZ
  – Staging in der private Cloud
  – Beta in Amazon-Cloud
  – Production bei Amazon




                              Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
DevOpsification of Mayflower (Software)




 lokaler GIT- / Gitorious-
 Server

 Eucalyptus-Cloud in der
 DMZ
 - im Self-Service!
                              Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I
DevOpsification of Mayflower (Future)




         Vagrant für das
           Development
        Scrum => KanBan
          Puppet Nagios


                              Unternehmensportrait   I   Mayflower GmbH   I   January 29, 2010   I

Más contenido relacionado

Similar a DevOps für PHP (und andere)

international PHP2011_J.Hartmann_DevOps für PHP
international PHP2011_J.Hartmann_DevOps für PHPinternational PHP2011_J.Hartmann_DevOps für PHP
international PHP2011_J.Hartmann_DevOps für PHPsmueller_sandsmedia
 
DevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigenDevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigenFotiosKaramitsos
 
Präsentation plug in development
Präsentation plug in developmentPräsentation plug in development
Präsentation plug in developmentxxtesaxx
 
Einfürung iPhone Entwicklung
Einfürung iPhone EntwicklungEinfürung iPhone Entwicklung
Einfürung iPhone EntwicklungStuff Mc
 
German: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit JavascriptGerman: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit JavascriptRalf Schwoebel
 
Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...
Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...
Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...E-Government
 
Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppetinovex GmbH
 
W-Jax 2015: QS-Maßnahmen bei Continuous Delivery
W-Jax 2015: QS-Maßnahmen bei Continuous DeliveryW-Jax 2015: QS-Maßnahmen bei Continuous Delivery
W-Jax 2015: QS-Maßnahmen bei Continuous DeliveryStephan Kaps
 
PHP Deployment mit Ansible
PHP Deployment mit AnsiblePHP Deployment mit Ansible
PHP Deployment mit AnsibleMichael Döhler
 
Docker for Python Development
Docker for Python DevelopmentDocker for Python Development
Docker for Python DevelopmentMartin Christen
 
Wie nutzen wir Cloud-Infrastruktur @ VSHN.ch
Wie nutzen wir Cloud-Infrastruktur @ VSHN.chWie nutzen wir Cloud-Infrastruktur @ VSHN.ch
Wie nutzen wir Cloud-Infrastruktur @ VSHN.chAarno Aukia
 
Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.Peter Hecker
 
Service oriented alerting
Service oriented alertingService oriented alerting
Service oriented alertinggeekQ
 
MOOC und OER - Warum, weshalb, wieso, wozu?
MOOC und OER - Warum, weshalb, wieso, wozu?MOOC und OER - Warum, weshalb, wieso, wozu?
MOOC und OER - Warum, weshalb, wieso, wozu?Martin Ebner
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbarFrank Müller
 
Cloud Native Computing
Cloud Native ComputingCloud Native Computing
Cloud Native ComputingAarno Aukia
 

Similar a DevOps für PHP (und andere) (20)

international PHP2011_J.Hartmann_DevOps für PHP
international PHP2011_J.Hartmann_DevOps für PHPinternational PHP2011_J.Hartmann_DevOps für PHP
international PHP2011_J.Hartmann_DevOps für PHP
 
CSS3 produktiv
CSS3 produktivCSS3 produktiv
CSS3 produktiv
 
DevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigenDevOps: Automatisieren, was wir predigen
DevOps: Automatisieren, was wir predigen
 
Präsentation plug in development
Präsentation plug in developmentPräsentation plug in development
Präsentation plug in development
 
Einfürung iPhone Entwicklung
Einfürung iPhone EntwicklungEinfürung iPhone Entwicklung
Einfürung iPhone Entwicklung
 
German: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit JavascriptGerman: Softwareprodukte aus einem Source Code mit Javascript
German: Softwareprodukte aus einem Source Code mit Javascript
 
Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...
Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...
Ein ansatz für die untersuchung von linkquellen einer webseite mithilfe von p...
 
Grundlagen puppet
Grundlagen puppetGrundlagen puppet
Grundlagen puppet
 
Forms 12c und der Oracle SB
Forms 12c und der Oracle SBForms 12c und der Oracle SB
Forms 12c und der Oracle SB
 
W-Jax 2015: QS-Maßnahmen bei Continuous Delivery
W-Jax 2015: QS-Maßnahmen bei Continuous DeliveryW-Jax 2015: QS-Maßnahmen bei Continuous Delivery
W-Jax 2015: QS-Maßnahmen bei Continuous Delivery
 
PHP Deployment mit Ansible
PHP Deployment mit AnsiblePHP Deployment mit Ansible
PHP Deployment mit Ansible
 
Docker for Python Development
Docker for Python DevelopmentDocker for Python Development
Docker for Python Development
 
Wie nutzen wir Cloud-Infrastruktur @ VSHN.ch
Wie nutzen wir Cloud-Infrastruktur @ VSHN.chWie nutzen wir Cloud-Infrastruktur @ VSHN.ch
Wie nutzen wir Cloud-Infrastruktur @ VSHN.ch
 
Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.
 
Service oriented alerting
Service oriented alertingService oriented alerting
Service oriented alerting
 
MOOCs & OER
MOOCs & OERMOOCs & OER
MOOCs & OER
 
MOOC und OER - Warum, weshalb, wieso, wozu?
MOOC und OER - Warum, weshalb, wieso, wozu?MOOC und OER - Warum, weshalb, wieso, wozu?
MOOC und OER - Warum, weshalb, wieso, wozu?
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbar
 
Cloud Native Computing
Cloud Native ComputingCloud Native Computing
Cloud Native Computing
 
XPages - The Basics
XPages - The BasicsXPages - The Basics
XPages - The Basics
 

Más de Mayflower GmbH

Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...Mayflower GmbH
 
JavaScript Days 2015: Security
JavaScript Days 2015: SecurityJavaScript Days 2015: Security
JavaScript Days 2015: SecurityMayflower GmbH
 
Vom Entwickler zur Führungskraft
Vom Entwickler zur FührungskraftVom Entwickler zur Führungskraft
Vom Entwickler zur FührungskraftMayflower GmbH
 
Salt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native ClientSalt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native ClientMayflower GmbH
 
Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingMayflower GmbH
 
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...Mayflower GmbH
 
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und AlloyNative Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und AlloyMayflower GmbH
 
Pair Programming Mythbusters
Pair Programming MythbustersPair Programming Mythbusters
Pair Programming MythbustersMayflower GmbH
 
Shoeism - Frau im Glück
Shoeism - Frau im GlückShoeism - Frau im Glück
Shoeism - Frau im GlückMayflower GmbH
 
Bessere Software schneller liefern
Bessere Software schneller liefernBessere Software schneller liefern
Bessere Software schneller liefernMayflower GmbH
 
Von 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 SprintsVon 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 SprintsMayflower GmbH
 
Piwik anpassen und skalieren
Piwik anpassen und skalierenPiwik anpassen und skalieren
Piwik anpassen und skalierenMayflower GmbH
 
Agilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce BreakfastAgilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce BreakfastMayflower GmbH
 

Más de Mayflower GmbH (20)

Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
Mit Maintenance umgehen können- Fixt du noch Bugs oder lieferst du schon neue...
 
Why and what is go
Why and what is goWhy and what is go
Why and what is go
 
Agile Anti-Patterns
Agile Anti-PatternsAgile Anti-Patterns
Agile Anti-Patterns
 
JavaScript Days 2015: Security
JavaScript Days 2015: SecurityJavaScript Days 2015: Security
JavaScript Days 2015: Security
 
Vom Entwickler zur Führungskraft
Vom Entwickler zur FührungskraftVom Entwickler zur Führungskraft
Vom Entwickler zur Führungskraft
 
Produktive teams
Produktive teamsProduktive teams
Produktive teams
 
Salt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native ClientSalt and pepper — native code in the browser Browser using Google native Client
Salt and pepper — native code in the browser Browser using Google native Client
 
Plugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debuggingPlugging holes — javascript memory leak debugging
Plugging holes — javascript memory leak debugging
 
Usability im web
Usability im webUsability im web
Usability im web
 
Rewrites überleben
Rewrites überlebenRewrites überleben
Rewrites überleben
 
JavaScript Security
JavaScript SecurityJavaScript Security
JavaScript Security
 
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
50 mal produktiver - oder warum ich gute Teams brauche und nicht gute Entwick...
 
Responsive Webdesign
Responsive WebdesignResponsive Webdesign
Responsive Webdesign
 
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und AlloyNative Cross-Platform-Apps mit Titanium Mobile und Alloy
Native Cross-Platform-Apps mit Titanium Mobile und Alloy
 
Pair Programming Mythbusters
Pair Programming MythbustersPair Programming Mythbusters
Pair Programming Mythbusters
 
Shoeism - Frau im Glück
Shoeism - Frau im GlückShoeism - Frau im Glück
Shoeism - Frau im Glück
 
Bessere Software schneller liefern
Bessere Software schneller liefernBessere Software schneller liefern
Bessere Software schneller liefern
 
Von 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 SprintsVon 0 auf 100 in 2 Sprints
Von 0 auf 100 in 2 Sprints
 
Piwik anpassen und skalieren
Piwik anpassen und skalierenPiwik anpassen und skalieren
Piwik anpassen und skalieren
 
Agilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce BreakfastAgilitaet im E-Commerce - E-Commerce Breakfast
Agilitaet im E-Commerce - E-Commerce Breakfast
 

DevOps für PHP (und andere)

  • 1. DevOps für PHP International PHP Conference Spring Edition 2011 © 2010 Mayflower GmbH
  • 2. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 2
  • 3. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 3
  • 4. 2007 Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 4
  • 5. http://www.flickr.com/photos/johnmueller/52621490/ Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 5
  • 6. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 6
  • 7. http://www.flickr.com/photos/johnmueller/52621490/ Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 7
  • 8. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 8
  • 9. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 9
  • 10. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 10
  • 11. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 11
  • 12. Nicht schnell. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 12
  • 13. Nicht schnell. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 13
  • 14. auch schnell. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 14
  • 15. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 15
  • 16. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 16
  • 17. Das bin ich. Johann-Peter Hartmann @johannhartmann hartmann@mayflower.de IRC: Freenode, EFNet johann__ Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 18. Und das auch. Johann-Peter Hartmann PHP Developer CTO of 65 developers Likes PHP, Agility, System Administration and Security Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 19. Wer seid Ihr? Developer? Sysadmin? Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 20. (Zeit schinden durch Publikumsfragen) Agile? Scrum? Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 21. (noch mehr Zeit schinden) Releases / Jahr? Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 22. (... ich muss mich beeilen) Cloud? Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 23. == Hardware = Software Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 23
  • 24. API Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 24
  • 25. Immer noch Hardware (nur woanders) Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 25
  • 26. 2009 Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 26
  • 27. Hardware = Software = Configuration Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 27
  • 28. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 28
  • 29. Dokumentationsgetrieben DomainSpecificLangu age Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 29
  • 30. PuppetMaster PuppetD Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 30
  • 31. Mach ma hin So Isset. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 31
  • 32. Facter Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 32
  • 33. class web { package {“httpd“: ensure => present } file {“/etc/httpd/conf/httpd.conf“: owner => root, group => root, mode => 664, source => puppet:///modules/apache/httpd.conf, require => Package[“httpd“], notify => Service[“httpd“] } service {“httpd“: ensure => running, enable => true, require => File[“/etc/httpd/conf/httpd.conf“] } } node “web01.mydomain.test“ { include web } Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 33
  • 34. Puppet-Modules • apache, nginx, varnish • php, ruby, tomcat • mysql, postgresql, memcache, ejabberd • heartbeat, dns (gibt eigentlich für fast alles etwas) Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 34
  • 35. Monitoring Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 35
  • 36. Quelle: http://www.puppetlabs.com/puppet/related-projects/dashboard/ Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 36
  • 37. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 37
  • 38. Vagra Ich weiss, wie meine Server aussehen. Das Development soll maximal ähnlich sein. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 38
  • 39. Vagrant VirtualBox-basierte automatische Erzeugung von VMs mit Puppet/Chef Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 39
  • 40. Vagrant Voll versioniert! On-Demand Erzeugung Developer-Self- Service Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 40
  • 41. $ gem install vagrant $ vagrant box add maverick64 http://mathie-vagrant- boxes.s3.amazonaws.com/maverick64.box $ mkdir maverick_demo $ cd maverick_demo $ vagrant init maverick64 $ vagrant up $ vagrant ssh vagrant@maverick64:~$ Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 41
  • 42. Vagrant-Cluster mit 20 Maschinen lokal? Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 42
  • 43. McCloud Wrapper around Vagrant and Fog Transparent local & cloud usage https://github.com/jedi4ever/ mccloud Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 43
  • 44. Und wenn ich 500 Maschinen will? Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 44
  • 45. mCollective ssh-for-loop on steroids fast management for loads of servers uses puppet/facter, MQ- based Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 45
  • 46. $ mc-package -W "architecture=x86" status apache * [ ============================================================> ] 10 / 10 host01.example.com version = apache-2.2.9-7 host02.example.com version = apache-2.2.9-7 host03.example.com version = apache-2.2.9-7 host04.example.com version = apache-2.2.9-7 host05.example.com version = apache-2.2.9-7 host06.example.com version = apache-2.2.9-7 host07.example.com version = apache-2.2.9-7 host08.example.com version = apache-2.2.9-7 host09.example.com version = apache-2.2.9-7 host10.example.com version = apache-2.2.9-7 ---- package agent summary ---- Nodes: 10 / 10 Versions: 10 * 0.25.5-1.el5 Elapsed Time: 1.03 s Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 46
  • 47. The most dangerous vegetable on earth! Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 47
  • 48. • eigentlich ein BDD-Tool • trotzdem Bestandteil in DevOps • und Bestandteil in Lean Startup • cucumber-nagios • cucumber-puppet Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 49. Feature: Manualsearch In order to find an article As an developer I want to use the search function Scenario: Search for bdd and check resulting page Given I go to "http://it-republik.de/php/" When I fill in "search_itr" with "bdd" And I click "search2" Then I should see "Suche" Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 49
  • 50. Given /^I go to "([^"]*)"$/ do |url| visit url end When /^I fill in "([^"]*)" with "([^"]*)"$/ do |field, value| fill_in field, :with => value end When /^I click "([^"]*)"$/ do |button| click_button(button) end Then /^I should see "([^"]*)"$/ do |text| response_body.should include(text) end Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 50
  • 51. johann$ cucumber Feature: Manualsearch In order to find an article As an developer I want to use the search function Scenario: Search for bdd and check resulting page # features/ search.feature:5 Given I go to "http://it-republik.de/php/" # features/ step_definitions/search_steps.rb:1 When I fill in "search_itr" with "bdd" # features/ step_definitions/search_steps.rb:5 And I click "search2" # features/ step_definitions/search_steps.rb:9 Then I should see "Suche" # features/ step_definitions/search_steps.rb:13 1 scenario (1 passed) 4 steps (4 passed) 0m1.615s Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 51
  • 52. Feature: Install inetd In order to serve the web the httpd service must be installed Scenario: Setup httpd Given a node of class “web“ When I compile the catalog Then package “httpd“ should be “installed“ Then there should be a resource “Service[httpd]“ And the service should have “enable“ set to “true“ And State should be “running“ And the service should require “Package[httpd]“ Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 52
  • 53. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 53
  • 54. Das verstehe sogar ich! Und ich bin seit 20 Jahren im Marketing! Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 54
  • 55. Unit Tests Acceptance Tests Metrics Coding Style ... you get the idea. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 55
  • 56. ... and even more ... Packaging Releasing Deployment Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 56
  • 57. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 57
  • 58. Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 58
  • 59. Wetware Refactoring Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 59
  • 60. Work together Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 60
  • 61. Own together Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 61
  • 62. Eat together http://www.flickr.com/photos/vilavelosa/ 3815032524/ - und dann? I Mayflower GmbH I 28. Oktober 2010 Kontinuierliche Entiwcklung I 62
  • 63. Plan together Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 63
  • 64. Mayflower DevOpsification Kontinuierliche Entiwcklung - und dann? I Mayflower GmbH I 28. Oktober 2010 I 64
  • 65. DevOpsification of Mayflower (Wetware) 1-2 Admins pro Team –Admin & Development- Aufgaben –Vollzeit dem Team zugeordnet Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 66. DevOpsification of Mayflower (Wetware) Enge Zusammenarbeit mit zentralem Admin Volle Root-Rechte auf Developer- Infrastruktur Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 67. DevOpsification of Mayflower (Software) 1+n Puppet-Master – zentraler Firmenmaster – Teammaster pro Team / Projekt – Firmenmaster ist Startpunkt der Teamkonfiguration Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 68. DevOpsification of Mayflower (Software) Beispiel-Setup: – lokale Developer-VM – CI-Deployment-Server in der DMZ – Staging in der private Cloud – Beta in Amazon-Cloud – Production bei Amazon Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 69. DevOpsification of Mayflower (Software) lokaler GIT- / Gitorious- Server Eucalyptus-Cloud in der DMZ - im Self-Service! Unternehmensportrait I Mayflower GmbH I January 29, 2010 I
  • 70. DevOpsification of Mayflower (Future) Vagrant für das Development Scrum => KanBan Puppet Nagios Unternehmensportrait I Mayflower GmbH I January 29, 2010 I

Notas del editor

  1. DevOps: \n- Organisationsgeprägt, Wall of Confusion \n- Test, Software und Deployment-geprägt (siehe Sebastian)\n- Kanban / Lean-Startup-Motiviert (habe ich dabei, mach ich aber nicht)\nFazit: Tools mit ein bischen Organisation\n
  2. Warnung: Leute mit empfindlichen Magen haben jetzt die Gelegenheit, den Raum zu verlassen.\n
  3. Meine Geschichte heute beginnt lange vor unserer Zeit. Eine Zeit, in der vieles grundlegend anders war, vieles überraschend und wenige Dinge so wie heute.\n
  4. Konkret geht es etwa um das Jahr 2007. \nJepp, unsere Branche ist da etwas schnelllebiger als die anderen.\nIn unserer Branche haben sich zwei Dinge geändert:\n
  5. Zum einen haben Consultants auf einmal damit angefangen, den ganzen Tag von Wolken zu reden.\n
  6. Zum anderen mussten einige Dinge auf einmal schnell gehen.\n
  7. Die Cloud war erst mal ein typisches IT-Ding. \nWir haben eine Lösung, die ist echt super. \nWir haben bloss kein Problem dafür. \n
  8. Das hat auch den Consultants, die so begeistert von der Cloud erzählt haben, ein Problem gebracht.\n
  9. \n
  10. Nach einer Weile gab es dann auch einen ganzen Haufen Cloudplattformen, die unserer Web-Applikationen unterstützt haben - IaaS per se, manche PaaS explizit und spezialisiert - nur wir wussten nicht, was wir damit machen sollten.\n
  11. Kommen wir zum Thema Geschwindigkeit: \nDinge, die auf einmal schnell gehen müssen. Und damit ist nicht Responsivität oder Request per Minute gemeint, sondern wie schnell die Unternehmen ticken.\n
  12. Die Jungs sind zum Beispiel nicht so schnell\n
  13. Die wiederum sind schnell. Facebook kann Features in wenigen Tagen durchbringen. Es gibt Dinge wie Code von neuen Kollegen, der nach 2 Tagen in Produktion ist. Auf ein paar 100.000 Servern.\n
  14. Die sind auch schnell. Und die sind nicht nur schnell in Features wie Facebook, sondern auch schnell in wachsen.\n
  15. Scalarium: DevOps-Firma, die genau das für Kunden macht.\n
  16. Wie die das machen, erzähl ich hier heute.\n
  17. \n
  18. \n
  19. \n
  20. Wer von euch arbeitet agil? \nWer von macht SCRUM? \n\n
  21. Wenn Ihr agil seid, wieviele Releases kommen da pro Jahr raus? Wenn es viele sind, wieviele Releases haben Bugs? Welche manuellen Tests werden vor der Produktivnahme gefahren? \n
  22. Wie lange braucht Ihr, um von einer Idee in Produktion zu kommen? \n\n
  23. Hinter der Cloud steht die Idee - speziell bei IaaS - Hardware wie Software zu behandeln.\n
  24. Und zwar ganz konkret. Bei Amazon habe ich genau ein WebFrontend oder eine API. Ob die Server dann auf einem Mainframe emuliere, auf Marsbakterien oder per Hand von sehr schnellen Indern ausrechnen lassen weiss ich nicht.\n
  25. In der Praxis wurde es trotzdem weiter wie Hardware behandelt. Eine Virtualisierung, die nicht bei uns im Keller, sondern eben woanders steht. Nach Maschine abgerechnet und individuell per SSH gepflegt.\n
  26. In 2009, nach also 2 Jahren nachdenken, kamen ein paar clevere Admins zu dem Schluss, dass das vielleicht nicht die richtige Strategie ist. \n
  27. Und da sind sie rausgekommen: Wenn meine Hardware wie Software ist, dann kann ich die auch Automatisieren. Konkret: ich schreibe auf, was ich eigentlich haben will, und dann macht die Automatisierung, dass ich genau das bekomme.\n
  28. Neben Puppet gibt es noch Chef. Ist genauso gut, etwas flexibler, ich kann es nur nicht. Die Prinzipien sind aber die gleichen.\n
  29. Puppet ist eine DSL für Systembeschreibungen. Das beginnt mit der IP-Adresse bishin zur Konfiguration der Software. \n\n
  30. Puppet besteht aus zwei Kernkomponenten - einem Puppetmaster, der als Server irgendwo in der Mitte steht - und einem lokalen PuppetD, der zB alle 30 minuten die Konfiguration anpasst.\n
  31. Puppet sagt an. Der Status wird definiert, und der Puppetd macht, dass der Rechner den dann hat. Egal wie es vorher aussah.\n
  32. Wie macht er das? Über Facter wird der aktuelle Status - Versionen, laufen Services, sind die benötigten Files da - gegen das Puppet-Manifest geprüft. Wenn irgendetwas nicht stimmt, weiss PuppetD aus dem Manifest, wie er es zu machen hat.\n
  33. Und so sieht so eine Beschreibung konkret aus. Wie man sieht: das ist gar nicht so ruby, das tut gar nicht weh.\n\n
  34. \n
  35. Wenn ich eh schon weiss, wie es aussehen soll, und mit facter prüfe, ob das wirklich so aussieht, kann ich ja auch zentral wissen, ob alles ok ist.\n
  36. Das ist das Puppetlabs-Dashboard. Das zeigt mir in diversen Ansichten, wie die kritischen Dienste auf meinen Servern aussehen.\n
  37. Über puppet-Nagios kann ich das ganze sogar in mein vorhandenes Monitoring einbinden.\n
  38. Wenn ich eh alles in Code habe, und weiss, wie meine Server aussehen sollen. Und wenn mein Development genauso aussehen soll wie die Produktion - mit abstrichen - dann kann ich doch einfach die Konfiguration übernehmen?\n
  39. Damit lassen sich VMs automatisch erzeugen. Virtualbox = läuft überall & OpenSource.\nDas ist geil weil ... \n
  40. - jeder Developer kann on Demand welche bekommen\n- das setup das er gerade braucht in Multi-VM-Environments\n- Admin braucht nicht aktiv zu werden. Keine 8 Wochen bis der neue Testrechner bestellt ist :-)\n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. architecture=x86 ist facter-wissen als filter. das geht auch über klassen, services, speichergröße, cloud-zone etc.\n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. Danke an Jimdo für das Beispiel.. \n
  54. \n
  55. Wer setzt Jenkins ein? (sonst erklären)\n
  56. \n
  57. Sebastian wird hierüber noch mehr erzählen. \n
  58. \n
  59. \n
  60. - gemeinsame Standups\n- gegenseitige Teilnahme an den Sprint Plannings & Retros\n- gleiche Räume, wenn möglich\n
  61. Der Code gehört auch den Admins, die Konfiguration und die Verlässlichkeit auch den Developern.\n
  62. Wie bekommt man Respekt hin?\n- Soziale Interaktion, Feiern, Teambuilding\nWenn ich jemand persönliche kenne nehme ich auf seine Interessen Rücksicht\n
  63. Die langfristige Planung wird gemeinsam gemacht. Es werden gemeinsame Ziele definiert, und die Lösungsstrategien gemeinsam erstellt.\n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n