Puppet Data Mining

66
Puppet Data Mining Report processors, stored configs and more PuppetCamp 22nd March 2012 gareth rushgrove | morethanseven.net http://www.flickr.com/photos/map408/2412123378

description

Talk given at the 6th PuppetCamp in Edinburgh.Covers some of the useful information puppet stores and how to get at it.

Transcript of Puppet Data Mining

Page 1: Puppet Data Mining

Puppet Data MiningReport processors, stored configs and more

PuppetCamp 22nd March 2012

gareth rushgrove | morethanseven.net http://www.flickr.com/photos/map408/2412123378

Page 2: Puppet Data Mining

Gareth Rushgrove @garethr

gareth rushgrove | morethanseven.net

Page 3: Puppet Data Mining

Blog at morethanseven.net

gareth rushgrove | morethanseven.net

Page 4: Puppet Data Mining

Curate devopsweekly.com

gareth rushgrove | morethanseven.net

Page 5: Puppet Data Mining

Work at UK Government Digital Service

Text

gareth rushgrove | morethanseven.net

Page 6: Puppet Data Mining

Serious Government Business

gareth rushgrove | morethanseven.net

Page 7: Puppet Data Mining

http://www.flickr.com/photos/iancarroll/5027441664gareth rushgrove | morethanseven.net

Puppet data

- Why do we want it?- How do we get our hands on it- What can we build with it

Page 8: Puppet Data Mining

http://www.flickr.com/photos/iancarroll/5027441664gareth rushgrove | morethanseven.net

Puppet data

- Why do we want it?- How do we get our hands on it- What can we build with it

Page 9: Puppet Data Mining

http://www.flickr.com/photos/iancarroll/5027441664gareth rushgrove | morethanseven.net

Puppet data

- Why do we want it?- How do we get our hands on it- What can we build with it

Page 10: Puppet Data Mining

Why

Page 11: Puppet Data Mining

gareth rushgrove | morethanseven.net

Single source of truth

http://www.flickr.com/photos/joeshlabotnik/4132307070/

Page 12: Puppet Data Mining

gareth rushgrove | morethanseven.net

Example: find a list of hostnames

- Spreadsheets- Wiki- Deployment scripts- Application code- SSH configs- More deployment scripts- Monitoring configuration

Page 13: Puppet Data Mining

http://www.flickr.com/photos/nettsu/5276327339gareth rushgrove | morethanseven.net

Operational reports

Page 14: Puppet Data Mining

gareth rushgrove | morethanseven.net

Example: hardware spreadsheet

Company hardware

Page 15: Puppet Data Mining

gareth rushgrove | morethanseven.net

Hooks for tooling

http://www.flickr.com/photos/nickstone333/3135318558

Page 16: Puppet Data Mining

gareth rushgrove | morethanseven.net

Example: Nagios integration

Page 17: Puppet Data Mining

gareth rushgrove | morethanseven.net

Example: Rundeck integration

Page 18: Puppet Data Mining

How

Page 19: Puppet Data Mining

gareth rushgrove | morethanseven.net

Where to find the data

- Report processors- Stored configurations- Puppet internal APIs

Page 20: Puppet Data Mining

http://www.flickr.com/photos/nathaninsandiego/3757033518gareth rushgrove | morethanseven.net

Report processors

Page 21: Puppet Data Mining

[agent]report = truepluginsync = true [master]reports = storepluginsync = true

gareth rushgrove | morethanseven.net

Configuration

Page 22: Puppet Data Mining

[agent]report = truepluginsync = true [master]reports = store,http,log,samplepluginsync = true

gareth rushgrove | morethanseven.net

Adding reports

Page 23: Puppet Data Mining

gareth rushgrove | morethanseven.net

Built in

Page 24: Puppet Data Mining

gareth rushgrove | morethanseven.net

Store

Store the YAML report on disk. Each host sends its report as a YAML dump and this just stores the file on disk, in the reportdir directory.

Page 25: Puppet Data Mining

gareth rushgrove | morethanseven.net

Log

Send all received logs to the local log destinations. Usually the log destination is syslog.

Page 26: Puppet Data Mining

gareth rushgrove | morethanseven.net

HTTP

Send report information via HTTP to the reporturl. Each host sends its report as a YAML dump and this sends this YAML to a client via HTTP POST.

Page 27: Puppet Data Mining

gareth rushgrove | morethanseven.net

Tagmail

This report sends specific log messages to specific email addresses based on the tags in the log messages.

Page 28: Puppet Data Mining

gareth rushgrove | morethanseven.net

RRDgraph

Graph all available data about hosts using the RRD library.

Page 29: Puppet Data Mining

gareth rushgrove | morethanseven.net

Simple report structure

.└── sample-report ├── lib │   └── puppet │   └── reports │   └── sample.rb └── manifests └── init.pp

Page 30: Puppet Data Mining

gareth rushgrove | morethanseven.net

Simple report processor

require 'puppet'require 'yaml'require 'logger'

LOG = Logger.new('/tmp/puppet.log')

Puppet::Reports.register_report(:sample) do def process message = "Puppet run for #{self.host} #{self.status}" Puppet.debug "Hello from sample report processor" LOG.info message endend

Page 31: Puppet Data Mining

gareth rushgrove | morethanseven.net

Register report

require 'puppet'require 'yaml'require 'logger'

LOG = Logger.new('/tmp/puppet.log')

Puppet::Reports.register_report(:sample) do def process message = "Puppet run for #{self.host} #{self.status}" Puppet.debug "Hello from sample report processor" LOG.info message endend

Page 32: Puppet Data Mining

gareth rushgrove | morethanseven.net

Do something with the data in self

require 'puppet'require 'yaml'require 'logger'

LOG = Logger.new('/tmp/puppet.log')

Puppet::Reports.register_report(:sample) do def process message = "Puppet run for #{self.host} #{self.status}" Puppet.debug "Hello from sample report processor" LOG.info message endend

Page 33: Puppet Data Mining

gareth rushgrove | morethanseven.net

Open source examples

http://www.flickr.com/photos/nettsu/5771348892

Page 34: Puppet Data Mining

gareth rushgrove | morethanseven.net

IRC/Campfire

Page 35: Puppet Data Mining

gareth rushgrove | morethanseven.net

IRC/Campfire

Page 36: Puppet Data Mining

gareth rushgrove | morethanseven.net

Ganglia

Page 37: Puppet Data Mining

gareth rushgrove | morethanseven.net

Graphs!

Page 38: Puppet Data Mining

gareth rushgrove | morethanseven.net

Zendesk

Page 39: Puppet Data Mining

gareth rushgrove | morethanseven.net

James Turnbull will have got there first

Page 40: Puppet Data Mining

gareth rushgrove | morethanseven.net

Stored configuration database

Page 41: Puppet Data Mining

gareth rushgrove | morethanseven.net

Configuration

[master]storeconfigs = truedbadapter = mysqldbuser = puppetdbpassword = passworddbserver = localhostdbsocket = /var/run/mysql.sock

Page 42: Puppet Data Mining

gareth rushgrove | morethanseven.net

SQL

http://www.flickr.com/photos/nettsu/4997777753

Page 43: Puppet Data Mining

mysql> SHOW TABLES;+------------------+| Tables_in_puppet |+------------------+| fact_names || fact_values || hosts || inventory_facts || inventory_nodes || param_names || param_values || puppet_tags || resource_tags || resources || source_files |+------------------+11 rows in set (0.00 sec)

gareth rushgrove | morethanseven.net

Lots of tables to explore

Page 44: Puppet Data Mining

mysql> SELECT name,ip,environment,last_compile FROM hosts;+--------------------+-----------------+-------------+---------------------+| name | ip | environment | last_compile |+--------------------+-----------------+-------------+---------------------+| ubuntu.localdomain | 192.168.157.129 | production | 2012-03-04 21:19:41 |+--------------------+-----------------+-------------+---------------------+1 row in set (0.00 sec)

gareth rushgrove | morethanseven.net

Easily get a list of hosts

Page 45: Puppet Data Mining

mysql> SELECT filename,updated_at FROM source_files;+-----------------------------------------------------+---------------------+| filename | updated_at |+-----------------------------------------------------+---------------------+| NULL | 2011-10-11 10:34:36 || /etc/puppet/modules/users/manifests/init.pp | 2011-10-12 14:13:49 || /etc/puppet/modules/nagios/manifests/init.pp | 2011-10-12 14:13:49 || /etc/puppet/modules/ntp/manifests/init.pp | 2011-10-12 14:13:50 || /etc/puppet/modules/base_packages/manifests/init.pp | 2011-10-12 14:13:50 || /etc/puppet/modules/sudo/manifests/init.pp | 2011-10-12 14:13:50 || /etc/puppet/modules/apt/manifests/init.pp | 2011-10-12 14:13:50 || /etc/puppet/modules/logrotate/manifests/init.pp | 2011-10-12 14:13:51 || /etc/puppet/modules/ganglia/manifests/init.pp | 2011-10-12 14:13:52 || /etc/puppet/modules/motd/manifests/init.pp | 2011-10-12 14:13:57 || /etc/puppet/manifests/classes.pp | 2011-10-12 14:17:25 || /etc/puppet/modules/mysql/manifests/init.pp | 2011-10-12 14:17:25 || /etc/puppet/modules/apache2/manifests/init.pp | 2011-10-12 14:17:25 || /etc/puppet/modules/passenger/manifests/init.pp | 2011-10-12 14:17:26 |+-----------------------------------------------------+---------------------+

gareth rushgrove | morethanseven.net

Other interesting data too

Page 46: Puppet Data Mining

gareth rushgrove | morethanseven.net

Active Record

http://www.flickr.com/photos/simplebitsdan/480696708

Page 47: Puppet Data Mining

#!/usr/bin/env ruby

require 'puppet/rails'

Puppet[:config] = '/etc/puppet/puppet.conf'Puppet.parse_configconfig = Puppet.settings.instance_variable_get(:@values)master_config = config[:master]

gareth rushgrove | morethanseven.net

Load Puppet master configuration

Page 48: Puppet Data Mining

adapter = master_conf[:dbadapter]args = {:adapter => adapter, :log_level => master_conf[:rails_loglevel]}

args[:host] = master_conf[:dbserver]args[:username] = master_conf[:dbuser]args[:password] = master_conf[:dbpassword]args[:database] = master_conf[:dbname]args[:database] = "puppet" unless not args[:database].to_s.empty?args[:port] = master_conf[:dbport]socket = master_conf[:dbsocket]args[:socket] = socket unless socket.to_s.empty?

gareth rushgrove | morethanseven.net

Map database connection settings

Page 49: Puppet Data Mining

ActiveRecord::Base.establish_connection(args)

Puppet::Rails::Host.all.each { |h| puts "#{h.name}"}

gareth rushgrove | morethanseven.net

Make an active record query

Page 50: Puppet Data Mining

gareth rushgrove | morethanseven.net

Example run

⚡ ./list.rbubuntu.localdomain

Page 51: Puppet Data Mining

gareth rushgrove | morethanseven.net

Code spelunking

Page 52: Puppet Data Mining

#!/usr/bin/env ruby

require 'puppet'Puppet[:config] = "/etc/puppet/puppet.conf"Puppet.parse_configPuppet[:clientyamldir] = Puppet[:yamldir]Puppet::Node.indirection.terminus_class = :yaml

gareth rushgrove | morethanseven.net

Load Puppet master configuration

Page 53: Puppet Data Mining

nodes = Puppet::Node.indirection.search("*")nodes.each do |n| facts = Puppet::Node::Facts.indirection.find(n.name) tags = Puppet::Resource::Catalog.indirection.find(n.name).tags puts "#{n.name} - #{tags.join(', ')}"end

gareth rushgrove | morethanseven.net

Make a query using the internal API

Page 54: Puppet Data Mining

gareth rushgrove | morethanseven.net

Needs root permissions

⚡ sudo ./puppettags.rbubuntu.localdomain - settings, default, node

Page 55: Puppet Data Mining

What

Page 56: Puppet Data Mining

gareth rushgrove | morethanseven.net

Command line tools

⚡ ./puppetlast.rb+-----------+-----------------+| hostname | last puppet run |+-----------+-----------------+| hostname4 | 100 minutes || hostname1 | 25 minutes || hostname5 | 10 minutes || hostname2 | 15 minutes || hostname3 | 5 minutes |+-----------+-----------------+

Page 57: Puppet Data Mining

gareth rushgrove | morethanseven.net

Dashboards

Page 58: Puppet Data Mining

gareth rushgrove | morethanseven.net

web-puppet

Page 59: Puppet Data Mining

gareth rushgrove | morethanseven.net

JSON over HTTP

Page 60: Puppet Data Mining

gareth rushgrove | morethanseven.net

capistrano-puppet

Page 61: Puppet Data Mining

require 'capistrano-puppet'

web_puppet = CapistranoPuppet::Server.new( 'http://username:password@localhost:9295')

role :web doweb_puppet.get_servers('webserver')

end

gareth rushgrove | morethanseven.net

Get hosts from puppet

Page 62: Puppet Data Mining

gareth rushgrove | morethanseven.net

Visualisation

Page 63: Puppet Data Mining

gareth rushgrove | morethanseven.net

Your imagination

?

Page 64: Puppet Data Mining

Links

- web-puppet - https://github.com/garethr/web-puppet- capistrano-puppet - https://github.com/garethr/capistrano-puppet- puppet-ganglia - https://github.com/jamtur01/puppet-ganglia- puppet-zendesk - https://github.com/jamtur01/puppet-zendesk- puppet-irc - https://github.com/jamtur01/puppet-irc- puppet-campfire - https://github.com/jamtur01/puppet-campfire

gareth rushgrove | morethanseven.net

Page 65: Puppet Data Mining

http://www.flickr.com/photos/benterrett/6852348725/

One more thing

gareth rushgrove | morethanseven.net

Page 66: Puppet Data Mining

Questions?

gareth rushgrove | morethanseven.net http://flickr.com/photos/psd/102332391/