SlideShare a Scribd company logo
1 of 37
Download to read offline
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
INFRASTRUCTURE AASS SSOOFFTTWWAARREE 
Dustin J. Mitchell 
dustin@mozilla.com 
Sept 24, 2014 
1 of 37 09/24/2014 03:32 PM
Infrastructure as Software CCOODDEE http://people.v.igoro.us/~dustin/ias-slides/index.h... 
2 of 37 09/24/2014 03:32 PM
CCOODDEE == SSNNIIPPPPEETT 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
var width=150; // width of the eyes in pixels 
var colour="#06f"; // colour of the eye - bluey green in this case 
var iris="#000"; // colour of the iris (normally black); 
/*************************** 
* Moving Eyeballs Effect * 
*(c)2012-3 mf2fm web-design * 
* http://www.mf2fm.com/rv * 
* DON'T EDIT BELOW THIS BOX * 
***************************/ 
var swide=800; 
function addLoadEvent(funky) { 
var oldonload=window.onload; 
if (typeof(oldonload)!='function') window.onload=funky; 
else window.onload=function() { 
... 
3 of 37 09/24/2014 03:32 PM
CCOODDEE == SSNNIIPPPPEETT 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
# == Class: baseconfig 
## 
Performs initial configuration tasks for all Vagrant boxes. 
# class baseconfig { 
exec { 'apt-get update': 
command => '/usr/bin/apt-get update'; 
} 
host { 'hostmachine': 
ip => '192.168.0.1'; 
} 
file { 
'/home/vagrant/.bashrc': 
owner => 'vagrant', 
group => 'vagrant', 
mode => '0644', 
source => 'puppet:///modules/baseconfig/bashrc'; 
} 
} 
4 of 37 09/24/2014 03:32 PM
CCOODDEE == SSCCRRIIPPTT 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
#! /usr/bin/env python 
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): 
def do_POST(self): 
content_length = int(self.headers['content-length']) 
data = self.rfile.read(content_length) 
self.send_response(200) 
self.end_headers() 
self.wfile.write("accepted.n") 
self.wfile.close() 
now = int(time.time()) 
filename = os.path.join(REPORT_DIR, "report-%s.yaml" % (now,)) 
fd = os.open(filename, os.O_EXCL|os.O_CREAT|os.O_WRONLY) 
os.fdopen(fd, "w").write(data) 
def main(): 
logging.basicConfig(format="%(asctime)s %(message)s", level=logging.DEBUG) 
SocketServer.TCPServer.allow_reuse_address = True 
httpd = SocketServer.TCPServer(("", PORT), RequestHandler) 
httpd.serve_forever() 
main() 
5 of 37 09/24/2014 03:32 PM
“My friend Clift Norris has identified a fundamental constant 
that I call Norris’ number, the average amount of code an 
untrained programmer can write before he or she hits a wall. Clift 
estimates this as 1,500 lines. Beyond that the code becomes so 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
tangled that the author cannot debug or modify it without 
herculean effort.” 
John D. Cook 
-- 
6 of 37 09/24/2014 03:32 PM
SSOOFFTTWWAARREE IINN PPUUPPPPEETT?? 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Let me tell you a story.. 
7 of 37 09/24/2014 03:32 PM
tinyurl.MMEEEETT PPUUPPPPEETTAAGGAAIINN com/puppetagain 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Open Source 
Written in Puppet 
Cross-Platform 
Highly Available 
Secure 
Designed to Manage Job-Runners 
8 of 37 09/24/2014 03:32 PM
SSOOFFTTWWAARREE 
Architectural models 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
9 of 37 09/24/2014 03:32 PM
OPENSTACK Infrastructure as Software AARRCCHHhttIIpTT://pEEeCoCplTTe.vUU.igRRoroEE.us/~dustin/ias-slides/index.h... 
10 of 37 09/24/2014 03:32 PM
AAPPPPRROOAACCHHAABBIILLIITTYY 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
If I change this, what will happen? 
Where should I start reading code? 
11 of 37 09/24/2014 03:32 PM
PUPPETAGAIN: TTOOPPLLEEVVEELL 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
class toplevel::base { 
include users::root 
} class toplevel::server inherits toplevel::base { 
include puppet::periodic 
include cron 
} class toplevel::server::mozpool inherits toplevel::server { 
include bmm 
include mozpool 
} 
12 of 37 09/24/2014 03:32 PM
PUPPETAGAIN: TTOOPPLLEEVVEELL 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
node "mobile-imaging1.p1.releng.scl3.mozilla.com" { 
include toplevel::server::mozpool 
} 
13 of 37 09/24/2014 03:32 PM
PUPPETAGAIN: CCOONNFFIIGGUURRAATTIIOONN 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
# modules/config/manifests/base.pp 
class config::base { 
$ntp_server = '' 
}# 
manifests/moco-config.pp 
class config inherits config::base { 
$ntp_server = 'time.mozilla.org' 
} 
14 of 37 09/24/2014 03:32 PM
PUPPETAGAIN: CCOONNFFIIGGUURRAATTIIOONN 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
class ntp::config { 
include ::config 
if ($::config::ntp_server) { 
.. 
} 
} 
15 of 37 09/24/2014 03:32 PM
SSOOFFTTWWAARREE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Architectural models 
Controlled Interdependencies 
16 of 37 09/24/2014 03:32 PM
Infrastructure as Software AAPPAACCHHEE:: MMOOhDDttUpU://LLpeEEopSSle.v.igoro.us/~dustin/ias-slides/index.h... 
17 of 37 09/24/2014 03:32 PM
PPUUPPPPEETTAAGGAAIINN:: DDIIRRSS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
class dirs::builds { 
file { "/builds": ensure => directory; } 
} class dirs::builds::slave { 
include dirs::builds 
file { "/builds/slave": ensure => directory; } 
} 
18 of 37 09/24/2014 03:32 PM
PPUUPPPPEETTAAGGAAIINN:: DDIIRRSS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
class talos { 
include dirs::builds::slave 
file { 
"/builds/slave/talos-slave": 
ensure => directory; 
} 
} 
19 of 37 09/24/2014 03:32 PM
SSOOFFTTWWAARREE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Architectural models 
Controlled Interdependencies 
Organizing Principles 
20 of 37 09/24/2014 03:32 PM
PA: PRINCIPLE OOFF LLEEAASSTT SSUURRPPRRIISSEE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
.. installs mig-agent .. or dies trying 
include mig_agent::install 
21 of 37 09/24/2014 03:32 PM
PA: PRINCIPLE OOFF LLEEAASSTT SSUURRPPRRIISSEE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
class mig_agent::install { 
case $operatingsystem { 
CentOS: { .. } 
default: { 
fail("Cannot install on $operatingsystem") 
} 
} 
} 
22 of 37 09/24/2014 03:32 PM
SSOOFFTTWWAARREE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Architectural models 
Controlled Interdependencies 
Organizing Principles 
Abstractions 
23 of 37 09/24/2014 03:32 PM
PPUUPPPPEETT:: PPAACCKKAAGGEESS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Write once, run everywhere, right? 
package { 
'httpd': 
ensure => '2.2.15'; 
} 
24 of 37 09/24/2014 03:32 PM
PUPPETAGAIN: PPAACCKKAAGGEESS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
include packages::httpd 
25 of 37 09/24/2014 03:32 PM
PUPPETAGAIN: PPAACCKKAAGGEESS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
class packages::httpd { 
case $::operatingsystem { 
CentOS: { 
package { "httpd": ensure => latest; } 
} 
Ubuntu: { 
package { "apache2": ensure => latest; } 
} 
Darwin: { 
# installed by default 
} 
default: { 
fail("cannot install on $::operatingsystem") 
} 
} 
} 
26 of 37 09/24/2014 03:32 PM
WWRRIITTIINNGG SSOOFFTTWWAARREE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
IISS HHAARRDD 
27 of 37 09/24/2014 03:32 PM
CCHHAALLLLEENNGGEESS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Package repositories are part of the code 
28 of 37 09/24/2014 03:32 PM
RREEPPOOSSIITTOORRIIEESS:: 
PPIINNNNIINNGG IISS HHAARRDD 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Un-specified prerequisite packages aren't pinned 
Can confuse package managers 
Modifying the repo makes production changes 
29 of 37 09/24/2014 03:32 PM
RREEPPOOSSIITTOORRIIEESS:: 
MMIIRRRROORRIINNGG IISS HHAARRDD 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
“Can we update mirrors now?” 
“No.” 
30 of 37 09/24/2014 03:32 PM
RREEPPOOSSIITTOORRIIEESS:: 
SSHHAARRIINNGG IISS HHAARRDD 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
31 of 37 09/24/2014 03:32 PM
RREEPPOOSSIITTOORRIIEESS:: 
TTHHEEYY''RREE HHUUGGEE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
[root@releng-puppet2.srv.releng.scl3.mozilla.com dmitchell]# df -h /data 
Filesystem Size Used Avail Use% Mounted on 
/dev/mapper/vg_relengpuppet2-lv_data 
414G 315G 78G 81% /data 
32 of 37 09/24/2014 03:32 PM
CCHHAALLLLEENNGGEESS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Package repositories are part of the code 
Interactions are hard to model 
33 of 37 09/24/2014 03:32 PM
MMOODDUULLEE IINNTTEERRAACCTTIIOONNSS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
'httpd' module installs Apache 
'rsyslog' module installs rsyslog 
When both are installed, we want to send access logs to rsyslog 
34 of 37 09/24/2014 03:32 PM
MMOODDUULLEE IINNTTEERRAACCTTIIOONNSS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Httpd has to know about rsyslog? 
class httpd::logging { 
include rsyslog::config_dir 
file { 
"${rsyslog::config_dir::dir}/httpd.conf": 
content => template("${module_name}/rsyslogd_httpd.conf.erb"); 
} 
} 
35 of 37 09/24/2014 03:32 PM
CCHHAALLLLEENNGGEESS 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
Package repositories are part of the code 
Interactions are hard to model 
Acceptance-level testing is hard 
36 of 37 09/24/2014 03:32 PM
GGOO FFOORRTTHH AANNDD 
WWRRIITTEE SSOOFFTTWWAARREE 
Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 
37 of 37 09/24/2014 03:32 PM

More Related Content

Similar to Infrastructure as Software - PuppetConf 2014

DevOpSec_DockerNPodMan-20230220.pdf
DevOpSec_DockerNPodMan-20230220.pdfDevOpSec_DockerNPodMan-20230220.pdf
DevOpSec_DockerNPodMan-20230220.pdfkanedafromparis
 
Project on Video Library management
Project on Video Library managementProject on Video Library management
Project on Video Library managementParv Poddar
 
Azure Container Services​
Azure Container Services​Azure Container Services​
Azure Container Services​Pedro Sousa
 
Be pinched by a cRUSTacean to prevent programming errors !
Be pinched by a cRUSTacean to prevent programming errors !Be pinched by a cRUSTacean to prevent programming errors !
Be pinched by a cRUSTacean to prevent programming errors !René Ribaud
 
deployer, deployment for TYPO3 CMS with ease and fun
deployer, deployment for TYPO3 CMS with ease and fundeployer, deployment for TYPO3 CMS with ease and fun
deployer, deployment for TYPO3 CMS with ease and funPeter Niederlag
 
Azure Container Services​
Azure Container Services​Azure Container Services​
Azure Container Services​Pedro Sousa
 
Microservices, la risposta che (forse) cercavi!
Microservices, la risposta che (forse) cercavi!Microservices, la risposta che (forse) cercavi!
Microservices, la risposta che (forse) cercavi!Commit University
 
Chicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - MediaflyChicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - MediaflyMediafly
 
Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)Chris Richardson
 
OpenChain AutomotiveWG(OSS license tools()
OpenChain AutomotiveWG(OSS license tools()OpenChain AutomotiveWG(OSS license tools()
OpenChain AutomotiveWG(OSS license tools()Yuichi Kusakabe
 
Research software and Dataverse
Research software and DataverseResearch software and Dataverse
Research software and Dataversephilipdurbin
 
containerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, Brusselscontainerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, BrusselsDaniel Nüst
 
Parrot Drones Hijacking
Parrot Drones HijackingParrot Drones Hijacking
Parrot Drones HijackingPriyanka Aash
 
Docker6anniversary
Docker6anniversaryDocker6anniversary
Docker6anniversaryRené Ribaud
 
Prototyping in the cloud
Prototyping in the cloudPrototyping in the cloud
Prototyping in the cloudKirsten Hunter
 
Lessons Learned in Automating Compliance for Containers
Lessons Learned in Automating Compliance for ContainersLessons Learned in Automating Compliance for Containers
Lessons Learned in Automating Compliance for ContainersAll Things Open
 
4Developers 2015: Continuous Security in DevOps - Maciej Lasyk
4Developers 2015: Continuous Security in DevOps - Maciej Lasyk4Developers 2015: Continuous Security in DevOps - Maciej Lasyk
4Developers 2015: Continuous Security in DevOps - Maciej LasykPROIDEA
 
Continuous Security in DevOps
Continuous Security in DevOpsContinuous Security in DevOps
Continuous Security in DevOpsMaciej Lasyk
 
Programming IoT with Docker: How to Start?
Programming IoT with Docker: How to Start?Programming IoT with Docker: How to Start?
Programming IoT with Docker: How to Start?msyukor
 
Docker @ Data Science Meetup
Docker @ Data Science MeetupDocker @ Data Science Meetup
Docker @ Data Science MeetupDaniel Nüst
 

Similar to Infrastructure as Software - PuppetConf 2014 (20)

DevOpSec_DockerNPodMan-20230220.pdf
DevOpSec_DockerNPodMan-20230220.pdfDevOpSec_DockerNPodMan-20230220.pdf
DevOpSec_DockerNPodMan-20230220.pdf
 
Project on Video Library management
Project on Video Library managementProject on Video Library management
Project on Video Library management
 
Azure Container Services​
Azure Container Services​Azure Container Services​
Azure Container Services​
 
Be pinched by a cRUSTacean to prevent programming errors !
Be pinched by a cRUSTacean to prevent programming errors !Be pinched by a cRUSTacean to prevent programming errors !
Be pinched by a cRUSTacean to prevent programming errors !
 
deployer, deployment for TYPO3 CMS with ease and fun
deployer, deployment for TYPO3 CMS with ease and fundeployer, deployment for TYPO3 CMS with ease and fun
deployer, deployment for TYPO3 CMS with ease and fun
 
Azure Container Services​
Azure Container Services​Azure Container Services​
Azure Container Services​
 
Microservices, la risposta che (forse) cercavi!
Microservices, la risposta che (forse) cercavi!Microservices, la risposta che (forse) cercavi!
Microservices, la risposta che (forse) cercavi!
 
Chicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - MediaflyChicago Docker Meetup Presentation - Mediafly
Chicago Docker Meetup Presentation - Mediafly
 
Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)Developing and deploying applications with Spring Boot and Docker (@oakjug)
Developing and deploying applications with Spring Boot and Docker (@oakjug)
 
OpenChain AutomotiveWG(OSS license tools()
OpenChain AutomotiveWG(OSS license tools()OpenChain AutomotiveWG(OSS license tools()
OpenChain AutomotiveWG(OSS license tools()
 
Research software and Dataverse
Research software and DataverseResearch software and Dataverse
Research software and Dataverse
 
containerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, Brusselscontainerit at useR!2017 conference, Brussels
containerit at useR!2017 conference, Brussels
 
Parrot Drones Hijacking
Parrot Drones HijackingParrot Drones Hijacking
Parrot Drones Hijacking
 
Docker6anniversary
Docker6anniversaryDocker6anniversary
Docker6anniversary
 
Prototyping in the cloud
Prototyping in the cloudPrototyping in the cloud
Prototyping in the cloud
 
Lessons Learned in Automating Compliance for Containers
Lessons Learned in Automating Compliance for ContainersLessons Learned in Automating Compliance for Containers
Lessons Learned in Automating Compliance for Containers
 
4Developers 2015: Continuous Security in DevOps - Maciej Lasyk
4Developers 2015: Continuous Security in DevOps - Maciej Lasyk4Developers 2015: Continuous Security in DevOps - Maciej Lasyk
4Developers 2015: Continuous Security in DevOps - Maciej Lasyk
 
Continuous Security in DevOps
Continuous Security in DevOpsContinuous Security in DevOps
Continuous Security in DevOps
 
Programming IoT with Docker: How to Start?
Programming IoT with Docker: How to Start?Programming IoT with Docker: How to Start?
Programming IoT with Docker: How to Start?
 
Docker @ Data Science Meetup
Docker @ Data Science MeetupDocker @ Data Science Meetup
Docker @ Data Science Meetup
 

More from Puppet

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet
 
Puppetcamp r10kyaml
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyamlPuppet
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)Puppet
 
Puppet camp vscode
Puppet camp vscodePuppet camp vscode
Puppet camp vscodePuppet
 
Modules of the twenties
Modules of the twentiesModules of the twenties
Modules of the twentiesPuppet
 
Applying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codePuppet
 
KGI compliance as-code approach
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approachPuppet
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationPuppet
 
Keynote: Puppet camp compliance
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliancePuppet
 
Automating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowPuppet
 
Puppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet
 
Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Puppet
 
Accelerating azure adoption with puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppetPuppet
 
Puppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet
 
ServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkPuppet
 
Take control of your dev ops dumping ground
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping groundPuppet
 
100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy SoftwarePuppet
 
Puppet User Group
Puppet User GroupPuppet User Group
Puppet User GroupPuppet
 
Continuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsPuppet
 
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyPuppet
 

More from Puppet (20)

Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
 
Puppetcamp r10kyaml
Puppetcamp r10kyamlPuppetcamp r10kyaml
Puppetcamp r10kyaml
 
2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)2021 04-15 operational verification (with notes)
2021 04-15 operational verification (with notes)
 
Puppet camp vscode
Puppet camp vscodePuppet camp vscode
Puppet camp vscode
 
Modules of the twenties
Modules of the twentiesModules of the twenties
Modules of the twenties
 
Applying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance codeApplying Roles and Profiles method to compliance code
Applying Roles and Profiles method to compliance code
 
KGI compliance as-code approach
KGI compliance as-code approachKGI compliance as-code approach
KGI compliance as-code approach
 
Enforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automationEnforce compliance policy with model-driven automation
Enforce compliance policy with model-driven automation
 
Keynote: Puppet camp compliance
Keynote: Puppet camp complianceKeynote: Puppet camp compliance
Keynote: Puppet camp compliance
 
Automating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNowAutomating it management with Puppet + ServiceNow
Automating it management with Puppet + ServiceNow
 
Puppet: The best way to harden Windows
Puppet: The best way to harden WindowsPuppet: The best way to harden Windows
Puppet: The best way to harden Windows
 
Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020Simplified Patch Management with Puppet - Oct. 2020
Simplified Patch Management with Puppet - Oct. 2020
 
Accelerating azure adoption with puppet
Accelerating azure adoption with puppetAccelerating azure adoption with puppet
Accelerating azure adoption with puppet
 
Puppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael PinsonPuppet catalog Diff; Raphael Pinson
Puppet catalog Diff; Raphael Pinson
 
ServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin ReeuwijkServiceNow and Puppet- better together, Kevin Reeuwijk
ServiceNow and Puppet- better together, Kevin Reeuwijk
 
Take control of your dev ops dumping ground
Take control of your  dev ops dumping groundTake control of your  dev ops dumping ground
Take control of your dev ops dumping ground
 
100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software100% Puppet Cloud Deployment of Legacy Software
100% Puppet Cloud Deployment of Legacy Software
 
Puppet User Group
Puppet User GroupPuppet User Group
Puppet User Group
 
Continuous Compliance and DevSecOps
Continuous Compliance and DevSecOpsContinuous Compliance and DevSecOps
Continuous Compliance and DevSecOps
 
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick MaludyThe Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
The Dynamic Duo of Puppet and Vault tame SSL Certificates, Nick Maludy
 

Recently uploaded

Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 

Recently uploaded (20)

Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 

Infrastructure as Software - PuppetConf 2014

  • 1. Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... INFRASTRUCTURE AASS SSOOFFTTWWAARREE Dustin J. Mitchell dustin@mozilla.com Sept 24, 2014 1 of 37 09/24/2014 03:32 PM
  • 2. Infrastructure as Software CCOODDEE http://people.v.igoro.us/~dustin/ias-slides/index.h... 2 of 37 09/24/2014 03:32 PM
  • 3. CCOODDEE == SSNNIIPPPPEETT Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... var width=150; // width of the eyes in pixels var colour="#06f"; // colour of the eye - bluey green in this case var iris="#000"; // colour of the iris (normally black); /*************************** * Moving Eyeballs Effect * *(c)2012-3 mf2fm web-design * * http://www.mf2fm.com/rv * * DON'T EDIT BELOW THIS BOX * ***************************/ var swide=800; function addLoadEvent(funky) { var oldonload=window.onload; if (typeof(oldonload)!='function') window.onload=funky; else window.onload=function() { ... 3 of 37 09/24/2014 03:32 PM
  • 4. CCOODDEE == SSNNIIPPPPEETT Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... # == Class: baseconfig ## Performs initial configuration tasks for all Vagrant boxes. # class baseconfig { exec { 'apt-get update': command => '/usr/bin/apt-get update'; } host { 'hostmachine': ip => '192.168.0.1'; } file { '/home/vagrant/.bashrc': owner => 'vagrant', group => 'vagrant', mode => '0644', source => 'puppet:///modules/baseconfig/bashrc'; } } 4 of 37 09/24/2014 03:32 PM
  • 5. CCOODDEE == SSCCRRIIPPTT Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... #! /usr/bin/env python class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def do_POST(self): content_length = int(self.headers['content-length']) data = self.rfile.read(content_length) self.send_response(200) self.end_headers() self.wfile.write("accepted.n") self.wfile.close() now = int(time.time()) filename = os.path.join(REPORT_DIR, "report-%s.yaml" % (now,)) fd = os.open(filename, os.O_EXCL|os.O_CREAT|os.O_WRONLY) os.fdopen(fd, "w").write(data) def main(): logging.basicConfig(format="%(asctime)s %(message)s", level=logging.DEBUG) SocketServer.TCPServer.allow_reuse_address = True httpd = SocketServer.TCPServer(("", PORT), RequestHandler) httpd.serve_forever() main() 5 of 37 09/24/2014 03:32 PM
  • 6. “My friend Clift Norris has identified a fundamental constant that I call Norris’ number, the average amount of code an untrained programmer can write before he or she hits a wall. Clift estimates this as 1,500 lines. Beyond that the code becomes so Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... tangled that the author cannot debug or modify it without herculean effort.” John D. Cook -- 6 of 37 09/24/2014 03:32 PM
  • 7. SSOOFFTTWWAARREE IINN PPUUPPPPEETT?? Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Let me tell you a story.. 7 of 37 09/24/2014 03:32 PM
  • 8. tinyurl.MMEEEETT PPUUPPPPEETTAAGGAAIINN com/puppetagain Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Open Source Written in Puppet Cross-Platform Highly Available Secure Designed to Manage Job-Runners 8 of 37 09/24/2014 03:32 PM
  • 9. SSOOFFTTWWAARREE Architectural models Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 9 of 37 09/24/2014 03:32 PM
  • 10. OPENSTACK Infrastructure as Software AARRCCHHhttIIpTT://pEEeCoCplTTe.vUU.igRRoroEE.us/~dustin/ias-slides/index.h... 10 of 37 09/24/2014 03:32 PM
  • 11. AAPPPPRROOAACCHHAABBIILLIITTYY Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... If I change this, what will happen? Where should I start reading code? 11 of 37 09/24/2014 03:32 PM
  • 12. PUPPETAGAIN: TTOOPPLLEEVVEELL Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... class toplevel::base { include users::root } class toplevel::server inherits toplevel::base { include puppet::periodic include cron } class toplevel::server::mozpool inherits toplevel::server { include bmm include mozpool } 12 of 37 09/24/2014 03:32 PM
  • 13. PUPPETAGAIN: TTOOPPLLEEVVEELL Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... node "mobile-imaging1.p1.releng.scl3.mozilla.com" { include toplevel::server::mozpool } 13 of 37 09/24/2014 03:32 PM
  • 14. PUPPETAGAIN: CCOONNFFIIGGUURRAATTIIOONN Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... # modules/config/manifests/base.pp class config::base { $ntp_server = '' }# manifests/moco-config.pp class config inherits config::base { $ntp_server = 'time.mozilla.org' } 14 of 37 09/24/2014 03:32 PM
  • 15. PUPPETAGAIN: CCOONNFFIIGGUURRAATTIIOONN Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... class ntp::config { include ::config if ($::config::ntp_server) { .. } } 15 of 37 09/24/2014 03:32 PM
  • 16. SSOOFFTTWWAARREE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Architectural models Controlled Interdependencies 16 of 37 09/24/2014 03:32 PM
  • 17. Infrastructure as Software AAPPAACCHHEE:: MMOOhDDttUpU://LLpeEEopSSle.v.igoro.us/~dustin/ias-slides/index.h... 17 of 37 09/24/2014 03:32 PM
  • 18. PPUUPPPPEETTAAGGAAIINN:: DDIIRRSS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... class dirs::builds { file { "/builds": ensure => directory; } } class dirs::builds::slave { include dirs::builds file { "/builds/slave": ensure => directory; } } 18 of 37 09/24/2014 03:32 PM
  • 19. PPUUPPPPEETTAAGGAAIINN:: DDIIRRSS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... class talos { include dirs::builds::slave file { "/builds/slave/talos-slave": ensure => directory; } } 19 of 37 09/24/2014 03:32 PM
  • 20. SSOOFFTTWWAARREE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Architectural models Controlled Interdependencies Organizing Principles 20 of 37 09/24/2014 03:32 PM
  • 21. PA: PRINCIPLE OOFF LLEEAASSTT SSUURRPPRRIISSEE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... .. installs mig-agent .. or dies trying include mig_agent::install 21 of 37 09/24/2014 03:32 PM
  • 22. PA: PRINCIPLE OOFF LLEEAASSTT SSUURRPPRRIISSEE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... class mig_agent::install { case $operatingsystem { CentOS: { .. } default: { fail("Cannot install on $operatingsystem") } } } 22 of 37 09/24/2014 03:32 PM
  • 23. SSOOFFTTWWAARREE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Architectural models Controlled Interdependencies Organizing Principles Abstractions 23 of 37 09/24/2014 03:32 PM
  • 24. PPUUPPPPEETT:: PPAACCKKAAGGEESS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Write once, run everywhere, right? package { 'httpd': ensure => '2.2.15'; } 24 of 37 09/24/2014 03:32 PM
  • 25. PUPPETAGAIN: PPAACCKKAAGGEESS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... include packages::httpd 25 of 37 09/24/2014 03:32 PM
  • 26. PUPPETAGAIN: PPAACCKKAAGGEESS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... class packages::httpd { case $::operatingsystem { CentOS: { package { "httpd": ensure => latest; } } Ubuntu: { package { "apache2": ensure => latest; } } Darwin: { # installed by default } default: { fail("cannot install on $::operatingsystem") } } } 26 of 37 09/24/2014 03:32 PM
  • 27. WWRRIITTIINNGG SSOOFFTTWWAARREE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... IISS HHAARRDD 27 of 37 09/24/2014 03:32 PM
  • 28. CCHHAALLLLEENNGGEESS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Package repositories are part of the code 28 of 37 09/24/2014 03:32 PM
  • 29. RREEPPOOSSIITTOORRIIEESS:: PPIINNNNIINNGG IISS HHAARRDD Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Un-specified prerequisite packages aren't pinned Can confuse package managers Modifying the repo makes production changes 29 of 37 09/24/2014 03:32 PM
  • 30. RREEPPOOSSIITTOORRIIEESS:: MMIIRRRROORRIINNGG IISS HHAARRDD Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... “Can we update mirrors now?” “No.” 30 of 37 09/24/2014 03:32 PM
  • 31. RREEPPOOSSIITTOORRIIEESS:: SSHHAARRIINNGG IISS HHAARRDD Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 31 of 37 09/24/2014 03:32 PM
  • 32. RREEPPOOSSIITTOORRIIEESS:: TTHHEEYY''RREE HHUUGGEE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... [root@releng-puppet2.srv.releng.scl3.mozilla.com dmitchell]# df -h /data Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_relengpuppet2-lv_data 414G 315G 78G 81% /data 32 of 37 09/24/2014 03:32 PM
  • 33. CCHHAALLLLEENNGGEESS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Package repositories are part of the code Interactions are hard to model 33 of 37 09/24/2014 03:32 PM
  • 34. MMOODDUULLEE IINNTTEERRAACCTTIIOONNSS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 'httpd' module installs Apache 'rsyslog' module installs rsyslog When both are installed, we want to send access logs to rsyslog 34 of 37 09/24/2014 03:32 PM
  • 35. MMOODDUULLEE IINNTTEERRAACCTTIIOONNSS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Httpd has to know about rsyslog? class httpd::logging { include rsyslog::config_dir file { "${rsyslog::config_dir::dir}/httpd.conf": content => template("${module_name}/rsyslogd_httpd.conf.erb"); } } 35 of 37 09/24/2014 03:32 PM
  • 36. CCHHAALLLLEENNGGEESS Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... Package repositories are part of the code Interactions are hard to model Acceptance-level testing is hard 36 of 37 09/24/2014 03:32 PM
  • 37. GGOO FFOORRTTHH AANNDD WWRRIITTEE SSOOFFTTWWAARREE Infrastructure as Software http://people.v.igoro.us/~dustin/ias-slides/index.h... 37 of 37 09/24/2014 03:32 PM