puppet camp berlin 2015: pedro pessoa | puppet at the center of everything - with a little help from...

37
Puppet at the Puppet at the center of everything center of everything http://www.rankpop.com/you-need-to-start-structuring-your-blog-posts-asap/

Upload: netways

Post on 15-Jul-2015

37 views

Category:

Technology


0 download

TRANSCRIPT

Puppet at thePuppet at thecenter of everythingcenter of everything

http://www.rankpop.com/you-need-to-start-structuring-your-blog-posts-asap/

serverdensity.com/knockknock

Server Density Architecture

100+ servers – Ubuntu 12.04

50% Virtual

Nginx, Python, MongoDB

25TB data per month

Puppet Use Cases

Code deploys

Failover

Configuration

System Updates

http://www.arcomem.eu/wp-content/uploads/2011/03/usecases.png

http://www.flickr.com/photos/conskeptical/

Puppet Use CasesConfiguration

nginx::config::worker_rlimit_nofile: 30000nginx::config::worker_connections: 10240nginx::config::worker_processes: 4

storm::config_file: '/etc/storm/storm.yaml'storm::drpc::manage_service: falsestorm::drpc::enable: false

Forge modules - don't reinvent the wheel:https://forge.puppetlabs.com/jfryman/nginx

https://forge.puppetlabs.com/deric/storm

http://www.flickr.com/photos/conskeptical/

Puppet Use CasesConfiguration

include nginx

include storm

Puppet Use CasesCode deploys

Commit and wait for the build

buildbot.net

Puppet Use CasesCode deploys

Check what is deployed

Puppet Use CasesCode deploys

Deploy

Puppet Use CasesCode deploys

Deploy

Puppet::Type.type(:package).provide(:honshuu,        :parent => Puppet::Provider::Package) do   desc "Server Density deployinator"

package {  'honshuu­alerts­processing':     ensure   => present,     provider => honshuu,     require  => File['/var/www/'],     notify   => Service['celeryd­alerts','apache2'],}

Puppet Use CasesCode deploys

Deploy

MCollective magic

nginx 'on-the-fly' update

Puppet Use CasesFailover

nginx 'on-the-fly' update

class serverdensity­nginx{    class { 'nginx': }    nginx::resource::upstream {       'socky_rack':          ensure => present,          members => split( $lbTargetHostsSocky, ',' ),    }(...)

nginx 'on-the-fly' update

nginx 'on-the-fly' update

nginx 'on-the-fly' update

nginx 'on-the-fly' update

Puppet Use CasesSystem updates

Update apt cache – just to be sure

Puppet Use CasesSystem updates

Run

CANARIES=" \  hstage1.honshuu.dev \  hstage2.honshuu.dev \  hstage­lb1.honshuu.dev \  exm­a1.sng.amz \  ma1.dal.sl \  sdcom­web1.wdc.sl \  queues­rab2.wdc.sl \"

Puppet Use CasesSystem updates

Run

for i in $CANARIES  do    mco rpc puppetral ­I $i create type=exec        title="/bin/bash ­c 'apt­get dist­upgrade ­y'"done

Reducing the code baseMongoDB

class mongo­a{(…)191 lines of code+Templates for config files and init scripts

class mongo­c{(…)179 lines of code+Template for config file

Reducing the code baseMongoDB

class mongo­d{(…)257 lines of code+Templates for config files, init scripts, pam and limits

class mongo­s{(…)180 lines of code+Template for config file and init script

Reducing the code baseMongoDB

Forge module + Hierahttps://forge.puppetlabs.com/dwerder/mongodb

class site::mongomodule {   class { '::mongodb::globals':     manage_package_repo => true,     version             => '2.4.12'  } ­>  class { '::mongodb::server': verbose => true }}

Extending Server Density

Server Density collects server data from an open source agent deployed on each device

The agent reads the device ID from a config file:

[Main]sd_url: http://mydomain.serverdensity.comagent_key: 8160b409de9d8a612ec8d964c5b26bf(...)

Copy the device ID (agent key)

Create a device on Server Density UI

Server Density v1:

Extending Server Density

Server Density v1:

[Main]sd_url: http://boxedice.serverdensity.comagent_key: <%= sdAgentKey %>(...)

Extending Server Density

'sd­agent':    ensure => installed,

file {    'config.cfg':      path    => '/etc/sd­agent/config.cfg',      ensure  => file,      require => Package['sd­agent'],      content => template('sd­agent/config.erb'),}

Server Density v2:

Extending Server Density

Server Density v2 – in action:

Extending Server Density

Server Density v2 – in action:

Extending Server Density

Server Density v2 - implementation:

Manages the life cycle of Rackspace and Amazon cloud instances

A custom fact will return the cloud instance agent key

Extending Server Density

or use Server Density API to create a device on the fly and return the resulting agent key

https://github.com/serverdensity/puppet-serverdensity

Custom fact:

Facter.add(:agent_key, :timeout => 10) do    if File::exist?('/etc/sd­agent­key')        result = Facter::Util::Resolution.exec("cat /etc/sd­agent­key")    elsif Facter.value('ec2_instance_id')        uri = URI("http://ec2meta.serverdensity.com/latest/user­data")        req = Net::HTTP::Get.new(uri.request_uri)        res = Net::HTTP.start(uri.host, uri.port) {|http|                http.request(req)        }        result = res.body.split(':').last if res.code == 200    end

    setcode { result }end

Extending Server Density

Custom function:

(...)        agent_key = lookupvar("agent_key")

        # lookupvar returns undef if no value        # test against nil just in case        unless agent_key.nil? or agent_key == :undef            notice ["Agent Key Provided via Facter: #{ agent_key }"]            return agent_key        End(...) 

Extending Server Density

Custom function:

(...)base_url = "https://api.serverdensity.io"

filter = {  'type' => 'device',  'hostname' => hostname,}

filter_json = URI.escape(PSON.dump(filter))

uri =  URI("#{base_url}/inventory/devices?filter=#{filter_json}&token=#{token}")req = Net::HTTP::Get.new(uri.request_uri)https = Net::HTTP.new(uri.host, uri.port)https.use_ssl = trueres = https.start { |cx| cx.request(req) }(...) 

Extending Server Density

Custom function:

(...)device = PSON.parse(res.body)

if device['status'] == 2notice ["Device not found, creating a new one"]

uri = URI("#{ base_url }devices/add?account=#{ sd_url }")req = Net::HTTP::Post.new(uri.request_uri)req.basic_auth sd_username, sd_password

params = {  'name' => server_name,  'hostName' => hostname,  'notes' => 'Created automatically by puppet­serverdensity',}(...) 

Extending Server Density

Server Density v2:

Next: Publishing to the Forge

Extending Server Density

https://forge.puppetlabs.com/serverdensity/serverdensity_agent

Pedro Pessoa

[email protected]

serverdensity.com/knockknockblog.serverdensity.com