Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet -...

56

description

"Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet" presented at Puppet Camp London April 2014 by Tom Doran, Yelp

Transcript of Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet -...

Page 1: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp
Page 2: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Chasing AMI Baking Amazon machine images with Jenkins,

Packer and Puppet

Tomas Doran @bobtfish 2014-04-04

Page 3: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

What’s the talk about?

• My thoughts on building a (hybrid?) cloud infrastructure • Machine images • Bootstrapping puppet • Continuous delivery

• Why you need to be doing this, where to begin • Full end to end acceptance testing!

• Doing multi-region right • ‘Immutable’ servers and the ‘image as application’

pattern

3

Page 4: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Serious business

4

Page 5: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Serious business

5

Page 6: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Serious business

6

The world is changing

Page 7: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Serious business

7

The world is changing

Keep up, or die

Page 8: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Clouds = I don’t need a datacenter?

• Planning to run production parts of your business • Multiple applications (or internal services) • Want high availability! • Doing significant traffic

!• ‘A real datacenter in AWS’ • Proper VPC & VPN • IAM all the things

!Have to be prepared to invest in automation and testing

8

Page 9: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

No silly! Clouds = rain, duh!

9

Page 10: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

No silly! Clouds = rain, duh!• Amazon will retire your instances • Building a machine becomes a continuous

occurrence, not yearly hardware upgrades! • AZs will fall over • VPNs will undergo maintenance • DirectConnects

10

Page 11: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

No silly! Clouds = rain, duh!• Amazon will retire your instances • Building a machine becomes a continuous

occurrence, not yearly hardware upgrades! • AZs will fall over • VPNs will undergo maintenance • DirectConnects

!

!

Cloud not only lets you be more ‘agile’ and ‘devops’, it requires it. 11

Page 12: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

No silly! Clouds = rain, duh!• Amazon will retire your instances • Building a machine becomes a continuous

occurrence, not yearly hardware upgrades! • AZs will fall over • VPNs will undergo maintenance • DirectConnects

!

!

Cloud not only lets you be more ‘agile’ and ‘devops’, it requires it. 12

Page 13: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

BRB, running puppet

13

Page 14: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

14

Page 15: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

The last slide was a lie!

• This code does exist • route tables don’t yet work :) • Still very useful for auditing:

puppet resource aws_subnet

15

http://forge.puppetlabs.com/bobtfish/aws_api

Page 16: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

So, I got a cloud! Now lets make some servers!

• Launching machines in the console works. • Add an ssh key in the console • Boot a community image. • ssh in… • Install puppet and etc… • You have a puppet master…

16

Page 17: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Woo, yay, (etc). That was easy!

• Now lets get some servers! • Click ‘Launch’ in the console a bunch more • Copy and paste the IP addresses • for i in (…); do ssh $i • install puppet • run puppet

17

Page 18: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Woo, yay, (etc). That was easy!

• Now lets get some servers! • Click ‘Launch’ in the console a bunch more • Copy and paste the IP addresses • for i in (…); do ssh $i • install puppet • run puppet

18

Page 19: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

“D- must devops harder”

• What happens when puppetmaster instance gets retired?

• LOL

19

Page 20: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Cattle

20

Page 21: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Not pets

21

Page 22: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

“D- must devops harder”

• What happens when puppetmaster instance gets retired?

• LOL • Launch machines from a script! • cloudinit (if you’re running Ubuntu) • Supply a shell script as user data at launch !

Automate your installation / running of puppet - yay!

22

Page 23: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

ASS ensues… (Awful Shell Script)

23

• I don’t mind awful shell scripts… • As long as they work! • This implies that you don’t let them bit rot. !• First rule of backups:

If you didn’t restore recently…

• First rule of packaging: If you didn’t build a .deb/.rpm recently…

• First rule of server imaging: If you didn’t bootstrap a fresh server recently…

Page 24: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Packer

24

Page 25: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Packer config

25

Page 26: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Packer config

26

Big chunk of JSON :)

Page 27: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Level up!

27

• Outputs an AMI! • Splits the ‘build a machine’ and ‘launch a

machine’ steps. • Bootstrapping scripts are still gross. :) !

• Much better though - only launch ‘known good’ images!

Page 28: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Uniform environments

• What do you develop on? • If the answer is ‘AWS boxes provisioned the

same way’, congratulations :) • But sometimes you want to be on a train…

!• Packer does that too :)

28

Page 29: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

AWS ssh key management

• Laaaaaame. • Completely disconnected from IAMs • Inline (admin) users into a base image • Avoid using injected ssh keys at all

(At launch time - build time uses a unique key per build)

29

Page 30: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Generic image

• Basics for a server. • Sysadmin logins • Launch time scripts • NTP, syslog, scribe etc..

30

Page 31: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Bootstrapping better?

31

• You have puppet code to manage puppet.

• And ASS to setup/bootstrap puppet. • These can easily get out of sync! !

WEAK

Page 32: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Self extracting shell scripts!

32

Bundle up essential modules into a tar file: tar czf - manifests/bootstrap.pp vendor/modules/stdlib modules/aws modules/packages modules/hostname modules/timezone modules/apt_sources modules/puppet_agent !

Convert to base64, make self extracting shell script: cat << EOF | base64 -id - | tar xzf - …… EOF !

That extracts then applies: puppet apply --modulepath=modules/:vendor/modules/ --templatedir files/ manifests/

Page 33: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

33

Jenkins ALL THE THINGS.

Page 34: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Use Jenkins to build a new box and check it works!

34

• Spin up an m1.large to run the ASS and puppet • Packer does this for you! • Run it every time you commit. !

If you break the puppet code, the build breaks.

Page 35: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Basic testing!

35

Page 36: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

This is only the beginning!

• Only know puppet runs ok, not that it produces a working box.

• Don’t have a consistent way of knowing exactly which SHA is good.

• You need single run convergence. !

• Still a lot of value! • Incrementally add testing later!

36

Page 37: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

You need a ‘copy to all regions’ step

37

AMI=$(curl -s “https://jenkins.yelpcorp.com/job/promote- ${LAUNCH_TYPE}-ami/lastSuccessfulBuild/artifact/aws_region-${LAUNCH_REGION}_ami_id.txt”)

Page 38: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

38

AMI=$(curl -s “https://jenkins.yelpcorp.com/job/promote- ${LAUNCH_TYPE}-ami/lastSuccessfulBuild/artifact/aws_region-${LAUNCH_REGION}_ami_id.txt”)

Initially bake => promote. Add testing in later!

You need a ‘copy to all regions’ step

Page 39: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

39

Full workflow:

Page 40: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

40

Full workflow:

(Some of!)

Page 41: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Agile till it hurts

If you’re not mildly frightened, you aren’t moving fast enough!

!

(Someone moving faster will put you out of business)

41

Page 42: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Launch the same image anywhere

• Test launching in regions you didn’t build in! • Switch scripts are an anti pattern • You should make dynamic environment data

truly dynamic • Use DNS based discovery • Or zookeeper

42

Page 43: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

For larger data you should try:

• Instance metadata as JSON • Or an ssh key as instance metadata that lets

you clone a git repo • Or rsync • Or IAM roles • That allow access to an S3 bucket you pull

configs from • Or a combination of the above

43

Page 44: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

DNS local zone

local.yelpcorp.com

DNAME local-sfo1.yelpcorp.com

!local.yelpcorp.com. IN DNAME

local-<%= @local_domain %>.yelpcorp.com

44

Page 45: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

DNS local zone

local.yelpcorp.com

DNAME local-sfo1.yelpcorp.com

!local.yelpcorp.com. IN DNAME

local-<%= @local_domain %>.yelpcorp.com

Obvious things like syslog.local - A or CNAME Less obvious things - TXT records (s3 bucket names?)

45

Page 46: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Custom certnamesnode /^aws-srv-.*/ {

!if Facter["is_ec2"].value == 'true' and Facter['ec2_instance_class'].value != ‘unknown' certname = “aws-#{Facter['ec2_instance_class'].value}- #{Facter[‘aws_availability_zone'].value}- #{Facter['ec2_instanceid'].value}" end !• ENC alternative - with disadvantages - nodes could lie! • SOA images are locked down anyway • Autosign dangerous!?!

46

Page 47: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Better testing!

47

Page 48: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Image acceptance testing

• Take the base image • Bring a real application up in a real production-

like environment • Hit it’s load balancer

!• Run the application’s integration tests. • Test things about the environment too.

48

Page 49: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Image as application paradigm

• One AMI per application • Want the whole cluster to be the same, all the time • Don’t want adhoc puppet runs - they can break

things! • Run puppet once, at build time.

49

‘Immutable’ servers.

Page 50: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Simian army• Asgard • Manages ELBs and ASGs • Assumes it owns a VPC and 1 VPC per account

50

Page 51: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Simian army• Asgard • Manages ELBs and ASGs • Assumes it owns a VPC and 1 VPC per account

!!

• Janitor monkey • Clean up untagged instances + AMIs • No launch groups! Argh.. (Just ask amazon to

increase your limit to 2000?)

51

Page 52: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Application = image in more detail

• Build a base AMI ready for applications • Store the AMI ID

• Per application AMI built off this. !

• Install a test app in it and validate that. • Pass the base AMI id between build stages. • Normal apps use base image from the final build

52

Page 53: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

AMIs for app deployment: The bad parts!

• AMI creation is slooooow • Copying AMIs is sloooooow • AMIs only work on AWS • Dev and ops must be in lockstep • Pushes the boundaries • Your app needs to be releasable ALL

the time53

Page 54: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Issues with ‘Immutable’ servers

• Immutable is a lie! • Fixing issues = redeploy. No fun at 3am

!• Orchestration helps! (<3 mcollective)

!• Prediction:

AMI per application will stop being a thing. Because Docker!

54

Page 55: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Conclusion

• There is no ‘right’ infrastructure • I don’t have all the answers! • Come help me find them:

http://www.yelp.co.uk/careers?jvi=ogVTXfwL !Links: http://www.slideshare.net/bobtfish http://forge.puppetlabs.com/bobtfish/aws_api https://gist.github.com/bobtfish/9970919

55

Page 56: Puppet Camp London 2014: Chasing AMI: baking Amazon machine images with Jenkins, Packer and Puppet - Tom Doran, Yelp

Conclusion

• There is no ‘right’ infrastructure • I don’t have all the answers! • Come help me find them:

http://www.yelp.co.uk/careers?jvi=ogVTXfwL !Links: http://www.slideshare.net/bobtfish http://forge.puppetlabs.com/bobtfish/aws_api https://gist.github.com/bobtfish/9970919

56