Your SlideShare is downloading. ×
@csanchez            Apache                      Maven ASF                    EclipseMember                Foundation     ...
How we got here
Agile         planning  iterative development  continuous integrationrelease soon, release often
Fear of change    Risky deployments It works on my machine!        SiloisationDev Change vs. Ops stability
Individuals and interactions over processes and toolsWorking software over comprehensive documentation  Customer collabora...
OPs requirementsOperating Systemconfig filespackages installedmulti stage configurationsdevQApre-productionproduction
DeploymentHow do I deploy this?documentationmanual stepsprone to errors
CloudHow do I deploy this?to hundreds of servers
DevOps
DevQaOps ?
DEV   QA   OPS
QADEV        OPS
SpecsPackages   DEV   PRODVersions
TestabilityDEV   QA
MetricsLogs       DEV   PRODSecurityupdates
is not aboutthe toolsbuthow can Iimplement IT
Tools canenable changein behaviorand eventuallychangeculturePatrick Debois
everyone isintelligentenoughevery tool iscloud enabledevery tool is DevOps(tm)
3 key concepts
ContinuousDelivery
Continuousdelivery
Infrastructureas Codeit’s all been invented,now it’s standardized
manifestsruby-likeERB templates                exec { "maven-untar":                  command => "tar xf /tmp/x.tgz",     ...
package { openssh-server:                   ensure => present,                 }infrastructureIS code
service { ntp:  name      => ntpd,  ensure    => running,}                      declarative model                      sta...
Followdevelopment             newbest                  solutionspracticestaggingbranching                         newrelea...
Self servicing
Infrastructurealwaysavailablevirtualization & cloudempower developersreduce time-to-market
devs buy-inWith great powercomes greatresponsibility
Vagrantempower developersdev-ops collaborationautomation
Vagrant
Vagrant     Oracle VirtualBox cmdline automation      Easy Puppet and Chef provisioning  Keep VM configuration for different...
Vagrant base boxes  www.vagrantbox.esanywhere! just (big) files
using Vagrant$ gem install vagrant$ vagrant box add centos-6.0-x86_64       http://dl.dropbox.com/u/1627760/centos-6.0-x86...
VagrantVagrant::Config.run do |config|  # Every Vagrant virtual environment requires a box to build off of.  config.vm.box...
manifests/base.pppackage { jdk:  ensure => installed,  name    => $operatingsystem ? {     centOS => "java-1.6.0-openjdk-d...
Maven and Puppet
What am I doing to automate deployment             Ant tasks plugin              ssh commands             Assembly plugin ...
What can I do to automate deployment  Handle full deployment including infrastructure           not just webapp deployment...
Maven-Puppet module          A Maven Puppet modulehttps://github.com/maestrodev/puppet-maven    fetches Maven artifacts fr...
Installing Maven$repo1 = {  id => "myrepo",  username => "myuser",  password => "mypassword",  url => "http://repo.acme.co...
New Maven typemaven { "/tmp/maven-core-2.2.1.jar":  id => "org.apache.maven:maven-core:jar:2.2.1",  repos => ["http://repo...
New Maven typemaven { "/tmp/maven-core-2.2.1.jar":  groupId => "org.apache.maven",  artifactId => "maven-core",  version =...
Examples
Infrastructure                 QA           www            httpd, tomcat,    httpd               postgresJenkins          ...
Tomcat cluster + postgres      postgres database          db.acme.com       tomcat servers        tomcat1.acme.com        ...
Puppet Modules required                     bundle install && librarian-puppet installmod puppetlabs/java, 0.1.6mod puppet...
mymodules/acme/manifests/db_node.ppclass acme::db_node {    class { "postgresql::server" :      config_hash => {         p...
mymodules/acme/manifests/tomcat_node.pp  class acme::tomcat_node($db_host = db.local) {      class { "java":        distri...
manifests/site.ppimport nodes/*.ppnode ‘parent’ {  class {epel: } ->    class {avahi:      firewall => true,    }}
manifests/nodes/tomcat.pp# tomcat1.acme.com, tomcat2.acme.com,tomcat3.acme.com,...node /tomcatd..*/ inherits ‘parent’ {  f...
manifests/nodes/qa.ppnode /qa..*/ inherits ‘parent’ {  class {acme::db_node: }     class {acme::tomcat_node:       db_host...
spec/hosts/db_spec.pprequire rspec-puppetdescribe db.acme.com do  let(:facts) { {    :osfamily => RedHat,    :operatingsys...
spec/hosts/www_spec.pprequire rspec-puppetdescribe www.acme.com do  let(:facts) { {    :osfamily => RedHat,    :operatings...
Example code and slides          Available at http://slideshare.csanchez.org  http://github.csanchez.org   http://blog.csa...
Thanks!http://csanchez.orghttp://maestrodev.comcsanchez@maestrodev.comcarlos@apache.org@csanchez
Photo Credits                Brick wall - Luis Argerich  http://www.flickr.com/photos/lrargerich/4353397797/       Agile vs...
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013
Upcoming SlideShare
Loading in...5
×

Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013

12,380

Published on

Continuous Integration, with Apache Continuum or Jenkins, can be extended to fully manage deployments and production environments, running in Tomcat for instance, in a full Continuous Delivery cycle using infrastructure-as-code tools like Puppet, allowing to manage multiple servers and their configurations.

Puppet is an infrastructure-as-code tool that allows easy and automated provisioning of servers, defining the packages, configuration, services,... in code. Enabling DevOps culture, tools like Puppet help drive Agile development all the way to operations and systems administration, and along with continuous integration tools like Apache Continuum or Jenkins, it is a key piece to accomplish repeatability and continuous delivery, automating the operations side during development, QA or production, and enabling testing of systems configuration.

Traditionally a field for system administrators, Puppet can empower developers, allowing both to collaborate coding the infrastructure needed for their developments, whether it runs in hardware, virtual machines or cloud. Developers and sysadmins can define what JDK version must be installed, application server, version, configuration files, war and jar files,... and easily make changes that propagate across all nodes.

Using Vagrant, a command line automation layer for VirtualBox, they can also spin off virtual machines in their local box, easily from scratch with the same configuration as production servers, do development or testing and tear them down afterwards.

We will show how to install and manage Puppet nodes with JDK, multiple Tomcat instances with installed web applications, database, configuration files and all the supporting services. Including getting up and running with Vagrant and VirtualBox for quickstart and Puppet experiments, as well as setting up automated testing of the Puppet code.

Published in: Technology
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
12,380
On Slideshare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
0
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide

Transcript of "Continuous Delivery with Maven, Puppet and Tomcat - ApacheCon NA 2013"

  1. 1. Continuous Deliverywith Maven, Puppetand TomcatCarlos Sanchez@csanchezhttp://csanchez.orghttp://maestrodev.com
  2. 2. @csanchez Apache Maven ASF EclipseMember Foundation csanchez.org maestrodev.com
  3. 3. How we got here
  4. 4. Agile planning iterative development continuous integrationrelease soon, release often
  5. 5. Fear of change Risky deployments It works on my machine! SiloisationDev Change vs. Ops stability
  6. 6. Individuals and interactions over processes and toolsWorking software over comprehensive documentation Customer collaboration over contract negotiation Responding to change over following a plan
  7. 7. OPs requirementsOperating Systemconfig filespackages installedmulti stage configurationsdevQApre-productionproduction
  8. 8. DeploymentHow do I deploy this?documentationmanual stepsprone to errors
  9. 9. CloudHow do I deploy this?to hundreds of servers
  10. 10. DevOps
  11. 11. DevQaOps ?
  12. 12. DEV QA OPS
  13. 13. QADEV OPS
  14. 14. SpecsPackages DEV PRODVersions
  15. 15. TestabilityDEV QA
  16. 16. MetricsLogs DEV PRODSecurityupdates
  17. 17. is not aboutthe toolsbuthow can Iimplement IT
  18. 18. Tools canenable changein behaviorand eventuallychangeculturePatrick Debois
  19. 19. everyone isintelligentenoughevery tool iscloud enabledevery tool is DevOps(tm)
  20. 20. 3 key concepts
  21. 21. ContinuousDelivery
  22. 22. Continuousdelivery
  23. 23. Infrastructureas Codeit’s all been invented,now it’s standardized
  24. 24. manifestsruby-likeERB templates exec { "maven-untar": command => "tar xf /tmp/x.tgz", cwd => "/opt", creates => "/opt/apache-maven-${version}", path => ["/bin"], } -> file { "/usr/bin/mvn": ensure => link, target => "/opt/apache-maven-${version}/bin/mvn", } file { "/usr/local/bin/mvn": ensure => absent, require => Exec["maven-untar"], } file { "$home/.mavenrc": mode => "0600", owner => $user, content => template("maven/mavenrc.erb"), require => User[$user], }
  25. 25. package { openssh-server: ensure => present, }infrastructureIS code
  26. 26. service { ntp: name => ntpd, ensure => running,} declarative model state vs process no scripting
  27. 27. Followdevelopment newbest solutionspracticestaggingbranching newreleasing challengesdev, QA, production
  28. 28. Self servicing
  29. 29. Infrastructurealwaysavailablevirtualization & cloudempower developersreduce time-to-market
  30. 30. devs buy-inWith great powercomes greatresponsibility
  31. 31. Vagrantempower developersdev-ops collaborationautomation
  32. 32. Vagrant
  33. 33. Vagrant Oracle VirtualBox cmdline automation Easy Puppet and Chef provisioning Keep VM configuration for different projectsShare boxes and configuration files across teams base box + configuration files
  34. 34. Vagrant base boxes www.vagrantbox.esanywhere! just (big) files
  35. 35. using Vagrant$ gem install vagrant$ vagrant box add centos-6.0-x86_64 http://dl.dropbox.com/u/1627760/centos-6.0-x86_64.box$ vagrant init myproject$ vagrant up$ vagrant ssh$ vagrant suspend$ vagrant resume$ vagrant destroy
  36. 36. VagrantVagrant::Config.run do |config| # Every Vagrant virtual environment requires a box to build off of. config.vm.box = "centos-6.0-x86_64" # The url from where the config.vm.box box will be fetched config.vm.box_url = "http://dl.dropbox.com/u/1627760/centos-6.0-x86_64.box" # Boot with a GUI so you can see the screen. (Default is headless) #config.vm.boot_mode = :gui # Assign this VM to a host only network IP, allowing you to access it via the IP. # config.vm.network "33.33.33.10" # Forward a port from the guest to the host, which allows for outside # computers to access the VM, whereas host only networking does not. config.vm.forward_port "sonar", 9000, 19000 # Enable provisioning with Puppet stand alone. config.vm.share_folder("templates", "/tmp/vagrant-puppet/templates", "templates") config.vm.provision :puppet do |puppet| puppet.manifest_file = "base.pp" puppet.module_path = "mymodules" puppet.options = ["--templatedir","/tmp/vagrant-puppet/templates"] puppet.options = "-v -d" endend
  37. 37. manifests/base.pppackage { jdk: ensure => installed, name => $operatingsystem ? { centOS => "java-1.6.0-openjdk-devel", Ubuntu => "openjdk-6-jdk", default => "jdk", },}
  38. 38. Maven and Puppet
  39. 39. What am I doing to automate deployment Ant tasks plugin ssh commands Assembly plugin Cargo Capistrano
  40. 40. What can I do to automate deployment Handle full deployment including infrastructure not just webapp deployment Help Ops with clear, automated manifests Ability to reproduce production environments in local box using Vagrant / VirtualBox / VMWare Use the right tool for the right job
  41. 41. Maven-Puppet module A Maven Puppet modulehttps://github.com/maestrodev/puppet-maven fetches Maven artifacts from the repo manages them with Puppet no more extra packaging
  42. 42. Installing Maven$repo1 = { id => "myrepo", username => "myuser", password => "mypassword", url => "http://repo.acme.com",}# Install Mavenclass { "maven::maven": version => "2.2.1",} -># Create a settings.xml with the repo credentialsclass { "maven::settings" : servers => [$repo1],}
  43. 43. New Maven typemaven { "/tmp/maven-core-2.2.1.jar": id => "org.apache.maven:maven-core:jar:2.2.1", repos => ["http://repo1.maven.apache.org/maven2", "http://mirrors.ibiblio.org/pub/mirrors/maven2"],}
  44. 44. New Maven typemaven { "/tmp/maven-core-2.2.1.jar": groupId => "org.apache.maven", artifactId => "maven-core", version => "2.2.1", packaging => "jar", repos => ["http://repo1.maven.apache.org/maven2", "http://mirrors.ibiblio.org/pub/mirrors/maven2"],}
  45. 45. Examples
  46. 46. Infrastructure QA www httpd, tomcat, httpd postgresJenkins tomcat1 tomcatArchiva db postgres
  47. 47. Tomcat cluster + postgres postgres database db.acme.com tomcat servers tomcat1.acme.com tomcat2.acme.com ... httpd www.acme.com
  48. 48. Puppet Modules required bundle install && librarian-puppet installmod puppetlabs/java, 0.1.6mod puppetlabs/apache, 0.4.0mod inkling/postgresql, 0.2.0mod puppetlabs/firewall, 0.0.4mod tomcat, :git => https://github.com/carlossg/puppet-tomcat.git, :ref => centosmod maestrodev/maven, 1.xmod stahnma/epel, 0.0.2mod maestrodev/avahi, 1.xmod acme, :path => mymodules/acme
  49. 49. mymodules/acme/manifests/db_node.ppclass acme::db_node { class { "postgresql::server" : config_hash => { postgres_password => postgres } } -> postgresql::db{ "appfuse": user => "appfuse", password => "appfuse", grant => "all", }}
  50. 50. mymodules/acme/manifests/tomcat_node.pp class acme::tomcat_node($db_host = db.local) { class { "java": distribution => "java-1.6.0-openjdk" } class { tomcat: } -> tomcat::instance {appfuse: } -> class { maven::maven: } -> maven { "/srv/tomcat/appfuse/webapps/ROOT.war": id => "org.appfuse:appfuse-spring:2.2.1:war", } }
  51. 51. manifests/site.ppimport nodes/*.ppnode ‘parent’ { class {epel: } -> class {avahi: firewall => true, }}
  52. 52. manifests/nodes/tomcat.pp# tomcat1.acme.com, tomcat2.acme.com,tomcat3.acme.com,...node /tomcatd..*/ inherits ‘parent’ { file {/etc/motd: content => ”tomcat server: ${::hostname}n”, } class {acme::tomcat_node}}
  53. 53. manifests/nodes/qa.ppnode /qa..*/ inherits ‘parent’ { class {acme::db_node: } class {acme::tomcat_node: db_host => localhost, } class {acme::www_node: tomcat_host => localhost, }}
  54. 54. spec/hosts/db_spec.pprequire rspec-puppetdescribe db.acme.com do let(:facts) { { :osfamily => RedHat, :operatingsystem => CentOS, :operatingsystemrelease => ‘6.3’} } it { should contain_class(postgresql::server) }end
  55. 55. spec/hosts/www_spec.pprequire rspec-puppetdescribe www.acme.com do let(:facts) { { :osfamily => RedHat, :operatingsystem => CentOS, :operatingsystemrelease => ‘6.3’} } it { should contain_package(httpd) }end
  56. 56. Example code and slides Available at http://slideshare.csanchez.org http://github.csanchez.org http://blog.csanchez.org
  57. 57. Thanks!http://csanchez.orghttp://maestrodev.comcsanchez@maestrodev.comcarlos@apache.org@csanchez
  58. 58. Photo Credits Brick wall - Luis Argerich http://www.flickr.com/photos/lrargerich/4353397797/ Agile vs. Iterative flow - Christopher Littlehttp://en.wikipedia.org/wiki/File:Agile-vs-iterative-flow.jpg DevOps - Rajiv.Pant http://en.wikipedia.org/wiki/File:Devops.png Pimientos de Padron - Howard Walfish http://www.flickr.com/photos/h-bomb/4868400647/ Compiling - XKCD http://xkcd.com/303/ Printer in 1568 - Meggs, Philip B http://en.wikipedia.org/wiki/File:Printer_in_1568-ce.png Relativity - M. C. Escherhttp://en.wikipedia.org/wiki/File:Escher%27s_Relativity.jpg Teacher and class - Herald Post http://www.flickr.com/photos/heraldpost/5169295832/

×