78
01

Groovy DevOps in the Cloud for GR8Conf US 2015

Embed Size (px)

Citation preview

Page 1: Groovy DevOps in the Cloud for GR8Conf US 2015

01

Page 2: Groovy DevOps in the Cloud for GR8Conf US 2015

About me02

Page 3: Groovy DevOps in the Cloud for GR8Conf US 2015

Andrey AdamovichBio: Developer, coach, speaker, author

Company: Aestas/IT (http://aestasit.com)

E­mail: [email protected]

Linkedin: http://www.linkedin.com/in/andreyadamovich

Lanyrd: http://lanyrd.com/profile/andrey­adamovich

GitHub: https://github.com/aadamovich

SO: http://stackoverflow.com/users/162792/andrey­adamovich

Twitter: @codingandrey, @aestasit

••••••••

03

Page 4: Groovy DevOps in the Cloud for GR8Conf US 2015

What's this presentation about?DevOps

Intrastructure Provisioning

Continuous Integration

Continuous Delivery

••••

04

Page 5: Groovy DevOps in the Cloud for GR8Conf US 2015

TechnologiesGroovy ­ http://groovy.codehaus.org

Gradle ­ http://gradle.org

Jenkins ­ http://jenkins­ci.org

Puppet ­ http://puppetlabs.com

AWS ­ http://aws.amazon.com

•••••

05

Page 6: Groovy DevOps in the Cloud for GR8Conf US 2015

Developers +Operations =

?06

Page 7: Groovy DevOps in the Cloud for GR8Conf US 2015

First Blood07

Page 8: Groovy DevOps in the Cloud for GR8Conf US 2015

Ant + Gradleant.taskdef(

name: 'scp',

classname: 'o.a.t.a.t.o.ssh.Scp',

classpath: configurations.secureShell.asPath)

ant.taskdef(

name: 'sshexec',

classname: 'o.a.t.a.t.o.ssh.SSHExec',

classpath: configurations.secureShell.asPath)

01.

02.

03.

04.

05.06.

07.

08.

09.

08

Page 9: Groovy DevOps in the Cloud for GR8Conf US 2015

Simple callant.sshexec(

host: host,

username: user,

password: password,

command: command,

trust: 'true',

failonerror: failOnError)

01.

02.

03.

04.

05.

06.

07.

09

Page 10: Groovy DevOps in the Cloud for GR8Conf US 2015

Next step: wrapper functiondef ssh(String command,

Properties props,

boolean failOnError = false,

String suCommandQuoteChar = "'",

String outputProperty = null)

...

01.

02.

03.

04.

05.

06.

07.

10

Page 11: Groovy DevOps in the Cloud for GR8Conf US 2015

Next step: wrapper functiondef scp(String file,

String remoteDir,

Properties props)

...

01.

02.

03.

04.

05.

11

Page 12: Groovy DevOps in the Cloud for GR8Conf US 2015

Task example Itask installFonts <<

forAllServers props ‐>

ssh('yes | yum install *font*', props)

01.

02.

03.

04.

05.

12

Page 13: Groovy DevOps in the Cloud for GR8Conf US 2015

Task example IItask uninstallNginx <<

forAllServers props ‐>

ssh('/etc/init.d/nginx stop', props)

ssh('yes | yum remove nginx', props, true)

ssh('rm ‐rf /etc/yum.repos.d/nginx.repo', props)

ssh('rm ‐rf /var/log/nginx', props)

ssh('rm ‐rf /etc/nginx /var/nginx', props)

01.

02.

03.

04.

05.

06.

07.

08.

09. 13

Page 14: Groovy DevOps in the Cloud for GR8Conf US 2015

DrawbacksNew connection each time

Excplicit repeating parameters

Complex scripts are hard to maintain

Tasks are not idempotent

••••

14

Page 15: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr

15

Page 16: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr featuresGroovy­based SSH DSL for:

Remote command execution

File uploading/downloading

Tunneling

•••

16

Page 17: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (import)@Grab(

group='com.aestasit.infrastructure.sshoogr',

module='sshoogr',

version='0.9.16')

import static com.aestasit.ssh.DefaultSsh.*

01.

02.

03.

04.

05.

17

Page 18: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (defaults)defaultUser = 'root'

defaultKeyFile = new File('secret.pem')

execOptions

verbose = true

showCommand = true

01.

02.

03.

04.

05.

06.

18

Page 19: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (connection)remoteSession

url = 'user2:654321@localhost:2222'

exec 'rm ‐rf /tmp/*'

exec 'touch /var/lock/my.pid'

remoteFile('/var/my.conf').text = "enabled=true"

01.

02.

03.

04.

05.

06.

19

Page 20: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (multi­line content)remoteFile('/etc/yum.repos.d/puppet.repo').text = '''

[puppet]

name=Puppet Labs Packages

baseurl=http://yum.puppetlabs.com/el/

enabled=0

gpgcheck=0

'''

01.

02.

03.

04.

05.

06.

07.

20

Page 21: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (file copying)remoteSession

scp

from localDir "$buildDir/application"

into remoteDir '/var/bea/domain/application'

01.

02.

03.

04.

05.

06.

21

Page 22: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (command result)def result = exec(command: '/usr/bin/mycmd',

failOnError: false, showOutput: false)

if (result.exitStatus == 1)

result.output.eachLine line ‐>

if (line.contains('WARNING'))

throw new RuntimeException("Warning!!!")

01.

02.

03.

04.

05.

06.

07.

08.

09. 22

Page 23: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (shortcuts)if (ok('/usr/bin/mycmd'))

...

if (fail('/usr/bin/othercmd'))

...

01.

02.

03.

04.

05.

06.

23

Page 24: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (tunnels)tunnel('1.2.3.4', 8080) int localPort ‐>

def url = "http://localhost:$localPort/flushCache"

def result = new URL(url).text

if (result == 'OK')

println "Cache is flushed!"

else

throw new RuntimeException(result)

01.

02.

03.

04.

05.

06.

07.

08.

09. 24

Page 25: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr usage (prefix/suffix)prefix('sudo ')

exec 'rm ‐rf /var/log/abc.log'

exec 'service abc restart'

suffix(' >> output.log')

exec 'yum ‐y install nginx'

exec 'yum ‐y install mc'

exec 'yum ‐y install links'

01.

02.

03.

04.

05.

06.

07.

08.

09. 25

Page 26: Groovy DevOps in the Cloud for GR8Conf US 2015

Still problemsComplex scripts are still not easy to maintain

Scripts are usually not idempotent••

26

Page 27: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet27

Page 28: Groovy DevOps in the Cloud for GR8Conf US 2015

Why Puppet?More mature than competition

Large community

Readable DSL

Good acceptance from DEVs and OPs

No need to learn Ruby ;)

•••••

28

Page 29: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet example

29

Page 30: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet provisioning

30

Page 31: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet provisioning

31

Page 32: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet provisioning

32

Page 33: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet provisioning

33

Page 34: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet state management

34

Page 35: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet state management

35

Page 36: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet state management

36

Page 37: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet modules

37

Page 38: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet modules

38

Page 39: Groovy DevOps in the Cloud for GR8Conf US 2015

Puppet modules

39

Page 40: Groovy DevOps in the Cloud for GR8Conf US 2015

Deploymentvs.

Infrastructuremanagement40

Page 41: Groovy DevOps in the Cloud for GR8Conf US 2015

Push vs. Pull41

Page 42: Groovy DevOps in the Cloud for GR8Conf US 2015

Pull

42

Page 43: Groovy DevOps in the Cloud for GR8Conf US 2015

Push

43

Page 44: Groovy DevOps in the Cloud for GR8Conf US 2015

Sshoogr +Gradle +Puppet44

Page 45: Groovy DevOps in the Cloud for GR8Conf US 2015

Upload modulestask uploadModules <<

remoteSession

exec 'rm ‐rf /tmp/repo.zip'

scp

from localFile "$buildDir/repo.zip"

into remoteDir "/root"

...

01.

02.

03.

04.

05.

06.

07.

08.

45

Page 46: Groovy DevOps in the Cloud for GR8Conf US 2015

Upload modules ...

exec 'rm ‐rf /etc/puppet/modules'

exec 'unzip /tmp/repo.zip ‐d /etc/puppet/modules'

01.

02.

03.

04.

05.

46

Page 47: Groovy DevOps in the Cloud for GR8Conf US 2015

Apply manifeststask puppetApply(dependsOn: uploadModules) <<

remoteSession

scp

from localFile "$buildDir/setup.pp"

into remoteDir "/tmp"

exec 'puppet apply /tmp/setup.pp'

01.

02.

03.

04.

05.

06.

07.

08.

09. 47

Page 48: Groovy DevOps in the Cloud for GR8Conf US 2015

What we solved?Separated infrastructure state description and operations tasks

Scripts became more maintainable and idempotent••

48

Page 49: Groovy DevOps in the Cloud for GR8Conf US 2015

In the meanwhile...We started developing complex/generic Puppet modules

Modules need proper testing

...on different platforms

•••

49

Page 50: Groovy DevOps in the Cloud for GR8Conf US 2015

Do you test, right?How to test this stuff?

How to reuse a JUnit approach to testing?

We wanted things to be SIMPLE!

•••

50

Page 51: Groovy DevOps in the Cloud for GR8Conf US 2015

PUnit

51

Page 52: Groovy DevOps in the Cloud for GR8Conf US 2015

PUnitSimple testing tool for verifying remote server state

Uses Sshoogr and JUnit

Reuse reporting features of JUnit

As simple as ...

••••

52

Page 53: Groovy DevOps in the Cloud for GR8Conf US 2015

PUnit example (derby)class DerbyInstallTest

extends BasePuppetIntegrationTest

@Before

void installDerby()

apply("include derby")

...

01.

02.

03.

04.

05.

06.

07.

08.

53

Page 54: Groovy DevOps in the Cloud for GR8Conf US 2015

PUnit example (derby)@Test

void ensureDerbyRunning()

command('service derby status > derbystatus.log')

assertTrue fileText("/root/derbystatus.log")

.contains('Derby')

assertTrue fileText("/root/derbystatus.log")

.contains('is running.')

01.

02.

03.

04.

05.

06.

07.

08.

54

Page 55: Groovy DevOps in the Cloud for GR8Conf US 2015

PUnit example (derby)@Test

void ensureCanConnect()

Thread.sleep(10000)

uploadScript()

command('/opt/derby/db‐derby‐10.9.1.0‐bin/bin/ij ' +

'testDataScript.sql > derbytest.log')

...

01.

02.

03.

04.

05.

06.

07.

55

Page 56: Groovy DevOps in the Cloud for GR8Conf US 2015

Continuous integration

56

Page 57: Groovy DevOps in the Cloud for GR8Conf US 2015

Jenkins build

57

Page 58: Groovy DevOps in the Cloud for GR8Conf US 2015

Nextproblem?

58

Page 59: Groovy DevOps in the Cloud for GR8Conf US 2015

ScalabilityHow do we test on different OS?

How do we run parallel tests on multiple architectures?

How do we avoid selling our houses?

•••

59

Page 60: Groovy DevOps in the Cloud for GR8Conf US 2015

Amazon WebServices

60

Page 61: Groovy DevOps in the Cloud for GR8Conf US 2015

Elastic Compute CloudMature

Great API

Virtual hardware variety

OS variety

••••

61

Page 62: Groovy DevOps in the Cloud for GR8Conf US 2015

Gramazon

62

Page 63: Groovy DevOps in the Cloud for GR8Conf US 2015

GramazonGroovy­based API for interacting with EC2

Integration with Gradle••

63

Page 64: Groovy DevOps in the Cloud for GR8Conf US 2015

Gramazon example Itask startInstance(type: StartInstance)

keyName 'cloud‐do'

securityGroup 'cloud‐do'

instanceName 'gramazon/cloud‐do'

stateFileName 'cloud‐do.json'

ami 'ami‐6f07e418'

instanceType 't1.micro'

waitForStart true

01.

02.

03.

04.

05.

06.

07.

08.

09. 64

Page 65: Groovy DevOps in the Cloud for GR8Conf US 2015

Gramazon example IItask terminateInstance(type: TerminateInstance)

stateFileName 'cloud‐do.json'

01.

02.

03.

65

Page 66: Groovy DevOps in the Cloud for GR8Conf US 2015

The flowStart instance(s)

Upload manifests

Run tests

Generate report

Terminate instance(s)

1.

2.

3.

4.

5.

66

Page 67: Groovy DevOps in the Cloud for GR8Conf US 2015

Next issue?67

Page 68: Groovy DevOps in the Cloud for GR8Conf US 2015

Imgr

68

Page 69: Groovy DevOps in the Cloud for GR8Conf US 2015

ImgrA tool for building images

Inspired by Packer••

69

Page 70: Groovy DevOps in the Cloud for GR8Conf US 2015

SupportsShell

Puppet••

70

Page 71: Groovy DevOps in the Cloud for GR8Conf US 2015

Configuration example

71

Page 72: Groovy DevOps in the Cloud for GR8Conf US 2015

Summary72

Page 73: Groovy DevOps in the Cloud for GR8Conf US 2015

Images, manifests, tasks

73

Page 74: Groovy DevOps in the Cloud for GR8Conf US 2015

The big picture

74

Page 75: Groovy DevOps in the Cloud for GR8Conf US 2015

ConclusionsGroovy/Gradle is an ultimate automation glue!

Reuse your existing Java knowledge

...to build a bridge between DEVs and OPs

Reuse development best practices for OPs

Infrastructure configuration is outsourcable now!

Automate!

••••••

75

Page 76: Groovy DevOps in the Cloud for GR8Conf US 2015

Source codeSshoogr: https://github.com/aestasit/sshoogr

Sshoogr Gradle: https://github.com/aestasit/sshoogr­gradle

Groowin: https://github.com/aestasit/groowin

Groowin Gradle: https://github.com/aestasit/groowin­gradle

PUnit: https://github.com/aestasit/puppet­unit

Gramazon: https://github.com/aestasit/gramazon

Imgr: https://github.com/aestasit/imgr

•••••••

76

Page 77: Groovy DevOps in the Cloud for GR8Conf US 2015

Questions?77

Page 78: Groovy DevOps in the Cloud for GR8Conf US 2015

Thank you!78