cloudstack-nagios 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|