Download - From Dev to DevOps
![Page 1: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/1.jpg)
From Dev to DevOps
Carlos SanchezMaestroDev
![Page 2: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/2.jpg)
Hola!
Solutions Architect at MaestroDevMember of Apache Software Foundation Maven PMC, Continuum, ArchivaEclipse IAM co-leadetc...
![Page 3: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/3.jpg)
Dev... What?
![Page 4: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/4.jpg)
Agile
planningiterative developmentcontinuous integration
release soon, release often
![Page 5: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/5.jpg)
![Page 6: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/6.jpg)
![Page 7: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/7.jpg)
![Page 8: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/8.jpg)
![Page 9: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/9.jpg)
DevQaOps ?
![Page 10: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/10.jpg)
![Page 11: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/11.jpg)
DevOps addresses
Fear of changeRisky deployments
It works on my machine!Siloisation
Dev Change vs. Ops stability
![Page 12: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/12.jpg)
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan
![Page 13: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/13.jpg)
Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.
Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive
advantage.Deliver working software frequently, from a couple of weeks
to a couple of months, with a preference to the shorter timescale.Business people and developers must work together daily
throughout the project.The most efficient and effective method of conveying information
to and within a development team is face-to-face conversation.
Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain
a constant pace indefinitely.
![Page 14: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/14.jpg)
The Tragedy of the Commons
![Page 15: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/15.jpg)
Dev
![Page 16: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/16.jpg)
![Page 17: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/17.jpg)
![Page 18: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/18.jpg)
![Page 19: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/19.jpg)
![Page 20: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/20.jpg)
![Page 21: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/21.jpg)
![Page 22: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/22.jpg)
![Page 23: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/23.jpg)
What developers do today to specify target environments is
NOT enough
![Page 24: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/24.jpg)
![Page 25: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/25.jpg)
Ops
![Page 26: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/26.jpg)
requirements
Operating Systemconfig files
packages installedmulti stage configurations
devQA
pre-productionproduction
![Page 27: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/27.jpg)
Deployment
How do I deploy this?documentationmanual stepsprone to errors
![Page 28: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/28.jpg)
Cloud
How do I deploy this?to hundreds of servers
![Page 29: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/29.jpg)
Infrastructure as Code
Follow development best practicestagging
branchingreleasing
dev, QA, production
![Page 30: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/30.jpg)
![Page 31: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/31.jpg)
DevOps
![Page 32: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/32.jpg)
Should I worry about my OPS job?
![Page 33: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/33.jpg)
![Page 34: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/34.jpg)
yes
![Page 35: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/35.jpg)
yesmy job is to make other
people’s jobs unnecessary
![Page 36: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/36.jpg)
yes
![Page 37: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/37.jpg)
yes
![Page 38: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/38.jpg)
yes no
![Page 39: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/39.jpg)
yesyou should see the NOOPS
guys
no
![Page 40: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/40.jpg)
DevOps is NOT about the tools
![Page 41: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/41.jpg)
Nice, BUT
how can I implement IT
![Page 42: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/42.jpg)
Nice, BUT
how can I implement IT
![Page 43: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/43.jpg)
Tools can enable change in behavior
and eventually change culture
Patrick Debois
![Page 44: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/44.jpg)
Man is the only animal that changes environment instead of
adapting
![Page 45: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/45.jpg)
Man is the only animal that changes environment instead of
adapting
(using tools)
![Page 46: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/46.jpg)
DevOps tools
everyone thinks is intelligent enoughevery tool thinks it’s cloud enabledevery tool thinks it’s DevOps
![Page 47: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/47.jpg)
DevOps tools
everyone thinks is intelligent enoughevery tool thinks it’s cloud enabledevery tool thinks it’s DevOps
![Page 48: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/48.jpg)
DevOps tools: infrastructure automation
infrastructure as codeit’s all invented, now it’s standardized
![Page 49: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/49.jpg)
![Page 50: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/50.jpg)
Puppet
infrastructure IS codedeclarative model
state vs process - no scriptingmanifests
rubyERB templates
master - agent architecture
![Page 51: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/51.jpg)
Puppet file structure
/etc/puppetmanifests/site.pp
manifests/nodes.pp
![Page 52: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/52.jpg)
Puppet example
user { 'dave': ensure => present, uid => '507', gid => 'admin', shell => '/bin/zsh', home => '/home/dave', managehome => true,}file {'/tmp/test1': ensure => present, content => "Hi.",}
![Page 53: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/53.jpg)
Vagrant
![Page 54: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/54.jpg)
Vagrant
Oracle VirtualBox cmdline automationEasy Puppet and Chef provisioning
Keep VM configuration for different projectsShare boxes and configuration files across teams
base box + configuration files
![Page 55: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/55.jpg)
Vagrant
Oracle VirtualBox cmdline automationEasy Puppet and Chef provisioning
Keep VM configuration for different projectsShare boxes and configuration files across teams
base box + configuration files
![Page 56: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/56.jpg)
Vagrant base boxes
www.vagrantbox.es
anywhere! just (big) files
![Page 57: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/57.jpg)
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
![Page 58: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/58.jpg)
Vagrant::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" end
end
Vagrant
![Page 59: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/59.jpg)
manifests/base.pp
package { jdk: ensure => installed, name => $operatingsystem ? { centOS => "java-1.6.0-openjdk-devel", Ubuntu => "openjdk-6-jdk", default => "jdk", },}
![Page 60: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/60.jpg)
VeeWee
![Page 61: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/61.jpg)
VeeWee
easily build Vagrant base boxeshttps://github.com/jedi4ever/veewee
![Page 62: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/62.jpg)
using VeeWee
$ gem install veewee$ vagrant basebox templates$ vagrant basebox define 'my-ubuntu-server' 'ubuntu-11.04-server-amd64'# customize definitions/my-ubuntu-server$ vagrant basebox build 'my-ubuntu-server'$ vagrant basebox validate 'my-ubuntu-server'$ vagrant basebox export 'my-ubuntu-server'$ vagrant box add 'my-ubuntu-server' 'my-ubuntu-server.box'$ vagrant init 'my-ubuntu-server'
![Page 63: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/63.jpg)
Geppetto
![Page 64: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/64.jpg)
http://cloudsmith.github.com/geppetto
![Page 65: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/65.jpg)
Puppet DSL
![Page 66: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/66.jpg)
Puppet resources
user { 'dave': ensure => present, uid => '507', gid => 'admin', shell => '/bin/zsh', home => '/home/dave', managehome => true,}
![Page 67: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/67.jpg)
Puppet resources
$ puppet resource user root
user { 'root': home => '/var/root', shell => '/bin/sh', uid => '0', ensure => 'present', password => '*', gid => '0', comment => 'System Administrator'}
![Page 68: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/68.jpg)
Puppet resources
$ puppet resource user dave ensure=present shell="/bin/zsh" home="/home/dave" managehome=true
notice: /User[dave]/ensure: created
user { 'dave': ensure => 'present', home => '/home/dave', shell => '/bin/zsh'}
![Page 69: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/69.jpg)
Puppet resources
file {'testfile': path => '/tmp/testfile', ensure => present, mode => 0640, content => "I'm a test file.",}notify {"I'm notifying you.":}
![Page 70: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/70.jpg)
Puppet standalone
$ puppet apply my_test_manifest.pp
![Page 71: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/71.jpg)
ordering
file {'/tmp/test1': ensure => present, content => "Hi.",}
notify {'/tmp/test1 has already been synced.': require => File['/tmp/test1'],}
![Page 72: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/72.jpg)
ordering
file {'/tmp/test1': ensure => present, content => "Hi.",} ->
notify {'/tmp/test1 has already been synced.':}
![Page 73: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/73.jpg)
package / file /service / subscribe
package { 'openssh-server': ensure => present, before => File['/etc/ssh/sshd_config'],}
file { '/etc/ssh/sshd_config': ensure => file, mode => 600, source => '/root/learning-manifests/sshd_config',}
service { 'sshd': ensure => running, enable => true, hasrestart => true, hasstatus => true, subscribe => File['/etc/ssh/sshd_config'],}
![Page 74: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/74.jpg)
variables
$longthing = "Imagine I have something really long in here. Like an SSH key, let's say."
file {'authorized_keys': path => '/root/.ssh/authorized_keys', content => $longthing,}
![Page 75: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/75.jpg)
facts
host {'self': ensure => present, name => $::fqdn, host_aliases => ['puppet', $::hostname], ip => $::ipaddress,}
file {'motd': ensure => file, path => '/etc/motd', mode => 0644, content => "Welcome to ${::hostname},\na ${::operatingsystem} island in the sea of ${::domain}.\n",}
![Page 76: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/76.jpg)
conditionals
if $is_virtual { service {'ntpd': ensure => stopped, enable => false, }}else { service { 'ntpd': name => 'ntpd', ensure => running, enable => true, hasrestart => true, require => Package['ntp'], }}
![Page 77: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/77.jpg)
conditionals
case $operatingsystem { centos, redhat: { $apache = "httpd" } debian, ubuntu: { $apache = "apache2" } default: { fail("Unrecognized operating system for webserver") }}
$apache = $operatingsystem ? { centos => 'httpd', redhat => 'httpd', /(?i)(ubuntu|debian)/ => "apache2-$1", # (Don't actually use that package name.) default => undef, }
![Page 78: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/78.jpg)
class definition
class ntp {
package { 'ntp': ensure => installed, } service { 'ntp': name => 'ntpd', ensure => running, enable => true, subscribe => File['ntp.conf'], }}
![Page 79: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/79.jpg)
class declaration (1)
class {'ntp': }
![Page 80: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/80.jpg)
class declaration (2)
include ntp
![Page 81: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/81.jpg)
parameterized classes
class paramclassexample ($value1, $value2 = "Default value") { notify {"Value 1 is ${value1}.":} notify {"Value 2 is ${value2}.":}}
class {'paramclassexample': value1 => 'Something', value2 => 'Something else',}
class {'paramclassexample': value1 => 'Something',}
![Page 82: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/82.jpg)
modules
{module}/
files/ lib/ manifests/ init.pp {class}.pp {defined type}.pp {namespace}/ {class}.pp {class}.pp templates/ tests/
![Page 83: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/83.jpg)
templating
file {'/etc/foo.conf': ensure => file, require => Package['foo'], content => template('foo/foo.conf.erb'),}
![Page 84: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/84.jpg)
templates/foo.conf.erb
OS is <%= $::operatingsystem %>
![Page 85: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/85.jpg)
node configuration
# nodes.pp
node 'someserver.domain.com' inherits basenode { $web_fqdn = 'www.domain.com' include genericwebserver include some_other_service}
node 'ldapmaster.domain.com' inherits basenode { include s_ldap::master}
node 'humanresources.domain.com' inherits basenode { include c_humanresources}
![Page 86: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/86.jpg)
Maven and Puppet
![Page 87: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/87.jpg)
What am I doing to automate deployment
Ant tasks pluginssh commands
Assembly pluginCargo
![Page 88: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/88.jpg)
What can I do to automate deployment
Handle full deployment including infrastructurenot just webapp deployment
Help Ops with clear, automated manifestsAbility to reproduce production environmentsin local box using Vagrant / VirtualBox / VMWare
![Page 89: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/89.jpg)
Maven-Puppet module
A Maven Puppet module
https://github.com/maestrodev/puppet-maven
fetches Maven artifacts from the repomanages them with Puppetno more extra packaging
![Page 90: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/90.jpg)
Requirements
Java JDKApache Buildr
preinstalled in the boxchicken and egg problem
![Page 91: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/91.jpg)
New Maven type
maven { "/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"],}
![Page 92: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/92.jpg)
New Maven type
maven { "/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"],}
![Page 93: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/93.jpg)
Example code
Available athttp://github.carlossanchez.euhttp://blog.carlossanchez.eu
https://github.com/maestrodev/puppet-modules
![Page 94: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/94.jpg)
Questions?
![Page 96: From Dev to DevOps](https://reader034.vdocuments.us/reader034/viewer/2022052618/554a32eab4c90542548b5702/html5/thumbnails/96.jpg)
Photo Credits
Son of Man Lego - Alex Eylarhttp://www.flickr.com/photos/hoyvinmayvin/4702772452/
Brick wall - Luis Argerichhttp://www.flickr.com/photos/lrargerich/4353397797/
Agile vs. Iterative flow - Christopher Littlehttp://en.wikipedia.org/wiki/File:Agile-vs-iterative-flow.jpg
DevOps - Rajiv.Panthttp://en.wikipedia.org/wiki/File:Devops.png
Pimientos de Padron - Howard Walfishhttp://www.flickr.com/photos/h-bomb/4868400647/
Printer in 1568 - Meggs, Philip Bhttp://en.wikipedia.org/wiki/File:Printer_in_1568-ce.png