serverspec-runner 0.1.8 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +87 -43
- data/Rakefile +34 -27
- data/bin/serverspec-runner +4 -7
- data/lib/serverspec-runner/version.rb +1 -1
- data/spec/example/default.rb +24 -6
- data/spec/spec_helper.rb +34 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deb6b6b88775846ef3f209bde2980e2941af4f86
|
4
|
+
data.tar.gz: c31f9fa20adbc3e2ead705ef3f2ffb0c45f034ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e774ddd841a66cc479f81b6f9c2973aa0dfe5e75c46a40cc5943ecabce0ec881fca0bd5a7064eb6e372846f9e05bfb07d081aaacb8e4703cc40f0fa0e547603
|
7
|
+
data.tar.gz: 26a1ce6ae5f55017bff20eee4ed9c1fc2faf04cd7192a40148dfd362e3c4db941666aba7bce9beea06a5d96cf206e135bed204bf317c162b282fe43badd5fc65
|
data/README.md
CHANGED
@@ -59,66 +59,110 @@ For example. You write serverspec code like this.
|
|
59
59
|
|
60
60
|
```
|
61
61
|
describe "nginx" do
|
62
|
-
|
63
|
-
describe package('nginx') do
|
64
|
-
it { should be_installed }
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
62
|
+
|
68
63
|
describe "check running" do
|
69
64
|
describe process('nginx') do
|
70
65
|
it { should be_running }
|
71
66
|
end
|
72
67
|
end
|
73
|
-
|
74
|
-
describe "check process" do
|
75
|
-
describe process('nginx') do
|
76
|
-
it { should be_enabled }
|
77
|
-
end
|
78
|
-
end
|
79
68
|
|
80
|
-
describe
|
81
|
-
|
82
|
-
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "logrotate interval" do
|
87
|
-
describe file('/etc/logrotate.d/nginx') do
|
88
|
-
it { should contain "rotate 14" }
|
89
|
-
end
|
69
|
+
describe file('/etc/logrotate.d/nginx') do
|
70
|
+
it { should be_file }
|
71
|
+
it { should contain "rotate 14" }
|
90
72
|
end
|
91
73
|
end
|
92
74
|
```
|
93
75
|
|
94
76
|
You can get the following outputs.
|
95
77
|
|
78
|
+
* serverspec-runner -t aa : asci-art table(default)
|
96
79
|
```
|
97
|
-
|
98
|
-
|description
|
99
|
-
|
100
|
-
|example@anyhost-01(
|
101
|
-
| nginx
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
| nginx
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
80
|
+
+-------------------------------------------+
|
81
|
+
|description | result |
|
82
|
+
+-------------------------------------------+
|
83
|
+
|example@anyhost-01(192.168.11.1) | |
|
84
|
+
| nginx | |
|
85
|
+
| check running | |
|
86
|
+
| Process "nginx" | |
|
87
|
+
| should be running | OK |
|
88
|
+
| File "/etc/logrotate.d/nginx" | |
|
89
|
+
| should be file | OK |
|
90
|
+
| should contain "rotate 14" | OK |
|
91
|
+
|example@anyhost-02(192.168.11.2) | |
|
92
|
+
| nginx | |
|
93
|
+
| check running | |
|
94
|
+
| Process "nginx" | |
|
95
|
+
| should be running | OK |
|
96
|
+
| File "/etc/logrotate.d/nginx" | |
|
97
|
+
| should be file | OK |
|
98
|
+
| should contain "rotate 14" | NG |
|
99
|
+
+-------------------------------------------+
|
100
|
+
```
|
101
|
+
|
102
|
+
* serverspec-runner -t mkd : markdown table format
|
103
|
+
```
|
104
|
+
|description | result |
|
105
|
+
|:---------------------------------|:------:|
|
106
|
+
|example@anyhost-01(192.168.11.1) | |
|
107
|
+
| nginx | |
|
108
|
+
| check running | |
|
109
|
+
| Process "nginx" | |
|
110
|
+
| should be running | OK |
|
111
|
+
| File "/etc/logrotate.d/nginx" | |
|
112
|
+
| should be file | OK |
|
113
|
+
| should contain "rotate 14" | OK |
|
114
|
+
|example@anyhost-02(192.168.11.2) | |
|
115
|
+
| nginx | |
|
116
|
+
| check running | |
|
117
|
+
| Process "nginx" | |
|
118
|
+
| should be running | OK |
|
119
|
+
| File "/etc/logrotate.d/nginx" | |
|
120
|
+
| should be file | OK |
|
121
|
+
| should contain "rotate 14" | NG |
|
122
|
+
```
|
123
|
+
|
124
|
+
this example parsed for markdown to that(use -e long option)
|
113
125
|
|
126
|
+
|description | result |
|
127
|
+
|:----------------------------------------------------------------|:------:|
|
128
|
+
|example@anyhost-01(192.168.11.1) | |
|
129
|
+
| nginx check running Process "nginx" should be running | OK |
|
130
|
+
| nginx File "/etc/logrotate.d/nginx" should be file | OK |
|
131
|
+
| nginx File "/etc/logrotate.d/nginx" should contain "rotate 14" | OK |
|
132
|
+
|example@anyhost-01(192.168.11.2) | |
|
133
|
+
| nginx check running Process "nginx" should be running | OK |
|
134
|
+
| nginx File "/etc/logrotate.d/nginx" should be file | OK |
|
135
|
+
| nginx File "/etc/logrotate.d/nginx" should contain "rotate 14" | NG |
|
136
|
+
|
137
|
+
* serverspec-runner -t bool : only 'ok' or 'ng' result string.t
|
138
|
+
You can use for cluster monitoring system health.
|
139
|
+
|
140
|
+
```
|
141
|
+
ng
|
114
142
|
```
|
115
143
|
|
116
|
-
|
144
|
+
* serverspec-runner -t csv : CSV file format
|
145
|
+
You can get result CSV format output and can use redirect to file.
|
117
146
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
147
|
+
```
|
148
|
+
description,,,,,result
|
149
|
+
example@anyhost-01(192.168.11.1),,,,,
|
150
|
+
,nginx,,,,
|
151
|
+
,,check running,,,
|
152
|
+
,,,Process "nginx",,
|
153
|
+
,,,,should be running,OK
|
154
|
+
,,File "/etc/logrotate.d/nginx",,,
|
155
|
+
,,,should be file,,OK
|
156
|
+
,,,should contain "rotate 14",,OK
|
157
|
+
example@anyhost-02(192.168.11.2),,,,,
|
158
|
+
,nginx,,,,
|
159
|
+
,,check running,,,
|
160
|
+
,,,Process "nginx",,
|
161
|
+
,,,,should be running,OK
|
162
|
+
,,File "/etc/logrotate.d/nginx",,,
|
163
|
+
,,,should be file,,OK
|
164
|
+
,,,should contain "rotate 14",,NG
|
165
|
+
```
|
122
166
|
|
123
167
|
For more detail. You can see from `serverspec-runner -h` command.
|
124
168
|
|
data/Rakefile
CHANGED
@@ -23,7 +23,7 @@ namespace :spec do
|
|
23
23
|
ENV['result_csv'] = ENV['result_csv'] || './_serverspec_result.csv'
|
24
24
|
csv_file = ENV['result_csv']
|
25
25
|
CSV.open(csv_file, 'w') { |w| w << ['description', 'result'] }
|
26
|
-
ENV['explain'] = ENV['explain'] || "
|
26
|
+
ENV['explain'] = ENV['explain'] || "short"
|
27
27
|
ENV['tableformat'] = ENV['tableformat'] || "aa"
|
28
28
|
ENV['scenario'] = ENV['scenario'] || "./scenario.yml"
|
29
29
|
|
@@ -56,10 +56,11 @@ namespace :spec do
|
|
56
56
|
|
57
57
|
if abs_node.kind_of?(Hash)
|
58
58
|
abs_node.keys.each do |n|
|
59
|
-
path
|
60
|
-
path
|
61
|
-
path = gen_exec_plan(abs_node, n, path, ssh_options, tasks, platform)
|
59
|
+
path.push(n.to_s)
|
60
|
+
gen_exec_plan(abs_node, n, path, ssh_options, tasks, platform)
|
62
61
|
end
|
62
|
+
|
63
|
+
path.pop
|
63
64
|
elsif abs_node.kind_of?(Array)
|
64
65
|
abs_node.each do |host_alias|
|
65
66
|
if platform.include?(host_alias.to_sym)
|
@@ -70,12 +71,11 @@ namespace :spec do
|
|
70
71
|
end
|
71
72
|
|
72
73
|
platform[host_alias.to_sym][:ssh_opts].each { |k, v| ssh_options[k.to_sym] = v } if platform[host_alias.to_sym].include?(:ssh_opts)
|
73
|
-
|
74
|
-
tasks << "#{path}::#{host_alias}"
|
74
|
+
tasks << "#{path.join('::')}::#{host_alias}"
|
75
75
|
end
|
76
|
-
end
|
77
76
|
|
78
|
-
|
77
|
+
path.pop
|
78
|
+
end
|
79
79
|
end
|
80
80
|
|
81
81
|
def exec_tasks(parent, node, real_path, platform)
|
@@ -85,18 +85,16 @@ namespace :spec do
|
|
85
85
|
else
|
86
86
|
abs_node = parent[node]
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
if abs_node.kind_of?(Hash)
|
90
90
|
abs_node.keys.each do |n|
|
91
|
-
real_path
|
92
|
-
|
91
|
+
real_path.push(n)
|
92
|
+
exec_tasks(abs_node, n, real_path, platform)
|
93
93
|
end
|
94
|
+
|
95
|
+
real_path.pop
|
94
96
|
elsif abs_node.kind_of?(Array)
|
95
|
-
task_path = ''
|
96
|
-
real_path.map.each do |p|
|
97
|
-
task_path << '::' unless task_path.empty?
|
98
|
-
task_path << p
|
99
|
-
end
|
97
|
+
task_path = "#{real_path.join('::')}"
|
100
98
|
|
101
99
|
abs_node.each do |host_alias|
|
102
100
|
desc "Run serverspec to #{task_path}@#{host_alias}"
|
@@ -116,10 +114,8 @@ namespace :spec do
|
|
116
114
|
end
|
117
115
|
end
|
118
116
|
|
119
|
-
|
117
|
+
real_path.pop
|
120
118
|
end
|
121
|
-
|
122
|
-
return real_path
|
123
119
|
end
|
124
120
|
|
125
121
|
if !Dir.exists?(ENV['specpath'])
|
@@ -171,7 +167,7 @@ namespace :spec do
|
|
171
167
|
end
|
172
168
|
|
173
169
|
tasks = []
|
174
|
-
gen_exec_plan(nil, scenarios,
|
170
|
+
gen_exec_plan(nil, scenarios, [], ssh_options, tasks, platform)
|
175
171
|
|
176
172
|
task :stdout do
|
177
173
|
|
@@ -184,8 +180,16 @@ namespace :spec do
|
|
184
180
|
|
185
181
|
puts ret
|
186
182
|
elsif ENV['tableformat'] == 'csv'
|
183
|
+
|
184
|
+
maxrows = 0
|
187
185
|
CSV.foreach(csv_file) do |r|
|
188
|
-
|
186
|
+
maxrows = r[2].to_i if r[2].to_i > maxrows
|
187
|
+
end
|
188
|
+
maxrows += 1 # host row
|
189
|
+
|
190
|
+
CSV.foreach(csv_file) do |r|
|
191
|
+
pad_comma = ',' * (maxrows - r[0].split(',').length)
|
192
|
+
puts "#{r[0]}#{pad_comma},#{r[1]}"
|
189
193
|
end
|
190
194
|
else
|
191
195
|
maxlen = 0
|
@@ -193,9 +197,9 @@ namespace :spec do
|
|
193
197
|
n = r[0].each_char.map{|c| c.bytesize == 1 ? 1 : 2}.reduce(0, &:+)
|
194
198
|
maxlen = n if n > maxlen
|
195
199
|
end
|
196
|
-
|
200
|
+
|
197
201
|
pad_spaces = 4
|
198
|
-
|
202
|
+
|
199
203
|
spacer = nil
|
200
204
|
if ENV['tableformat'] == 'mkd'
|
201
205
|
spacer = "|:" + ("-" * maxlen) + "|:" + ("-" * "result".length) + ":|"
|
@@ -207,19 +211,22 @@ namespace :spec do
|
|
207
211
|
is_header = true
|
208
212
|
CSV.foreach(csv_file) do |r|
|
209
213
|
n = r[0].each_char.map{|c| c.bytesize == 1 ? 1 : 2}.reduce(0, &:+)
|
210
|
-
pad_mid = (" " * (maxlen - n)) + " | "
|
211
|
-
pad_tail = (" " * ("result".length - r[1].length)) + " |"
|
212
214
|
|
213
215
|
if r[1] == 'OK'
|
214
216
|
s_effect = "\e[32m"
|
215
217
|
e_effect = "\e[m"
|
218
|
+
r[1] = ' ' + r[1]
|
216
219
|
elsif r[1] == 'NG'
|
217
220
|
s_effect = "\e[31m"
|
218
221
|
e_effect = "\e[m"
|
222
|
+
r[1] = ' ' + r[1]
|
219
223
|
end
|
220
|
-
|
224
|
+
|
225
|
+
pad_mid = (" " * (maxlen - n)) + " | "
|
226
|
+
pad_tail = (" " * ("result".length - r[1].length)) + " |"
|
227
|
+
|
221
228
|
puts "|#{s_effect}#{r[0]}#{e_effect}#{pad_mid}#{s_effect}#{r[1]}#{e_effect}#{pad_tail}"
|
222
|
-
|
229
|
+
|
223
230
|
if is_header
|
224
231
|
puts spacer
|
225
232
|
is_header = false
|
data/bin/serverspec-runner
CHANGED
@@ -12,12 +12,11 @@ opts = GetoptLong.new(
|
|
12
12
|
["--scenario", "-s", GetoptLong::REQUIRED_ARGUMENT],
|
13
13
|
["--specroot", "-r", GetoptLong::REQUIRED_ARGUMENT],
|
14
14
|
["--ssh_options", "-o", GetoptLong::REQUIRED_ARGUMENT],
|
15
|
-
["--result_csv", "-c", GetoptLong::REQUIRED_ARGUMENT],
|
16
15
|
["--explain", "-e", GetoptLong::REQUIRED_ARGUMENT],
|
17
16
|
["--tableformat", "-t", GetoptLong::REQUIRED_ARGUMENT],
|
18
17
|
["--help", "-h", GetoptLong::NO_ARGUMENT],
|
19
18
|
["--tmpdir", "-1", GetoptLong::REQUIRED_ARGUMENT],
|
20
|
-
["--
|
19
|
+
["--tasks", "-T", GetoptLong::REQUIRED_ARGUMENT]
|
21
20
|
)
|
22
21
|
|
23
22
|
opts.each do |opt, arg|
|
@@ -28,24 +27,22 @@ opts.each do |opt, arg|
|
|
28
27
|
ENV['specroot'] = arg
|
29
28
|
when '--ssh_options'
|
30
29
|
ENV['ssh_options'] = arg
|
31
|
-
when '--result_csv'
|
32
|
-
ENV['result_csv'] = arg
|
33
30
|
when '--explain'
|
34
31
|
ENV['explain'] = arg
|
35
32
|
when '--tableformat'
|
36
33
|
ENV['tableformat'] = arg
|
37
34
|
when '--tmpdir'
|
38
35
|
ENV['tmpdir'] = arg
|
39
|
-
when '--
|
36
|
+
when '--tasks'
|
40
37
|
raketask += "::" + arg
|
41
38
|
else
|
42
39
|
puts "Usage: serverspec-runner (options)"
|
43
40
|
puts "-s, --scenario SCENARIO_FILE path to scenario yml file"
|
44
41
|
puts "-r, --specroot SPEC_ROOT path to spec tests root dir"
|
45
42
|
puts "-o, --ssh_options SSH_OPTIONS_FILE path to ssh options yml file"
|
46
|
-
puts "-
|
47
|
-
puts "-e, --explain (short|long) specify result explain length(default: long)"
|
43
|
+
puts "-e, --explain (short|long) specify result explain length(default: short)"
|
48
44
|
puts "-t, --tableformat (aa|mkd|csv|bool) specify result table type(default: aa)"
|
45
|
+
puts "-T, --tasks display the tasks with descriptions(exec rake -T)"
|
49
46
|
puts "-h, --help show help"
|
50
47
|
exit 0
|
51
48
|
end
|
data/spec/example/default.rb
CHANGED
@@ -1,10 +1,28 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/../spec_helper"
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe package('httpd'), :if => os[:family] == 'redhat' do
|
4
|
+
it { should be_installed }
|
5
|
+
end
|
6
|
+
|
7
|
+
describe package('apache2'), :if => os[:family] == 'ubuntu' do
|
8
|
+
it { should be_installed }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe service('httpd'), :if => os[:family] == 'redhat' do
|
12
|
+
it { should be_enabled }
|
13
|
+
it { should be_running }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe service('apache2'), :if => os[:family] == 'ubuntu' do
|
17
|
+
it { should be_enabled }
|
18
|
+
it { should be_running }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe service('org.apache.httpd'), :if => os[:family] == 'darwin' do
|
22
|
+
it { should be_enabled }
|
23
|
+
it { should be_running }
|
24
|
+
end
|
4
25
|
|
5
|
-
|
6
|
-
|
7
|
-
it { eq 0 }
|
8
|
-
end
|
9
|
-
end
|
26
|
+
describe port(80) do
|
27
|
+
it { should be_listening }
|
10
28
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,17 @@ ssh_opts_default = YAML.load_file(ENV['ssh_options'])
|
|
9
9
|
csv_path = ENV['result_csv']
|
10
10
|
explains = []
|
11
11
|
results = []
|
12
|
+
row_num = []
|
13
|
+
spacer_char = ' ' unless ENV['tableformat'] == 'csv'
|
14
|
+
spacer_char = ',' if ENV['tableformat'] == 'csv'
|
15
|
+
|
16
|
+
def get_example_desc(example_group, descriptions)
|
17
|
+
|
18
|
+
descriptions << example_group[:description]
|
19
|
+
return descriptions if example_group[:parent_example_group] == nil
|
20
|
+
|
21
|
+
get_example_desc(example_group[:parent_example_group], descriptions)
|
22
|
+
end
|
12
23
|
|
13
24
|
RSpec.configure do |c|
|
14
25
|
|
@@ -48,6 +59,8 @@ RSpec.configure do |c|
|
|
48
59
|
set :backend, :exec
|
49
60
|
end
|
50
61
|
|
62
|
+
prev_desc_hierarchy = nil
|
63
|
+
|
51
64
|
c.before(:suite) do
|
52
65
|
entity_host = (((ENV['TARGET_HOST'] != ENV['TARGET_SSH_HOST']) && (ENV['TARGET_SSH_HOST'] != nil)) ? "(#{ENV['TARGET_SSH_HOST']})" : "")
|
53
66
|
puts "\e[33m"
|
@@ -56,32 +69,42 @@ RSpec.configure do |c|
|
|
56
69
|
|
57
70
|
explains << "#{role_name}@#{ENV['TARGET_HOST']}#{entity_host}"
|
58
71
|
results << ""
|
72
|
+
row_num << 1
|
59
73
|
end
|
60
74
|
|
61
75
|
c.after(:each) do
|
76
|
+
|
62
77
|
if ENV['explain'] == 'long'
|
63
|
-
explains <<
|
78
|
+
explains << spacer_char + example.metadata[:full_description] + (RSpec::Matchers.generated_description || '')
|
79
|
+
results << (self.example.exception ? 'NG' : 'OK')
|
80
|
+
row_num << 1
|
64
81
|
else
|
65
82
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
83
|
+
spacer = ''
|
84
|
+
desc_hierarchy = get_example_desc(self.example.metadata[:example_group], []).reverse
|
85
|
+
desc_hierarchy.each_with_index do |ex, i|
|
86
|
+
spacer += spacer_char
|
87
|
+
|
88
|
+
if prev_desc_hierarchy != nil && prev_desc_hierarchy.length > i && prev_desc_hierarchy[i] == desc_hierarchy[i]
|
89
|
+
else
|
90
|
+
explains << spacer + ex
|
91
|
+
results << ''
|
92
|
+
row_num << i + 1
|
93
|
+
end
|
71
94
|
end
|
72
95
|
|
73
|
-
|
74
|
-
|
96
|
+
explains << spacer + spacer_char + RSpec::Matchers.generated_description
|
97
|
+
results << (self.example.exception ? 'NG' : 'OK')
|
98
|
+
row_num << desc_hierarchy.length + 1
|
75
99
|
|
76
|
-
|
100
|
+
prev_desc_hierarchy = desc_hierarchy
|
77
101
|
end
|
78
|
-
results << (self.example.exception ? 'NG' : 'OK')
|
79
102
|
end
|
80
103
|
|
81
104
|
c.after(:suite) do
|
82
105
|
CSV.open(csv_path, 'a') do |writer|
|
83
106
|
explains.each_with_index do |v, i|
|
84
|
-
writer << [v, results[i]]
|
107
|
+
writer << [v, results[i], row_num[i]]
|
85
108
|
end
|
86
109
|
end
|
87
110
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serverspec-runner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hiracy
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: serverspec
|