From 69bbb2dbe87998c9a42254232c57dd2261e8bf21 Mon Sep 17 00:00:00 2001 From: Piotr Misiak Date: Fri, 19 Jun 2015 19:02:46 +0200 Subject: [PATCH] add user guide documentation files Change-Id: I9e22dc03a54279ece47e231a72bf3bce778e74ea --- doc/content/appendix.rst | 7 ++ doc/content/description.rst | 26 ++++++++ doc/content/guide.rst | 120 +++++++++++++++++++++++++++++++++++ doc/content/installation.rst | 34 ++++++++++ doc/content/licenses.rst | 32 ++++++++++ doc/content/terms.rst | 19 ++++++ doc/images/settings.png | Bin 0 -> 12255 bytes doc/user_guide.rst | 15 +++++ 8 files changed, 253 insertions(+) create mode 100644 doc/content/appendix.rst create mode 100644 doc/content/description.rst create mode 100644 doc/content/guide.rst create mode 100644 doc/content/installation.rst create mode 100644 doc/content/licenses.rst create mode 100644 doc/content/terms.rst create mode 100644 doc/images/settings.png create mode 100644 doc/user_guide.rst diff --git a/doc/content/appendix.rst b/doc/content/appendix.rst new file mode 100644 index 0000000..6517d99 --- /dev/null +++ b/doc/content/appendix.rst @@ -0,0 +1,7 @@ +======== +Appendix +======== + +`Zabbix 2.4 documentation - SNMP traps `_ + +`Zabbix 2.4 documentation - Templates `_ diff --git a/doc/content/description.rst b/doc/content/description.rst new file mode 100644 index 0000000..4ca4ce3 --- /dev/null +++ b/doc/content/description.rst @@ -0,0 +1,26 @@ +================================== +SNMP trap daemon for Zabbix plugin +================================== + +This plugin extends Zabbix plugin functionality by adding ability to receive +SNMP traps from management network and pass them to Zabbix. For more +information about networks, see the `Logical Networks `_ section of MOS documentation. The plugins installs +snmptrapd daemon for receiving and snmptt software for parsing and passing +traps to Zabbix. This plugin does not provide any additional features from user +point of view. It was designed as a base for other plugins which needs to +analyze SNMP traps incoming from for example network and storage hardware like +network switches or storage arrays. By using this plugin user can easily create +additional plugins to add monitoring of SNMP traps specific for their hardware. + +Requirements +============ + +====================== =============== +Requirement Version/Comment +====================== =============== +Fuel 6.1 +Zabbix plugin for Fuel 1.0.0 +====================== =============== + diff --git a/doc/content/guide.rst b/doc/content/guide.rst new file mode 100644 index 0000000..47c68c5 --- /dev/null +++ b/doc/content/guide.rst @@ -0,0 +1,120 @@ +========== +User Guide +========== + +Environment configuration +========================= + +1. Create an environment. For more information about environment creation, see + `Mirantis OpenStack User Guide `_. +2. Enable and configure Zabbix plugin for Fuel. For instructions, see Zabbix + Plugin Guide in the `Fuel Plugins Catalog `_. +3. Open *Settings* tab of the Fuel web UI and scroll the page down. Select the + plugin checkbox and set *SNMP community* parameter: + + .. image:: images/settings.png + + You could see default value by clicking on the eye icon. It is highly + recommended to change default SNMP community, because it is used to + authorize incoming SNMP traps. +4. Adjust other environment settings to your requirements and deploy the + environment. For more information, see + `Mirantis OpenStack User Guide `_. + +Environment validation +====================== + +After a successful deployment, all Controller Nodes should have the following: + +1. snmptrapd daemon running and listening on UDP/162 port on the VIP management + address. +2. snmptrapd daemon configured to pass all SNMP traps to snmptt handler. +3. snmptt daemon running which parse SNMP traps and stores them in a log file + in a format accepted by Zabbix. +4. Zabbix SNMPTrapper processes running which reads SNMP traps from the log + file (only on node on which Zabbix Server is running). + +To test if everything is installed and configured properly, follow these steps: + +1. Generate a test SNMP trap running following command from any node:: + + [root@node-46 ~]# snmptrap -v 2c -c "" .1.3.6.1.4.1.8072.2.3.0.1 + + where: + + ** + + It is set in the SNMP trap daemon for Zabbix plugin Settings in Fuel UI: + + .. image:: images/settings.png + + ** + + If you don’t know the address, run the following command on any node:: + + [root@node-46 ~]# grep management_vip /etc/astute.yaml + + You should get the required VIP in the output:: + + management_vip: 192.168.0.1 + + +2. After several seconds of running the snmptrap command you should see a line + in the Zabbix Server log file similar to this one:: + + [root@node-45 ~]# grep netSnmpExampleHeartbeatNotification \ /var/log/zabbix/zabbix_server.log + 10730:20150611:182933.176 unmatched trap received from [192.168.0.4]: 18:29:27 2015/06/11 .1.3.6.1.4.1.8072.2.3.0.1 Normal "Status Events" node-46.domain.tld - netSnmpExampleHeartbeatNotification + + This is a proof that test SNMP trap has been received and passed to Zabbix. + It is “unmatched” for Zabbix because there is no configuration for this trap + in Zabbix (this trap is for testing purposes only). + + +How to use SNMP trap daemon for Zabbix plugin +============================================= + +As noted above, with this plugin you can easily create additional plugins to +add monitoring of SNMP traps specific for your hardware. To achieve this, +the following tasks should be done by additional plugin: + +1. On all Controller nodes, add SNMP traps to snmptt configuration: + + a. Create configuration file in */etc/snmp/snmptt.conf.d/* directory, for + example *emc.conf*, with SNMP traps defined, for more information, see + `snmptt documentation `_. + b. Add the file (absolute path) to *snmptt_conf_files* parameter in + *snmptt.ini* file. + c. Reload snmptt service. + +2. Create a Zabbix monitoring Template and export it to a file. For more + information, see `Templates section in the Zabbix documentation `_. +3. From Primary Controller node configure Zabbix: + + a. Copy created Template file to the Primary Controller node. + b. Import the Template to Zabbix using *plugin_zabbix_configuration_import* + resource. + c. Optionally, create a Host group in Zabbix using *plugin_zabbix_hostgroup* + resource. + d. Create Host in Zabbix using *plugin_zabbix_host* resource setting + appropriate name, IP and group. + e. Link the Template with the Host using *plugin_zabbix_template_link* + resource. + +There are two plugins in the `Fuel Plugins Catalog `_ you can refer to as an +example: + +1. EMC hardware monitoring extension for Zabbix plugin. +2. Extreme Networks hardware monitoring extension for Zabbix plugin. + +These plugins do all the tasks mentioned above and have their own Zabbix +monitoring Templates. You can simply copy one of these plugins and adjust SNMP +traps configuration to your hardware. For more information about Fuel Plugins +development, see `Fuel Plugins wiki page `_. + diff --git a/doc/content/installation.rst b/doc/content/installation.rst new file mode 100644 index 0000000..70b5183 --- /dev/null +++ b/doc/content/installation.rst @@ -0,0 +1,34 @@ +================== +Installation Guide +================== + +SNMP trap daemon for Zabbix plugin installation +=============================================== + +To install SNMP trap daemon for Zabbix plugin, follow these steps: + +1. Download and install the Zabbix plugin for Fuel from the + `Fuel Plugins Catalog `_ +2. Download the SNMP trap daemon for Zabbix plugin from the + `Fuel Plugins Catalog `_ +3. Copy the plugin on already installed Fuel Master node; ssh can be used for + that. If you do not have the Fuel Master node yet, see `Quick Start Guide + `_:: + + # scp zabbix_snmptrapd-1.0-1.0.0-1.noarch.rpm root@:/tmp + +4. Log into the Fuel Master node. Install the plugin:: + + # cd /tmp + # fuel plugins --install zabbix_snmptrapd-1.0-1.0.0-1.noarch.rpm + +5. Check if the plugin was installed successfully:: + + # fuel plugins + id | name | version | package_version + ---|---------------------------|----------|---------------- + 1 | zabbix_monitoring | 1.0.0 | 2.0.0 + 2 | zabbix_snmptrapd | 1.0.0 | 2.0.0 + diff --git a/doc/content/licenses.rst b/doc/content/licenses.rst new file mode 100644 index 0000000..8b6482e --- /dev/null +++ b/doc/content/licenses.rst @@ -0,0 +1,32 @@ +=================== +Components licenses +=================== + +rpm packages +============ + +====================== ============ +Name License +====================== ============ +net-snmp BSD +net-snmp-libs BSD +net-snmp-perl BSD +snmptt GPLv2+ +perl-Config-IniFiles GPL+ +perl-Crypt-DES BSD +perl-Digest-HMAC GPL+ +perl-Digest-SHA1 GPL+ +perl-IO-stringy GPL+ +perl-List-MoreUtils GPL+ +perl-Net-SNMP GPL+ +====================== ============ + +puppet modules +============== + +====================== ============== +Name License +====================== ============== +snmp Apache 2.0 +====================== ============== + diff --git a/doc/content/terms.rst b/doc/content/terms.rst new file mode 100644 index 0000000..9ea38b9 --- /dev/null +++ b/doc/content/terms.rst @@ -0,0 +1,19 @@ +===================================== +Key terms, acronyms and abbreviations +===================================== + +Zabbix + An enterprise open source monitoring solution for networks and + applications. It is designed to monitor and track the status of various + network services,servers, and other network hardware. + +VIP + Virtual IP Adress. + +SNMP trap + A message which is send from agent (for example, from network switch) to + monitoring manager. + +SNMP community + A password which is used for incoming SNMP traps authorization. + diff --git a/doc/images/settings.png b/doc/images/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..07dfce7725368015126e3ea28f4a420c1409b61f GIT binary patch literal 12255 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 z