59
Pipeline as Code Pipeline as Code for your for your IAC IAC Kris Buytaert @krisbuytaert

Pipeline as code for your infrastructure as Code

Embed Size (px)

Citation preview

Page 1: Pipeline as code for your infrastructure as Code

Pipeline as Code Pipeline as Code for your for your

IACIACKris Buytaert

@krisbuytaert

Page 2: Pipeline as code for your infrastructure as Code

Kris BuytaertKris Buytaert● I used to be a Dev,I used to be a Dev,● Then Became an OpThen Became an Op● Chief Trolling Officer and Open Source Chief Trolling Officer and Open Source

Consultant @inuits.euConsultant @inuits.eu● Everything is an effing DNS ProblemEverything is an effing DNS Problem● Building Clouds since before the bookstoreBuilding Clouds since before the bookstore● Some books, some papers, some blogsSome books, some papers, some blogs● Evangelizing devopsEvangelizing devops

Page 3: Pipeline as code for your infrastructure as Code

Todays GoalsTodays Goals● Infrastructure as CodeInfrastructure as Code

● A reproducable way to deploy and upgrade A reproducable way to deploy and upgrade

/etc/puppet/etc/puppet

● With 10+ environments in With 10+ environments in /etc/puppet/environments/etc/puppet/environments

● AutomaticallyAutomatically

● FastFast

● ConsistentConsistent

● ContinuouslyContinuously

Page 4: Pipeline as code for your infrastructure as Code

What's this devops thing What's this devops thing anyhow ? anyhow ?

Page 5: Pipeline as code for your infrastructure as Code

C(L)AMSC(L)AMS● CultureCulture

● (Lean)(Lean)

● AutomationAutomation

● MeasurementMeasurement

● SharingSharing

Damon Edwards and John WillisDamon Edwards and John Willis

Gene KimGene Kim

Page 6: Pipeline as code for your infrastructure as Code

devops (<)> continuous delivery devops (<)> continuous delivery

Page 7: Pipeline as code for your infrastructure as Code

NirvanaNirvanaAn “ecosystem” that supports continuous delivery, from An “ecosystem” that supports continuous delivery, from infrastructure, data and configuration management to infrastructure, data and configuration management to business.business.Through automation of the build, deployment, and testing Through automation of the build, deployment, and testing process, and improved collaboration between developers, process, and improved collaboration between developers, testers, and operations, delivery teams can get changes testers, and operations, delivery teams can get changes released in a matter of hours — sometimes even minutes–no released in a matter of hours — sometimes even minutes–no matter what the size of a project or the complexity of its code matter what the size of a project or the complexity of its code base.base.

Continuous Delivery , Jez HumbleContinuous Delivery , Jez Humble

Page 8: Pipeline as code for your infrastructure as Code
Page 9: Pipeline as code for your infrastructure as Code
Page 10: Pipeline as code for your infrastructure as Code

How many times a day ?How many times a day ?● 10 @ Flickr10 @ Flickr

● Deployments used to be painDeployments used to be pain

● Nobody dared to deploy a siteNobody dared to deploy a site

● Practice makes perfectPractice makes perfect

● Knowing you can vs constantly doing it Knowing you can vs constantly doing it

Page 11: Pipeline as code for your infrastructure as Code

" Our job as engineers (and ops, dev-ops, QA, " Our job as engineers (and ops, dev-ops, QA, support, everyone in the company actually) is to support, everyone in the company actually) is to enable the business goals. We strongly feel that enable the business goals. We strongly feel that in order to do that you must have in order to do that you must have the ability to the ability to deploy code quickly and safelydeploy code quickly and safely. Even if the . Even if the business goals are to deploy strongly QA’d code business goals are to deploy strongly QA’d code once a month at 3am (it’s not for us, we push all once a month at 3am (it’s not for us, we push all the time), having a reliable and easy the time), having a reliable and easy deployment should be deployment should be non-negotiablenon-negotiable." ."

Etsy Blog upon releasing DeployinatorEtsy Blog upon releasing Deployinator

http://codeascraft.etsy.com/2010/05/20/quantum-of-deployment/http://codeascraft.etsy.com/2010/05/20/quantum-of-deployment/

Page 12: Pipeline as code for your infrastructure as Code

For years we've tolerated humans to make For years we've tolerated humans to make structural manual changes to the infrastructure structural manual changes to the infrastructure our critical applications are running on.our critical applications are running on.

Whilst at the same time demanding those critical Whilst at the same time demanding those critical applications to go through rigid test scenarios.applications to go through rigid test scenarios.

Who let this happen ?Who let this happen ?

Page 13: Pipeline as code for your infrastructure as Code

Infrastructure as CodeInfrastructure as Code● Treat configuration automation as code Treat configuration automation as code

● Development best practicesDevelopment best practices

• Model your infrastructureModel your infrastructure

• Version your cookbooks / manifestsVersion your cookbooks / manifests

• Test your cookbooks/ manifestsTest your cookbooks/ manifests

• Dev/ test /uat / prod for your infraDev/ test /uat / prod for your infra

● Model your infrastructureModel your infrastructure

● A working service = automated ( Application Code + A working service = automated ( Application Code + Infrastructure Code + Security + Monitoring )Infrastructure Code + Security + Monitoring )

● PS. Converting Bash to Yaml != IAC PS. Converting Bash to Yaml != IAC

Page 14: Pipeline as code for your infrastructure as Code

Version all the thingsVersion all the thingsNo more excuses !No more excuses !• Source code ApplicationSource code Application

• Source code InfrastructureSource code Infrastructure

• BuildsBuilds

• TestsTests

• PipelinesPipelines

• ScriptsScripts

• DocumentationDocumentation

• Monitoring scriptsMonitoring scripts

Page 15: Pipeline as code for your infrastructure as Code

PuppetPuppet● Open Source Config Management Open Source Config Management ToolTool Ecosystem Ecosystem

● 10y old ; very mature10y old ; very mature

● Ruby, Clojure, Jruby, C++, ...Ruby, Clojure, Jruby, C++, ...

● Large communityLarge community

● Lots of open source modules (code shared by Lots of open source modules (code shared by other people to automate things)other people to automate things)

Page 16: Pipeline as code for your infrastructure as Code

Puppet in shortPuppet in short● You define the desired state of your infraYou define the desired state of your infra

● Puppet looks at the current state and takes Puppet looks at the current state and takes actions to get to the final stateactions to get to the final state

● You have the report of what has been You have the report of what has been changed/errored/…changed/errored/…

● It is declarativeIt is declarative

Page 17: Pipeline as code for your infrastructure as Code

How Puppet WorksHow Puppet Works● Puppet works by default on a server/agent Puppet works by default on a server/agent

modelmodel

● Agents fetch their “catalog” (= final desired Agents fetch their “catalog” (= final desired state) from the master and apply that locallystate) from the master and apply that locally

● Then they report back to the serverThen they report back to the server

● The catalog is computed depending on “facts” The catalog is computed depending on “facts” the machine sends to the server, user input the machine sends to the server, user input (parameters) and modules (source code)(parameters) and modules (source code)

Page 18: Pipeline as code for your infrastructure as Code

A random projectA random project

[sdog@mine vagrant-graphite]$ lsmanifests modules README TODO Vagrantfile [sdog@mine vagrant-graphite]$ tree -dL 2.├── manifests│   └── hosts└── modules ├── apache ├── collectd ├── graphite ├── jmxtrans ├── logster ├── statsd └── tattle

10 directories

Page 19: Pipeline as code for your infrastructure as Code

Manage the modulesManage the modules● Insert ugly shell scriptInsert ugly shell script

● Librarian PuppetLibrarian Puppet

● R10kR10k

● ........

Page 20: Pipeline as code for your infrastructure as Code

Librarian Puppet / R10k Librarian Puppet / R10k ● Hides complexity of submodules Hides complexity of submodules

● Easy if you use Forge ModulesEasy if you use Forge Modules

• Does anyone ? Does anyone ?

• Do you trust the internet to be around ?Do you trust the internet to be around ?

● Branching is considered the antipattern in a Branching is considered the antipattern in a CI/CD Environment CI/CD Environment

● Librarian = Old English for “can't use Librarian = Old English for “can't use submodules”submodules”

● And hmm... which customer uses which patched version again ?And hmm... which customer uses which patched version again ?

Page 21: Pipeline as code for your infrastructure as Code
Page 22: Pipeline as code for your infrastructure as Code

Software Release Software Release management is not a management is not a

solved problemsolved problem

Page 23: Pipeline as code for your infrastructure as Code

Unless you understand Unless you understand Git SubmodulesGit Submodules

● Basic git, Basic git,

● No extra tools requiredNo extra tools required

Integrates with other projects too.Integrates with other projects too.

(No need for *-librarian etc ..)(No need for *-librarian etc ..)

Page 24: Pipeline as code for your infrastructure as Code

Continuous IntegrationContinuous IntegrationContinuous integration (CI) is the practice, in software engineering, of Continuous integration (CI) is the practice, in software engineering, of merging all developer working copies with a shared mainline several times a merging all developer working copies with a shared mainline several times a day. It was first named and proposed as part of extreme programming (XP). Its day. It was first named and proposed as part of extreme programming (XP). Its main aim is to prevent integration problems, referred to as "integration hell" main aim is to prevent integration problems, referred to as "integration hell"

(WikiPedia)(WikiPedia)

Does the app you are deploying still work ?Does the app you are deploying still work ?

Did you break your puppet / chef code ?Did you break your puppet / chef code ?

Page 25: Pipeline as code for your infrastructure as Code

JenkinsJenkins● Open Source Continuous Integration ServerOpen Source Continuous Integration Server

● A zillion plugins (400)A zillion plugins (400)

● Have developers build stable and deployable Have developers build stable and deployable codecode

● Test Infra code Test Infra code

Page 26: Pipeline as code for your infrastructure as Code

Jenkins Pipeline Jenkins Pipeline

Page 27: Pipeline as code for your infrastructure as Code

What's in your Pipeline ?What's in your Pipeline ?

Page 28: Pipeline as code for your infrastructure as Code

A pipelineA pipeline● Checkout codeCheckout code

● SyntaxSyntax

● StyleStyle

● Code CoverageCode Coverage

● TestsTests

● BuildBuild

● More TestsMore Tests

● Package Package

Page 29: Pipeline as code for your infrastructure as Code

Syntax and StyleSyntax and Style● Initially , Initially ,

all code, all the timeall code, all the time

● Now,Now,

only the changed codeonly the changed code

● Why not in post Commit Hooks ? Why not in post Commit Hooks ?

Page 30: Pipeline as code for your infrastructure as Code

Package all the thingsPackage all the things

Page 31: Pipeline as code for your infrastructure as Code

Artifacts:Artifacts:● Tested artifacts that go through a pipelineTested artifacts that go through a pipeline

application code,application code,

Infra codeInfra code

metadatametadata

teststests

Page 32: Pipeline as code for your infrastructure as Code

Why ops like to package Why ops like to package ● Packages give you featuresPackages give you features

• Consistency, security, dependenciesConsistency, security, dependencies

● Uniquely identify where files come fromUniquely identify where files come from

•Package or cfg-mgmt Package or cfg-mgmt

● Source repo not always availableSource repo not always available

•Firewall / Cloud etc .. Firewall / Cloud etc ..

● Weird deployment locations , no easy accessWeird deployment locations , no easy access

● Little overhead when you automateLittle overhead when you automate

Page 33: Pipeline as code for your infrastructure as Code

Jordan Sissel is a Hero !Jordan Sissel is a Hero !

Page 34: Pipeline as code for your infrastructure as Code

#packaginlove#packaginlove

Page 35: Pipeline as code for your infrastructure as Code

It's not really packagingIt's not really packaging

• It's an immutable branchIt's an immutable branch

• It's a tracable release artefact It's a tracable release artefact

Page 36: Pipeline as code for your infrastructure as Code

A pipelineA pipeline● Checkout codeCheckout code

● SyntaxSyntax

● StyleStyle

● Code CoverageCode Coverage

● TestsTests

● BuildBuild

● More TestsMore Tests

● Package Package

● Upload to RepoUpload to Repo

Page 37: Pipeline as code for your infrastructure as Code

Repository ManagementRepository Management

● PulpPulp

• Pro : MirroringLovePro : MirroringLove

• Con : Mongo, Stability, .debCon : Mongo, Stability, .deb

● Aptly (deb only)Aptly (deb only)

● Prm (missing snapshot features for .rpm)Prm (missing snapshot features for .rpm)

Page 38: Pipeline as code for your infrastructure as Code

Repository ManagementRepository Management

Page 39: Pipeline as code for your infrastructure as Code

A pipelineA pipeline● Checkout codeCheckout code

● SyntaxSyntax

● StyleStyle

● Code CoverageCode Coverage

● TestsTests

● BuildBuild

● More TestsMore Tests

● Package Package

● Upload to RepoUpload to Repo

● Deploy on TestDeploy on Test

Page 40: Pipeline as code for your infrastructure as Code

Repos are SLOWRepos are SLOW● Createrepo is slow.Createrepo is slow.

● Pulp is slowPulp is slow

● Bypass repos , upload straight to appropriate Bypass repos , upload straight to appropriate PuppetMasterPuppetMaster

● Upload to repo for rebootstrappingUpload to repo for rebootstrapping

Page 41: Pipeline as code for your infrastructure as Code

A pipelineA pipeline● Checkout codeCheckout code

● SyntaxSyntax

● StyleStyle

● Code CoverageCode Coverage

● TestsTests

● BuildBuild

● More TestsMore Tests

● Package Package

● Upload to RepoUpload to Repo

● Deploy on TestDeploy on Test

● Check PuppetrunsCheck Puppetruns

● Check MonitoringCheck Monitoring

Page 42: Pipeline as code for your infrastructure as Code

Testing = MonitoringTesting = Monitoring● Deploy a host,Deploy a host,

● Add it to the monitoring frameworkAdd it to the monitoring framework

● Add collection toolsAdd collection tools

● Add check definitionsAdd check definitions

● Update the monitoring tool configUpdate the monitoring tool config

FULLY AUTOMATEDFULLY AUTOMATED

Page 43: Pipeline as code for your infrastructure as Code

e.g. Stored Configse.g. Stored Configs

Page 44: Pipeline as code for your infrastructure as Code

A pipelineA pipeline● Checkout codeCheckout code

● SyntaxSyntax

● StyleStyle

● Code CoverageCode Coverage

● TestsTests

● BuildBuild

● More TestsMore Tests

● Package Package

● Upload to RepoUpload to Repo

● Deploy on TestDeploy on Test

● Check PuppetrunsCheck Puppetruns

● Check MonitoringCheck Monitoring

● Promote to UATPromote to UAT

Page 45: Pipeline as code for your infrastructure as Code

Jenkins Promotion Jenkins Promotion

Page 46: Pipeline as code for your infrastructure as Code

PipelinesPipelines● Lots of themLots of them

● Similar ones, but not identical onesSimilar ones, but not identical ones

● One project = different deployment One project = different deployment targetstargets

● People move teams expect same People move teams expect same patternspatterns

● Mostly unmaintaned Mostly unmaintaned

Page 47: Pipeline as code for your infrastructure as Code

Dirty ClickersDirty Clickers

Page 48: Pipeline as code for your infrastructure as Code

Complex PipelinesComplex Pipelines

Page 49: Pipeline as code for your infrastructure as Code

Scaling PipelinesScaling Pipelines● Create a Pipeline,Create a Pipeline,

● For job in PipelineFor job in Pipeline

• Create new Job Based on OldJobCreate new Job Based on OldJob

● Update One JobUpdate One Job

● Never refactor the restNever refactor the rest

Page 50: Pipeline as code for your infrastructure as Code

Generating Jenkins PipelinesGenerating Jenkins Pipelines

● Template the XMLTemplate the XML

● Put it in PuppetPut it in Puppet

• Worked for stable pipelinesWorked for stable pipelines

• KindaKinda

● XML gets rewritten on the flyXML gets rewritten on the fly

Page 51: Pipeline as code for your infrastructure as Code

JenkinsJobBuilderJenkinsJobBuilder

● First Usable AttemptFirst Usable Attempt

● Python BasedPython Based

● Openstack CommunityOpenstack Community

● Limited FunctionalityLimited Functionality

● Little Adoption / Openstack Little Adoption / Openstack Abandonned itAbandonned it

Page 52: Pipeline as code for your infrastructure as Code

PipelineDSLPipelineDSL

● Jenkinsfile Jenkinsfile

● Inside a repoInside a repo

● GroovyGroovy

● Limited functionalityLimited functionality

● Initially buggy Initially buggy

● Popular for Easy tasksPopular for Easy tasks

• (straight, no splits etc) (straight, no splits etc)

Page 53: Pipeline as code for your infrastructure as Code

Jenkins Job DSLJenkins Job DSL

● GroovyGroovy

● FlexibleFlexible

● Well SupportedWell Supported

● Suitable for more complex PipelinesSuitable for more complex Pipelines

https://jenkinsci.github.io/job-dsl-https://jenkinsci.github.io/job-dsl-plugin/plugin/

Page 54: Pipeline as code for your infrastructure as Code

SeedjobsSeedjobs● GroovyGroovy

● GitGit

● Rebuild jobs on commitRebuild jobs on commit

● Projects in foldersProjects in folders

Page 55: Pipeline as code for your infrastructure as Code

Larger CI StacksLarger CI Stacks● Generate Pipelines / Jobs based on config files , Generate Pipelines / Jobs based on config files ,

● Build librariesBuild libraries

• CheckoutJobCheckoutJob

• DeployJobDeployJob

• PackageJobPackageJob

● Use Groovy / JobDSL to generate PipelineDSLUse Groovy / JobDSL to generate PipelineDSL

Page 56: Pipeline as code for your infrastructure as Code

Testing Multiple VersionsTesting Multiple Versions

● Initial stage tests code on multiple Initial stage tests code on multiple versions versions

• e.g current puppet versione.g current puppet version

• Next puppet version Next puppet version

• Bleeding Edge versionBleeding Edge version

● Only current version breaks buildOnly current version breaks build

● Goal = get all versions greenGoal = get all versions green

Page 57: Pipeline as code for your infrastructure as Code

Problems solvedProblems solved

● One job per task, no reuse of jobs with different One job per task, no reuse of jobs with different parametersparameters

● All Jobs are in sync, update one = update all All Jobs are in sync, update one = update all

● Centrally managed jobs (git)Centrally managed jobs (git)

Page 58: Pipeline as code for your infrastructure as Code

Stop Clicking , Write CodeStop Clicking , Write Code

Page 59: Pipeline as code for your infrastructure as Code

ContactContactKris Buytaert [email protected] Buytaert [email protected]

Further ReadingFurther Reading@krisbuytaert @krisbuytaert http://www.krisbuytaert.be/blog/http://www.krisbuytaert.be/blog/

https://inuits.eu/https://inuits.eu/

InuitsInuits

Essensteenweg 31Essensteenweg 31BrasschaatBrasschaatBelgiumBelgium891.514.231891.514.231

+32 475 961221+32 475 961221