Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Building On Puppet and Puppet Forge

1,185 views

Published on

"Building on Puppet and Puppet Forge" by Pedro Pessoa of Server Density at Puppet Camp London 2014. Find the video here: http://puppetlabs.com/community/puppet-camp

Published in: Technology, Design
  • Be the first to comment

Building On Puppet and Puppet Forge

  1. 1. Building on Puppet http://www.rankpop.com/you-need-to-start-structuring-your-blog-posts-asap/
  2. 2. HTTP Load Balancer from Pound to nginx Server Density v2: New version : new load balancer nginx : - WebSockets - SPDY standard keep : - modules pulled from our Gihub repo by the puppet master - use of Puppet Console and Live Management to trigger transient changes
  3. 3. Reinventing the wheel (don't) Writing our nginx module? - add yet another one to the collection of in-house developed modules community reach? - whether our problem had already been solved - or a kick start where we could stand on http://www.flickr.com/photos/conskeptical/
  4. 4. Going to the Forge
  5. 5. Going to the Forge
  6. 6. Integration A) get the actual code into the master puppet module install puppetlabs/nginx (or) git submodule add https://github.com/puppetlabs/puppetlabs­nginx.git  B) run it on existing nodes no parameterized classes on PE Console (2.8.x) (or) merge our site.pp (which is empty) and the console, it being an ENC and all - (how-merging-works)
  7. 7. Integration Our solution class serverdensity­nginx {     class { 'nginx': }     nginx::resource::upstream {        'socky_rack':           ensure => present,           members => split( $lbTargetHostsSocky, ',' ),     } (...)
  8. 8. nginx 'on-the-fly' update class serverdensity­nginx {     class { 'nginx': }     nginx::resource::upstream {        'socky_rack':           ensure => present,           members => split( $lbTargetHostsSocky, ',' ),     } (...)
  9. 9. nginx 'on-the-fly' update
  10. 10. nginx 'on-the-fly' update
  11. 11. nginx 'on-the-fly' update
  12. 12. nginx 'on-the-fly' update
  13. 13. Alternatives Puppet Labs nginx module: https://github.com/serverdensity/puppetlabs-nginx forked James Fryman's module: https://github.com/jfryman/puppet-nginx pick the later? Puppet Labs last update - 30th June 2011. https://github.com/serverdensity/puppetlabs-nginx
  14. 14. Extending Server Density Server Density collects server data from an open source agent deployed on each device Create a device on Server Density UI Copy the device ID (agent key) The agent reads the device ID from a config file: [Main] sd_url: http://mydomain.serverdensity.com agent_key: 8160b409de9d8a612ec8d964c5b26bf (...)
  15. 15. Extending Server Density Server Density v1:
  16. 16. Extending Server Density Server Density v1: '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'), } [Main] sd_url: http://boxedice.serverdensity.com agent_key: <%= sdAgentKey %> (...)
  17. 17. Extending Server Density Server Density v2:
  18. 18. Extending Server Density Server Density v2 – in action:
  19. 19. Extending Server Density Server Density v2 – in action:
  20. 20. 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 or use Server Density API to create a device on the fly and return the resulting agent key https://github.com/serverdensity/puppet-serverdensity
  21. 21. Extending Server Density 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
  22. 22. 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 (...) 
  23. 23. 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 = true res = https.start { |cx| cx.request(req) } (...) 
  24. 24. Extending Server Density Custom function: (...) device = PSON.parse(res.body) if device['status'] == 2 notice ["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', } (...) 
  25. 25. Extending Server Density Server Density v2: Next: Publishing to the Forge https://github.com/serverdensity/puppet-serverdensity
  26. 26. Pedro Pessoa pessoa@serverdensity.com http://serverdensity.com/puppetcamp/

×