Node Reports
As we have all facts, classes and agents for nodes we can do some custom reporting on all of these.
The mco inventory tool is a generic node and network reporting tool, it has basic scripting abilities.
Note: This is an emerging feature, the scripting language is likely to change
Node View
To obtain a full inventory for a given node you can run mco inventory like this:
% mco inventory your.node.com
Inventory for your.node.com:
Server Statistics:
Start Time: Mon Sep 13 18:24:46 +0100 2010
Config File: /etc/mcollective/server.cfg
Process ID: 5197
Total Messages: 62
Messages Passed Filters: 62
Messages Filtered: 0
Replies Sent: 61
Total Processor Time: 0.18 seconds
System Time: 0.01 seconds
Agents:
discovery echo nrpe
package process puppetd
rpctest service
Configuration Management Classes:
aliases apache
<snip>
Facts:
architecture => i386
country => de
culturemotd => 1
customer => rip
diskdrives => xvda
<snip>
This gives you a good idea of all the details available for a node.
Collective List
We have a concept of Subcollectives and you can use the inventory application to get a quick report on all known collectives:
$ mco inventory --list-collectives
* [ ===================================== ] 52 / 52
Collective Nodes
========== =====
za_collective 2
us_collective 7
uk_collective 19
de_collective 24
eu_collective 45
mcollective 52
Total nodes: 52
Collective Map
You can also create a DOT format graph of your collective:
$ mco inventory --collective-graph collective.dot
Retrieving collective info....
Graph of 52 nodes has been written to collective.dot
The graph will be a simple dot graph that can be viewed with Graphviz, Gephi or other compatible software.
Custom Reports
You can create little scriptlets and pass them into mco inventory with the –script option.
You have the following data available to your reports:
Variable | Description |
---|---|
time | The time the report was started, normal Ruby Time object |
identity | The sender id |
facts | A hash of facts |
agents | An array of agents |
classes | An array of CF Classes |
printf style reports
Lets say you now need a report of all your IBM hardware listing hostname, serial number and product name you can write a scriptlet like this:
1 inventory do
2 format "%s:\t\t%s\t\t%s"
3
4 fields { [ identity, facts["serialnumber"], facts["productname"] ] }
5 end
And if saved as inventory.mc run it like this:
% mco inventory -W "productname=/IBM|BladeCenter/" --script inventory.mc
xx12: 99xxx21 BladeCenter HS22 -[7870B3G]-
xx9: 99xxx46 BladeCenter HS22 -[7870B3G]-
xx10: 99xxx29 BladeCenter HS22 -[7870B3G]-
yy1: KDxxxFR IBM System x3655 -[79855AY]-
xx5: 99xxx85 IBM eServer BladeCenter HS21 -[8853GLG]-
<snip>
We’ll add more capabilities in the future, for now you can access facts as a hash, agents and classes as arrays as well as identity as a string.
Perl format style reports
To use this you need to install the formatr gem, once that’s installed you can create a report scriptlet like below:
1 formatted_inventory do
2 page_length 20
3
4 page_heading <<TOP
5
6 Node Report @<<<<<<<<<<<<<<<<<<<<<<<<<
7 time
8
9 Hostname: Customer: Distribution:
10 -------------------------------------------------------------------------
11 TOP
12
13 page_body <<BODY
14
15 @<<<<<<<<<<<<<<<< @<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
16 identity, facts["customer"], facts["lsbdistdescription"]
17 @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
18 facts["processor0"]
19 BODY
20 end
Here we create a paged report - 20 nodes per page - with a heading section and a 2 line report per node with identity, customer, distribution and processor.
The output looks like this:
% mco inventory -W "/dev_server/" --script inventory.mc
Node Report Sun Aug 01 10:30:57 +0100
Hostname: Customer: Distribution:
-------------------------------------------------------------------------
dev1.one.net rip CentOS release 5.5 (Final)
AMD Athlon(tm) 64 X2 Dual Core Processor
dev1.two.net xxxxxxx CentOS release 5.5 (Final)
AMD Athlon(tm) 64 X2 Dual Core Processor
Writing these reports are pretty ugly I freely admit, however it avoids designing our own reporting engine and it’s pretty good for kicking out simple reports. You can see the perlform man page for details of the reporting layouts, ours is pretty close to that thanks to Formatr