cloudstack-nagios 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile.lock +1 -1
- data/README.md +37 -3
- data/lib/cloudstack-nagios/base.rb +2 -2
- data/lib/cloudstack-nagios/cli.rb +1 -1
- data/lib/cloudstack-nagios/commands/check.rb +48 -16
- data/lib/cloudstack-nagios/commands/nagios_config.rb +14 -4
- data/lib/cloudstack-nagios/commands/snmpd_config.rb +15 -7
- data/lib/cloudstack-nagios/helper.rb +11 -6
- data/lib/cloudstack-nagios/version.rb +1 -1
- metadata +1 -1
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -3,6 +3,13 @@
|
|
3
3
|
Cloudstack Nagios helps you monitoring your Cloudstack environment with Nagios.
|
4
4
|
Cloudstack Nagios uses the Cloudsdtack API to collect information about system vm's and cloudstack ressources.
|
5
5
|
|
6
|
+
## Prerequisites
|
7
|
+
|
8
|
+
* Cloudstack Root Admin keys must be used.
|
9
|
+
* In order to connect to system vms the private ssh key found on the Cloudstack management server under /var/lib/cloud/management/.ssh/id_rsa must be used.
|
10
|
+
* The system vms must be reachable over SSH (default port 3922) from the nagios server executing the checks.
|
11
|
+
* check with 'ssh -i /var/lib/cloud/management/.ssh/id_rsa -p 3922 <router_mgmt_ip>'
|
12
|
+
|
6
13
|
## Installation
|
7
14
|
|
8
15
|
Install the cloudstack-cli gem:
|
@@ -32,18 +39,45 @@ Example content of the configuration file:
|
|
32
39
|
|
33
40
|
## Usage
|
34
41
|
|
42
|
+
### Basics
|
43
|
+
|
35
44
|
See the help screen:
|
36
45
|
|
37
46
|
$ cs-nagios
|
38
47
|
|
39
|
-
Generate
|
48
|
+
### Generate Nagios configuration files
|
49
|
+
|
50
|
+
Generate nagios host configuration for virtual routers:
|
51
|
+
|
52
|
+
$ cs-nagios nagios_config host
|
53
|
+
|
54
|
+
Generate nagios host configuration for virtual routers:
|
55
|
+
|
56
|
+
$ cs-nagios nagios_config service
|
40
57
|
|
41
|
-
|
58
|
+
Note that you can also use your own ERB templates using the '--template' option to generate the nagios confifuration files.
|
59
|
+
|
60
|
+
### Check system vms over ssh
|
61
|
+
|
62
|
+
The following checks are available:
|
63
|
+
|
64
|
+
* memory - measure memory usage in percents
|
65
|
+
* cpu - measure cpu usage in percent
|
66
|
+
* network - measure network usage
|
67
|
+
* rootfs_rw - check if the root file system is writeable
|
68
|
+
|
69
|
+
### Enabling snmpd checks
|
70
|
+
|
71
|
+
If you want to check your system vms with standard snmp checks instead of checking over SSH, there are commands to configure snmpd on the machines and open the firewall.
|
72
|
+
|
73
|
+
* snmpd_config enable - goes to all the routers and configure snmpd
|
74
|
+
* snmpd_config check - test if port TCP 161 is reachable on routers
|
75
|
+
|
76
|
+
Note: If you want to use snmp checks, you have to adapt the nagios configuration files accordingly.
|
42
77
|
|
43
78
|
## References
|
44
79
|
- [Cloudstack API documentation](http://cloudstack.apache.org/docs/api/apidocs-4.2/TOC_Root_Admin.html)
|
45
80
|
|
46
|
-
|
47
81
|
## Contributing
|
48
82
|
|
49
83
|
1. Fork it
|
@@ -65,10 +65,10 @@ module CloudstackNagios
|
|
65
65
|
objects.select {|r| r[tag_name].downcase == tag.downcase}
|
66
66
|
end
|
67
67
|
|
68
|
-
def sshoptions
|
68
|
+
def sshoptions(ssh_key)
|
69
69
|
{
|
70
70
|
timeout: 5,
|
71
|
-
keys:
|
71
|
+
keys: [ssh_key],
|
72
72
|
auth_methods: %w(publickey)
|
73
73
|
}
|
74
74
|
end
|
@@ -85,7 +85,7 @@ module CloudstackNagios
|
|
85
85
|
require command
|
86
86
|
end
|
87
87
|
|
88
|
-
desc "
|
88
|
+
desc "nagios_config SUBCOMMAND ...ARGS", "Nagios configuration commands"
|
89
89
|
subcommand :nagios_config, NagiosConfig
|
90
90
|
|
91
91
|
desc "snmpd_config SUBCOMMAND ...ARGS", "snmpd configuration commands"
|
@@ -4,7 +4,7 @@ class Check < CloudstackNagios::Base
|
|
4
4
|
|
5
5
|
RETURN_CODES = {0 => 'ok', 1 => 'warning', 2 => 'critical'}
|
6
6
|
|
7
|
-
desc "
|
7
|
+
desc "memory HOST", "check memory on host"
|
8
8
|
option :host,
|
9
9
|
desc: 'hostname or ipaddress',
|
10
10
|
required: true,
|
@@ -19,10 +19,18 @@ class Check < CloudstackNagios::Base
|
|
19
19
|
type: :numeric,
|
20
20
|
default: 95,
|
21
21
|
aliases: '-c'
|
22
|
+
option :ssh_key,
|
23
|
+
desc: 'ssh private key to use',
|
24
|
+
default: '/var/lib/cloud/management/.ssh/id_rsa'
|
25
|
+
option :port,
|
26
|
+
desc: 'ssh port to use',
|
27
|
+
type: :numeric,
|
28
|
+
default: 3922,
|
29
|
+
aliases: '-p'
|
22
30
|
def memory
|
23
31
|
host = SSHKit::Host.new("root@#{options[:host]}")
|
24
|
-
host.ssh_options = sshoptions
|
25
|
-
host.port =
|
32
|
+
host.ssh_options = sshoptions(options[:ssh_key])
|
33
|
+
host.port = options[:port]
|
26
34
|
free_output = ""
|
27
35
|
on host do |h|
|
28
36
|
free_output = capture(:free)
|
@@ -36,7 +44,7 @@ class Check < CloudstackNagios::Base
|
|
36
44
|
exit data[0]
|
37
45
|
end
|
38
46
|
|
39
|
-
desc "
|
47
|
+
desc "cpu", "check memory on host"
|
40
48
|
option :host,
|
41
49
|
desc: 'hostname or ipaddress',
|
42
50
|
required: true,
|
@@ -49,10 +57,18 @@ class Check < CloudstackNagios::Base
|
|
49
57
|
desc: 'critical level',
|
50
58
|
type: :numeric,
|
51
59
|
default: 95
|
60
|
+
option :ssh_key,
|
61
|
+
desc: 'ssh private key to use',
|
62
|
+
default: '/var/lib/cloud/management/.ssh/id_rsa'
|
63
|
+
option :port,
|
64
|
+
desc: 'ssh port to use',
|
65
|
+
type: :numeric,
|
66
|
+
default: 3922,
|
67
|
+
aliases: '-p'
|
52
68
|
def cpu(host)
|
53
69
|
host = SSHKit::Host.new("root@#{options[:host]}")
|
54
|
-
host.ssh_options = sshoptions
|
55
|
-
host.port =
|
70
|
+
host.ssh_options = sshoptions(options[:ssh_key])
|
71
|
+
host.port = options[:port]
|
56
72
|
mpstat_output = ""
|
57
73
|
on host do |h|
|
58
74
|
mpstat_output = capture(:mpstat)
|
@@ -64,7 +80,7 @@ class Check < CloudstackNagios::Base
|
|
64
80
|
exit data[0]
|
65
81
|
end
|
66
82
|
|
67
|
-
desc "
|
83
|
+
desc "rootfs_rw", "check if the rootfs is read/writeable on host"
|
68
84
|
option :host,
|
69
85
|
desc: 'hostname or ipaddress',
|
70
86
|
required: true,
|
@@ -79,21 +95,29 @@ class Check < CloudstackNagios::Base
|
|
79
95
|
type: :numeric,
|
80
96
|
default: 95,
|
81
97
|
aliases: '-c'
|
98
|
+
option :ssh_key,
|
99
|
+
desc: 'ssh private key to use',
|
100
|
+
default: '/var/lib/cloud/management/.ssh/id_rsa'
|
101
|
+
option :port,
|
102
|
+
desc: 'ssh port to use',
|
103
|
+
type: :numeric,
|
104
|
+
default: 3922,
|
105
|
+
aliases: '-p'
|
82
106
|
def rootfs_rw
|
83
107
|
host = SSHKit::Host.new("root@#{options[:host]}")
|
84
|
-
host.ssh_options = sshoptions
|
85
|
-
host.port =
|
86
|
-
|
108
|
+
host.ssh_options = sshoptions(options[:ssh_key])
|
109
|
+
host.port = options[:port]
|
110
|
+
proc_out = ""
|
87
111
|
on host do |h|
|
88
112
|
proc_out = capture(:cat, '/proc/mounts')
|
89
113
|
end
|
90
114
|
rootfs_rw = proc_out.match(/rootfs\srw\s/)
|
91
|
-
|
92
|
-
puts "ROOTFS_RW #{rootfs_rw ? 'OK -
|
93
|
-
exit
|
115
|
+
status = rootfs_rw ? 0 : 2
|
116
|
+
puts "ROOTFS_RW #{rootfs_rw ? 'OK - rootfs writeable' : 'CRITICAL - rootfs NOT writeable'}"
|
117
|
+
exit status
|
94
118
|
end
|
95
119
|
|
96
|
-
desc "
|
120
|
+
desc "network", "check network usage on host"
|
97
121
|
option :host,
|
98
122
|
desc: 'hostname or ipaddress',
|
99
123
|
required: true,
|
@@ -108,10 +132,18 @@ class Check < CloudstackNagios::Base
|
|
108
132
|
type: :numeric,
|
109
133
|
default: 95,
|
110
134
|
aliases: '-c'
|
135
|
+
option :ssh_key,
|
136
|
+
desc: 'ssh private key to use',
|
137
|
+
default: '/var/lib/cloud/management/.ssh/id_rsa'
|
138
|
+
option :port,
|
139
|
+
desc: 'ssh port to use',
|
140
|
+
type: :numeric,
|
141
|
+
default: 3922,
|
142
|
+
aliases: '-p'
|
111
143
|
def network
|
112
144
|
host = SSHKit::Host.new("root@#{options[:host]}")
|
113
|
-
host.ssh_options = sshoptions
|
114
|
-
host.port =
|
145
|
+
host.ssh_options = sshoptions(options[:ssh_key])
|
146
|
+
host.port = options[:port]
|
115
147
|
r1, t1, r2, t2 = ""
|
116
148
|
on host do |h|
|
117
149
|
r1 = capture(:cat, '/sys/class/net/eth0/statistics/rx_bytes').to_f
|
@@ -1,13 +1,23 @@
|
|
1
1
|
class NagiosConfig < CloudstackNagios::Base
|
2
2
|
|
3
|
-
desc "
|
3
|
+
desc "hosts", "generate nagios hosts configuration for virtual routers"
|
4
|
+
option :template,
|
5
|
+
desc: "path of ERB template to use",
|
6
|
+
default: File.join(File.dirname(__FILE__), '..', 'templates', 'cloudstack_routers_hosts.cfg.erb'),
|
7
|
+
aliases: '-t'
|
4
8
|
def hosts
|
5
|
-
|
9
|
+
host_template = load_template(options[:template])
|
10
|
+
puts host_template.result(routers: cs_routers)
|
6
11
|
end
|
7
12
|
|
8
|
-
desc "
|
13
|
+
desc "services", "generate nagios services configuration for virtual routers"
|
14
|
+
option :template,
|
15
|
+
desc: "path of ERB template to use",
|
16
|
+
default: File.join(File.dirname(__FILE__), '..', 'templates', 'cloudstack_routers_services.cfg.erb'),
|
17
|
+
aliases: '-t'
|
9
18
|
def services
|
10
|
-
|
19
|
+
service_template = load_template(options[:template])
|
20
|
+
puts service_template.result(routers: cs_routers)
|
11
21
|
end
|
12
22
|
|
13
23
|
end
|
@@ -4,11 +4,11 @@ require 'timeout'
|
|
4
4
|
|
5
5
|
class SnmpdConfig < CloudstackNagios::Base
|
6
6
|
|
7
|
-
desc "
|
7
|
+
desc "check [vms]", "check if snmpd is configured on virtual routers"
|
8
8
|
def check(*vms)
|
9
9
|
if vms.size == 0
|
10
10
|
say 'Get a list of all routers from cloudstack..', :yellow
|
11
|
-
vms = router_ips
|
11
|
+
vms = router_ips
|
12
12
|
end
|
13
13
|
vms.each do |host|
|
14
14
|
begin
|
@@ -23,20 +23,28 @@ class SnmpdConfig < CloudstackNagios::Base
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
desc "
|
26
|
+
desc "enable [vms]", "enable snmpd configuration on virtual routers"
|
27
27
|
option :apt,
|
28
28
|
desc: 'use apt-get to install snmpd packages',
|
29
29
|
type: :boolean
|
30
|
+
option :ssh_key,
|
31
|
+
desc: 'ssh private key to use',
|
32
|
+
default: '/var/lib/cloud/management/.ssh/id_rsa'
|
33
|
+
option :port,
|
34
|
+
desc: 'ssh port to use',
|
35
|
+
type: :numeric,
|
36
|
+
default: 3922,
|
37
|
+
aliases: '-p'
|
30
38
|
def enable(*vms)
|
31
39
|
apt = options[:apt]
|
32
40
|
if vms.size == 0
|
33
|
-
say 'Get a list of all routers from
|
41
|
+
say 'Get a list of all routers from Cloudstack..', :yellow
|
34
42
|
vms = router_ips
|
35
43
|
end
|
36
44
|
hosts = vms.map do |router|
|
37
45
|
host = SSHKit::Host.new("root@#{router}")
|
38
|
-
host.ssh_options = sshoptions
|
39
|
-
host.port =
|
46
|
+
host.ssh_options = sshoptions(options[:ssh_key])
|
47
|
+
host.port = options[:port]
|
40
48
|
host
|
41
49
|
end
|
42
50
|
say 'Connect to router and enable snmpd...', :yellow
|
@@ -57,7 +65,7 @@ class SnmpdConfig < CloudstackNagios::Base
|
|
57
65
|
|
58
66
|
no_commands do
|
59
67
|
|
60
|
-
def router_ips(vrs =
|
68
|
+
def router_ips(vrs = cs_routers)
|
61
69
|
ips = []
|
62
70
|
vrs.each do |router|
|
63
71
|
ips << router['linklocalip'] unless router['linklocalip'] == nil
|
@@ -1,13 +1,18 @@
|
|
1
1
|
module CloudstackNagios
|
2
2
|
module Helper
|
3
|
-
def load_template(
|
4
|
-
|
5
|
-
|
3
|
+
def load_template(template_path)
|
4
|
+
if File.file?(template_path)
|
5
|
+
templ = File.read(template_path)
|
6
|
+
return Erubis::Eruby.new(templ)
|
7
|
+
else
|
8
|
+
say "Error: template not found #{template_path}"
|
9
|
+
exit 1
|
10
|
+
end
|
6
11
|
end
|
7
12
|
|
8
|
-
def
|
9
|
-
routers = client.list_routers
|
10
|
-
routers += client.list_routers(projectid: -1)
|
13
|
+
def cs_routers
|
14
|
+
routers = client.list_routers(status: 'Running')
|
15
|
+
routers += client.list_routers(projectid: -1, status: 'Running')
|
11
16
|
end
|
12
17
|
end
|
13
18
|
end
|