Adding bulks of SNMP hosts to cacti, updated
Monday, December 13, 2010 9:36:05 AM
I did some changes to the makefile I published last month. It would be too much to completely rewrite the blog post to adapt for the changes, so I am just publishing the update here, and you can do the diff yourself.There is still a lot of factorization left to do, I am leaving it to when I'll have more time. If, in the meanwhile, you come up with a better version, please leave a comment here.
I still have problems with LVS metrics, in particular: "LVS traffic in" is not getting any data. If you can spot the mistake and tell me, that would be much appreciated.
Have fun!
########################################################################
#
# This makefile tries to help you to automate the following tasks:
#
# - add an SNMP host to cacti
# - add a set of graphs to the host
# - add the host to a tree
#
# Before using this makefile, please check that the following settings
# are correct for your installation.
#
########################################################################
PHP=/usr/bin/php
CLI_DIR=/opt/cacti/cli
# Default tree where we add hosts to
DEFTREE_ID=1
# Default host template to use
HOST_TID=9
# Host template to use for LVS
LVS_HOST_TID=10
# In the following variables, you have:
# *_GTID: Graph Template ID
# *_QID: Query ID
# *_QTID: Query template ID
# Network interfaces
IFACE_GTID=2
IFACE_QID=1
IFACE_QTID=13
IFACE_FIELD=ifOperStatus
IFACE_VALUE=Up
# Individual CPUs
CPUS_GTID=27
CPUS_QID=9
CPUS_QTID=19
CPUS_FIELD=hrProcessorFrwID
# Cumulative CPU info
CPU_GTID=38
# Load average
LA_GTID=11
# Memory
MEM_GTID=39
# Processes
PROC_GTID=37
# Used space
US_GTID=26
US_QID=8
US_QTID=18
US_FIELD=hrStorageDescr
# LVS - Connections, cumulative
# This is just GUESSWORK! Maybe this will work
LVSCONN_CG_GTID=35
# LVS - Service traffic in
# This is just GUESSWORK! Maybe this will work
LVSTRAF_CG_GTID=36
# LVS - Connections, per port
# This is just GUESSWORK! Maybe this will work
# The following parameters will be used to get the list of managed ports,
# and to add a graph accordingly. These graphs will be of the ds type.
LVSCONN_GTID=35
LVSCONN_QID=10
LVSCONN_QTID=23
LVSCONN_FIELD=srvPort
# LVS - Service traffic in
# This is just GUESSWORK! Maybe this will work
LVSTRAF_GTID=36
LVSTRAF_QID=10
LVSTRAF_QTID=24
LVSTRAF_FIELD=srvPort
# You shouldn't need to edit anything below this line
########################################################################
ADD_GRAPHS=$(PHP) $(CLI_DIR)/add_graphs.php
ADD_TREE=$(PHP) $(CLI_DIR)/add_tree.php
ADD_DEVICE=$(PHP) $(CLI_DIR)/add_device.php
ADD_DATA_QUERY=$(PHP) $(CLI_DIR)/add_data_query.php
LIST_HOSTS=$(ADD_GRAPHS) --list-hosts
MATCH=$(or $(FQDN),$(NAME))
RESOLVE=$(if $(MATCH),$(shell $(LIST_HOSTS) | grep "$(MATCH)" | head -n 1 | awk '{ print $$1 }'))
# The following will set ID to the value of RESOLVE, but only if ID was not
# already defined
ID ?= $(RESOLVE)
.SILENT: nothing
nothing:
echo "Impossible is nothing [$(RESOLVE)]"
echo "FQDN: $(FQDN)"
echo "NAME: $(NAME)"
echo "ID: $(ID)"
# add_host_to_cacti will require FQDN and NAME to be defined, so if
# this target is running, we are sure they are OK
# These variables are then passed along to the sub-instances of make
# automatically, hence there is no need to pass them along explicitly.
# Having them set, and not having ID manually set, will assign ID the
# id value of the newly added host. So, once again, no need to set it
# explicitly on the command line.
# I like this stuff :-D
all: add_host_to_cacti
make add_all_graphs
make add_host_to_tree
add_lvs_host:
make add_host_to_cacti HOST_TID=$(LVS_HOST_TID)
make lvs
make add_host_to_tree
interfaces: _idcheck
$(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=ds \
--graph-template-id=$(IFACE_GTID) \
--snmp-query-id=$(IFACE_QID) \
--snmp-query-type-id=$(IFACE_QTID) \
--snmp-field=$(IFACE_FIELD) \
--snmp-value=$(IFACE_VALUE)
cpus: cpu_cumulative cpu_single
cpu_cumulative: _idcheck
$(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=cg \
--graph-template-id=$(CPU_GTID)
cpu_single: _idcheck
$(ADD_GRAPHS) \
--list-snmp-values \
--host-id=$(ID) \
--snmp-query-id=$(CPUS_QID) \
--snmp-field="$(CPUS_FIELD)" | \
grep "^[0-9]" | \
while read CPUID ; \
do $(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=ds \
--graph-template-id=$(CPUS_GTID) \
--snmp-query-id=$(CPUS_QID) \
--snmp-query-type-id=$(CPUS_QTID) \
--snmp-field="$(CPUS_FIELD)" \
--snmp-value=$$CPUID ; \
done
loadaverage: _idcheck
$(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=cg \
--graph-template-id=$(LA_GTID)
memory: _idcheck
$(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=cg \
--graph-template-id=$(MEM_GTID)
processes: _idcheck
$(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=cg \
--graph-template-id=$(PROC_GTID)
usedspace: _idcheck
$(ADD_GRAPHS) \
--list-snmp-values \
--host-id=$(ID) \
--snmp-query-id=$(US_QID) \
--snmp-field="$(US_FIELD)" | \
grep -v "^Known" | \
while read DEVID ; \
do \
if [ -z "$$DEVID" ] ; then continue ; fi ; \
$(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=ds \
--graph-template-id=$(US_GTID) \
--snmp-query-id=$(US_QID) \
--snmp-query-type-id=$(US_QTID) \
--snmp-field="$(US_FIELD)" \
--snmp-value="$$DEVID" ; \
done
lvs: lvs_conn lvs_traffic
lvs_conn: _idcheck
$(ADD_GRAPHS) \
--list-snmp-values \
--host-id=$(ID) \
--snmp-query-id=$(LVSCONN_QID) \
--snmp-field="$(LVSCONN_FIELD)" | \
grep "^[0-9]" | \
while read PORTID ; \
do $(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=ds \
--graph-template-id=$(LVSCONN_GTID) \
--snmp-query-id=$(LVSCONN_QID) \
--snmp-query-type-id=$(LVSCONN_QTID) \
--snmp-field="$(LVSCONN_FIELD)" \
--snmp-value=$$PORTID ; \
done
lvs_traffic: _idcheck
$(ADD_GRAPHS) \
--list-snmp-values \
--host-id=$(ID) \
--snmp-query-id=$(LVSTRAF_QID) \
--snmp-field="$(LVSTRAF_FIELD)" | \
grep "^[0-9]" | \
while read PORTID ; \
do $(ADD_GRAPHS) \
--host-id=$(ID) \
--graph-type=ds \
--graph-template-id=$(LVSTRAF_GTID) \
--snmp-query-id=$(LVSTRAF_QID) \
--snmp-query-type-id=$(LVSTRAF_QTID) \
--snmp-field="$(LVSTRAF_FIELD)" \
--snmp-value=$$PORTID ; \
done
add_host_to_cacti: _namecheck _fqdncheck
$(ADD_DEVICE) \
--description="$(NAME)" \
--ip="$(FQDN)" \
--template=$(HOST_TID)
add_host_to_tree: _idcheck
$(ADD_TREE) \
--type=node \
--node-type=host \
--tree-id=$(DEFTREE_ID) \
--host-id=$(ID)
add_all_graphs: _idcheck interfaces cpus loadaverage memory processes usedspace
fulldump: _idcheck dump_hosts dump_host_templates dump_graph_templates dump_queries_and_types dump_snmp_fields_per_query_type dump_fields_and_values dump_input_fields
dump_hosts:
@echo "# HOSTS"
@$(LIST_HOSTS)
dump_host_templates:
@echo "# HOST TEMPLATES"
@$(ADD_DEVICE) --list-host-templates
dump_graph_templates:
@echo "# GRAPH TEMPLATES"
@$(ADD_GRAPHS) --list-graph-templates
dump_queries_and_types:
@echo "# QUERIES AND TYPES"
@$(ADD_GRAPHS) --list-snmp-queries | grep "^[0-9]" | \
while read ID NAME ; do \
echo "= $$ID - $$NAME =" ; \
$(ADD_GRAPHS) --list-query-types --snmp-query-id=$$ID ;\
echo ; \
done
dump_snmp_fields_per_query_type: _idcheck
@echo "# SNMP FIELDS PER QUERY TYPE"
@$(ADD_GRAPHS) --list-snmp-queries | grep "^[0-9]" | \
while read ID NAME ; do \
echo "= $$ID - $$NAME =" ; \
$(ADD_GRAPHS) --list-snmp-fields \
--host-id=$(ID) \
--snmp-query-id=$$ID ; \
echo ; \
done
dump_fields_and_values: _idcheck
@echo "# SNMP FIELDS AND VALUES"
@$(ADD_GRAPHS) --list-snmp-queries | grep "^[0-9]" | \
while read ID NAME ; do \
echo "= $$ID - $$NAME =" ; \
$(ADD_GRAPHS) --list-snmp-fields \
--host-id=$(ID) \
--snmp-query-id=$$ID | grep -v "^Known" | \
while read FIELD ; do \
if [ -z "$$FIELD" ] ; then continue ; fi ; \
echo "== $$FIELD ==" ; \
$(ADD_GRAPHS) --list-snmp-values \
--host-id=$(ID) \
--snmp-query-id=$$ID \
--snmp-field="$$FIELD" ;\
echo ; \
done ; \
echo ; \
done
dump_input_fields:
@echo "# INPUT FIELDS"
@$(ADD_GRAPHS) --list-graph-templates | grep "^[0-9]" | \
while read ID NAME ; do \
echo "= $$ID - $$NAME =" ; \
$(ADD_GRAPHS) --list-input-fields --graph-template-id=$$ID ; \
done
_idcheck:
@if [ -z "$(ID)" ] ; then echo "No ID specified" ; exit 1 ; fi
@echo "Selected ID: $(ID)"
_namecheck:
@if [ -z "$(NAME)" ] ; then \
echo "Please specify a name/description for this device" ; \
exit 2 ; \
fi
_fqdncheck:
@if [ -z "$(NAME)" ] ; then \
echo "Please specify a fqdn or IP address for this device" ; \
exit 3 ; \
fi






