chef_knives 0.1
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/History.txt +6 -0
- data/Manifest.txt +7 -0
- data/README.txt +14 -0
- data/Rakefile +14 -0
- data/bin/chef_node_fs_usage +69 -0
- data/bin/chef_node_mem_usage +110 -0
- data/lib/chef/knives.rb +5 -0
- metadata +75 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
data/README.txt
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
REQUIREMENTS
|
2
|
+
------------
|
3
|
+
|
4
|
+
rubygems and the following gems installed:
|
5
|
+
|
6
|
+
chef
|
7
|
+
json
|
8
|
+
couchrest
|
9
|
+
choice
|
10
|
+
|
11
|
+
All the scripts try to connect to http://localhost:5984/chef (Chef CouchDB database).
|
12
|
+
Either run them from the chef-server or use SSH to create a tunnel:
|
13
|
+
|
14
|
+
ssh -L5984:localhost:5984 -N chef-server.example.com
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'hoe'
|
5
|
+
require './lib/chef/knives.rb'
|
6
|
+
|
7
|
+
Hoe.new('chef_knives', Chef::Knives::VERSION) do |p|
|
8
|
+
p.developer('Sergio Rubio', 'sergio@rubio.name')
|
9
|
+
p.summary = 'Chef addons to become a cooking master!'
|
10
|
+
p.description = 'Unofficial Chef Server scripts and related stuff. http://wiki.opscode.com/display/chef'
|
11
|
+
p.url = 'http://github.com/rubiojr/chef-knives'
|
12
|
+
end
|
13
|
+
|
14
|
+
# vim: syntax=Ruby
|
@@ -0,0 +1,69 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'couchrest'
|
4
|
+
require 'chef'
|
5
|
+
require 'choice'
|
6
|
+
require 'pp'
|
7
|
+
|
8
|
+
CHEF_DB_URL = 'http://localhost:5984/chef'
|
9
|
+
|
10
|
+
def main
|
11
|
+
Choice.options do
|
12
|
+
header ''
|
13
|
+
header 'Available options:'
|
14
|
+
|
15
|
+
option :help do
|
16
|
+
long '--help'
|
17
|
+
short '-h'
|
18
|
+
desc 'Show this message'
|
19
|
+
action do
|
20
|
+
Choice.help
|
21
|
+
exit
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
option :usage_threshold do
|
26
|
+
long '--usage-threshold'
|
27
|
+
short '-t'
|
28
|
+
desc 'Print only the filesystems with usage percent greater than this value'
|
29
|
+
end
|
30
|
+
|
31
|
+
option :match do
|
32
|
+
default '.*'
|
33
|
+
long '--match'
|
34
|
+
short '-m'
|
35
|
+
desc 'Match only the nodes with an FQDN matching this value'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
db = CouchRest.database(CHEF_DB_URL)
|
40
|
+
|
41
|
+
db.documents['rows'].each do |doc|
|
42
|
+
if doc['id'] =~ /node_/
|
43
|
+
node = db.get(doc['id'])
|
44
|
+
next if node.fqdn !~ /#{Choice.choices[:match]}/
|
45
|
+
matching_fs = []
|
46
|
+
node.filesystem.each do |fsname,fsattrs|
|
47
|
+
if not (%w[proc binfmt_misc sysfs tmpfs devpts rpc_pipefs].include? fsattrs['fs_type'])
|
48
|
+
if Choice.choices[:usage_threshold]
|
49
|
+
uthres = Choice.choices[:usage_threshold].to_i
|
50
|
+
usage = fsattrs['percent_used'].chomp.strip.gsub('%','').to_i
|
51
|
+
(matching_fs << " #{fsname}".ljust(50) + fsattrs['percent_used']) if usage > uthres
|
52
|
+
else
|
53
|
+
matching_fs << " #{fsname}".ljust(50) + fsattrs['percent_used']
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
if not matching_fs.empty?
|
58
|
+
puts node.fqdn
|
59
|
+
matching_fs.each do |fs|
|
60
|
+
puts fs
|
61
|
+
end
|
62
|
+
puts
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
main
|
@@ -0,0 +1,110 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# List Filesystem Usage for every chef node that matches the hostname
|
4
|
+
# provided. If no argument is provided, matches all the nodes.
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
# chef_node_fs_usage '*.cdn.example.com'
|
8
|
+
# (matches every node whose fqdn ends with cdn.example.com)
|
9
|
+
#
|
10
|
+
require 'rubygems'
|
11
|
+
require 'couchrest'
|
12
|
+
require 'chef'
|
13
|
+
require 'choice'
|
14
|
+
require 'pp'
|
15
|
+
|
16
|
+
CHEF_DB_URL = 'http://localhost:5984/chef'
|
17
|
+
|
18
|
+
def humanize_bytes(bytes)
|
19
|
+
return "0 Bytes" if bytes == 0
|
20
|
+
m = bytes.to_i
|
21
|
+
units = %w[Bits Bytes MB GB TB PB]
|
22
|
+
while (m/1024.0) >= 1
|
23
|
+
m = m/1024.0
|
24
|
+
units.shift
|
25
|
+
end
|
26
|
+
return m.round.to_s + " #{units[0]}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def main
|
30
|
+
Choice.options do
|
31
|
+
header ''
|
32
|
+
header 'Available options:'
|
33
|
+
|
34
|
+
option :help do
|
35
|
+
long '--help'
|
36
|
+
short '-h'
|
37
|
+
desc 'Show this message'
|
38
|
+
action do
|
39
|
+
Choice.help
|
40
|
+
exit
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
option :swap_usage_threshold do
|
45
|
+
long '--swap-usage-threshold'
|
46
|
+
short '-s'
|
47
|
+
desc 'Print only the hosts with swap usage percent greater than this value'
|
48
|
+
end
|
49
|
+
|
50
|
+
option :mem_usage_threshold do
|
51
|
+
long '--mem-usage-threshold'
|
52
|
+
short '-u'
|
53
|
+
desc 'Print only the hosts with memory usage percent greater than this value'
|
54
|
+
end
|
55
|
+
|
56
|
+
option :match do
|
57
|
+
default '.*'
|
58
|
+
long '--match'
|
59
|
+
short '-m'
|
60
|
+
desc 'Match only the nodes with an FQDN matching this value'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
db = CouchRest.database(CHEF_DB_URL)
|
65
|
+
|
66
|
+
db.documents['rows'].each do |doc|
|
67
|
+
if doc['id'] =~ /node_/
|
68
|
+
node = db.get(doc['id'])
|
69
|
+
next if node.fqdn !~ /#{Choice.choices[:match]}/
|
70
|
+
free_mem = node.memory.free.strip.gsub("kB",'').to_i
|
71
|
+
total_mem = node.memory.total.strip.gsub("kB",'').to_i
|
72
|
+
used_mem = total_mem - free_mem
|
73
|
+
free_mem_per = (free_mem * 100 / total_mem)
|
74
|
+
used_mem_per = 100 - (free_mem * 100 / total_mem)
|
75
|
+
free_swap = node.memory.swap.free.strip.gsub("kB",'').to_i
|
76
|
+
total_swap = node.memory.swap.total.strip.gsub("kB",'').to_i
|
77
|
+
used_swap = total_swap - free_swap
|
78
|
+
# The host may not have swap!
|
79
|
+
if total_swap == 0
|
80
|
+
used_swap_per = 100
|
81
|
+
free_swap_per = 0
|
82
|
+
else
|
83
|
+
used_swap_per = 100 - (free_swap * 100 / total_swap)
|
84
|
+
free_swap_per = (free_swap * 100 / total_swap)
|
85
|
+
end
|
86
|
+
|
87
|
+
if Choice.choices[:mem_usage_threshold] and used_mem_per <= Choice.choices[:mem_usage_threshold].to_i
|
88
|
+
next
|
89
|
+
end
|
90
|
+
|
91
|
+
if Choice.choices[:swap_usage_threshold] and used_swap_per <= Choice.choices[:swap_usage_threshold].to_i
|
92
|
+
next
|
93
|
+
end
|
94
|
+
|
95
|
+
puts node.fqdn
|
96
|
+
|
97
|
+
puts " Mem Free:".ljust(20) + "#{humanize_bytes(free_mem * 1024)} (#{free_mem_per}%)"
|
98
|
+
puts " Mem Used:".ljust(20) + "#{humanize_bytes(used_mem * 1024)} (#{used_mem_per}%)"
|
99
|
+
puts " Mem Total:".ljust(20) + "#{humanize_bytes(total_mem * 1024)}"
|
100
|
+
|
101
|
+
puts " Swap Free:".ljust(20) + "#{humanize_bytes(free_swap * 1024)} (#{free_swap_per}%)"
|
102
|
+
puts " Swap Used:".ljust(20) + "#{humanize_bytes(used_swap * 1024)} (#{used_swap_per}%)"
|
103
|
+
puts " Swap Total:".ljust(20) + "#{humanize_bytes(total_swap * 1024)}"
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
main
|
data/lib/chef/knives.rb
ADDED
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: chef_knives
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sergio Rubio
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-09 00:00:00 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: hoe
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 2.3.3
|
24
|
+
version:
|
25
|
+
description: Unofficial Chef Server scripts and related stuff. http://wiki.opscode.com/display/chef
|
26
|
+
email:
|
27
|
+
- sergio@rubio.name
|
28
|
+
executables:
|
29
|
+
- chef_node_fs_usage
|
30
|
+
- chef_node_mem_usage
|
31
|
+
extensions: []
|
32
|
+
|
33
|
+
extra_rdoc_files:
|
34
|
+
- History.txt
|
35
|
+
- Manifest.txt
|
36
|
+
- README.txt
|
37
|
+
files:
|
38
|
+
- History.txt
|
39
|
+
- Manifest.txt
|
40
|
+
- README.txt
|
41
|
+
- Rakefile
|
42
|
+
- bin/chef_node_fs_usage
|
43
|
+
- bin/chef_node_mem_usage
|
44
|
+
- lib/chef/knives.rb
|
45
|
+
has_rdoc: true
|
46
|
+
homepage: http://github.com/rubiojr/chef-knives
|
47
|
+
licenses: []
|
48
|
+
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options:
|
51
|
+
- --main
|
52
|
+
- README.txt
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: "0"
|
60
|
+
version:
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: "0"
|
66
|
+
version:
|
67
|
+
requirements: []
|
68
|
+
|
69
|
+
rubyforge_project: chef_knives
|
70
|
+
rubygems_version: 1.3.3
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: Chef addons to become a cooking master!
|
74
|
+
test_files: []
|
75
|
+
|