PuppetDB, Puppet
Explorer and
puppetdbquery
Erik Dalén
PuppetDB
Aclojure service with a PostgreSQL
backend.
Stores data produced by Puppet:
‣ facts
‣ catalogs
‣ reports
Resource collections
Allows you to export and collect
resources.
class ssh {
# Declare:
@@sshkey { $hostname:
type => dsa,
key => $sshdsakey,
}
# Collect:
Sshkey <<| |>>
}
Query API
PuppetDB has a rich queryAPI.
Can query nodes, environments,
facts, fact paths, catalogs,
resources, edges, reports and
events.
Allows subqueries between
endpoints.
Query API example
["and",
["in","certname",
["extract","certname",
["select_fact_contents",
["and",
["=","path",["lsbdistcodename"]],
["=","value","squeeze"]]]]],
["in","certname",
["extract","certname",
["select_resources",
["and",
["=","type","Class"],
["=","title","Nginx"],
["=","exported",false]]]]]]
lsbdistcodename=squeeze and class[nginx]
same query in puppetdbquery
puppetdbquery
Amodule for Puppet for querying
PuppetDB with:
‣ functions
‣ clitool/puppetface
‣ hierabackend
‣ RubyAPI
github.com/dalen/puppet-
puppetdbquery
forge.puppetlabs.com/dalen/
puppetdbquery
Query syntax
Comparison operators
=
!=
>
>=
<
<=
~
!~
Logical Operators
and
or
not
Fact comparisons
factname = value
uptime.days > 209
apt_package_updates.* ~ openssl
Resource expressions
type[name] { parameter = value }
Syntactic sugar and advanced stuff
Date expressions
@yesterday
@"feb 1 2015"
Subqueries
#node.latest_report_status=failed
#node { report_timestamp > @"4
hours ago" and report_timestamp <
@"2 hours ago" }
Poor mans mcollective
pssh -h <(puppet query nodes 'site=lon and class[nginx]') 
sudo service nginx restart
Puppet
Explorer
Puppet Explorer
Web UI forvisualizing data in
PuppetDB.
Made using CoffeeScript and
AngularJS
Borrows ideas from puppetdbquery
and contains a JavaScript
implementation of it called node-
puppetdbquery
Demo time

PuppetDB, Puppet Explorer and puppetdbquery