itamae-mitsurin 0.46 → 0.47
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.
- checksums.yaml +4 -4
- data/lib/itamae-mitsurin/cli.rb +2 -0
- data/lib/itamae-mitsurin/logger.rb +22 -0
- data/lib/itamae-mitsurin/mitsurin/itamae_with_target_task.rb +16 -8
- data/lib/itamae-mitsurin/mitsurin/task_base.rb +12 -1
- data/lib/itamae-mitsurin/node.rb +1 -0
- data/lib/itamae-mitsurin/notification.rb +1 -0
- data/lib/itamae-mitsurin/recipe.rb +6 -0
- data/lib/itamae-mitsurin/resource.rb +1 -0
- data/lib/itamae-mitsurin/resource/base.rb +12 -0
- data/lib/itamae-mitsurin/runner.rb +5 -0
- data/lib/itamae-mitsurin/version.txt +1 -1
- 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: 4b2e51e59486a4d9e4012683da2438208ae1ff71
|
|
4
|
+
data.tar.gz: e940d9d0f5426b12c422809299bc5c4c031f0897
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6d0cfb95644d5f397e8c65a3d4412449fab7e3f9d1f22935fa16a151ec5ebc06f509af45c2d2aa85e9f1359ed2766ded7b6473aa068bb9f60d2ef005caffe668
|
|
7
|
+
data.tar.gz: f896bfdf02712c6c37e5d825ae300d367137c13732cc154ba62394a64c1d2af30cc43164bf73c07ea87fd790a46834b18ca283bb8ececd903c86b5916fe8e4ea
|
data/lib/itamae-mitsurin/cli.rb
CHANGED
|
@@ -12,7 +12,9 @@ module ItamaeMitsurin
|
|
|
12
12
|
super
|
|
13
13
|
|
|
14
14
|
ItamaeMitsurin.logger.level = ::Logger.const_get(options[:log_level].upcase)
|
|
15
|
+
ItamaeMitsurin.file_logger.level = ::Logger.const_get(options[:log_level].upcase)
|
|
15
16
|
ItamaeMitsurin.logger.formatter.colored = options[:color]
|
|
17
|
+
ItamaeMitsurin.file_logger.formatter.colored = options[:color]
|
|
16
18
|
end
|
|
17
19
|
|
|
18
20
|
def self.define_exec_options
|
|
@@ -120,10 +120,24 @@ module ItamaeMitsurin
|
|
|
120
120
|
end
|
|
121
121
|
end
|
|
122
122
|
|
|
123
|
+
# @logger = ::Logger.new($stdout).tap do |l|
|
|
124
|
+
# l.formatter = ItamaeMitsurin::Logger::Formatter.new
|
|
125
|
+
# end.extend(ItamaeMitsurin::Logger::Helper)
|
|
126
|
+
|
|
123
127
|
@logger = ::Logger.new($stdout).tap do |l|
|
|
124
128
|
l.formatter = ItamaeMitsurin::Logger::Formatter.new
|
|
125
129
|
end.extend(ItamaeMitsurin::Logger::Helper)
|
|
126
130
|
|
|
131
|
+
class ItamaeMitsurin::Logger::FileFormatter < ItamaeMitsurin::Logger::Formatter
|
|
132
|
+
def colorize(str, severity)
|
|
133
|
+
Time.now.strftime('%Y %m %d %H:%M:%S %z').to_s + str
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
@file_logger = ::Logger.new('logs/itamae.log', 5, 100 * 1024 * 1024).tap do |l|
|
|
138
|
+
l.formatter = ItamaeMitsurin::Logger::FileFormatter.new
|
|
139
|
+
end.extend(ItamaeMitsurin::Logger::Helper)
|
|
140
|
+
|
|
127
141
|
class << self
|
|
128
142
|
def logger
|
|
129
143
|
@logger
|
|
@@ -132,5 +146,13 @@ module ItamaeMitsurin
|
|
|
132
146
|
def logger=(l)
|
|
133
147
|
@logger = l.extend(ItamaeMitsurin::Logger::Helper)
|
|
134
148
|
end
|
|
149
|
+
|
|
150
|
+
def file_logger
|
|
151
|
+
@file_logger
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def file_logger=(l)
|
|
155
|
+
@file_logger = l.extend(ItamaeMitsurin::Logger::Helper)
|
|
156
|
+
end
|
|
135
157
|
end
|
|
136
158
|
end
|
|
@@ -9,17 +9,18 @@ module ItamaeMitsurin
|
|
|
9
9
|
all = []
|
|
10
10
|
if (ARGV[0] == '-T' || ARGV[0] == '--tasks') && ARGV[1] != nil
|
|
11
11
|
if File.exists?("nodes/#{ARGV[1]}")
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
project_h = {:project => ARGV[1]}
|
|
13
|
+
File.open "Project.json", 'w' do |f|
|
|
14
|
+
f.flock File::LOCK_EX
|
|
15
|
+
f.puts project_h.to_json
|
|
16
|
+
f.flock File::LOCK_UN
|
|
17
|
+
end
|
|
18
|
+
puts TaskBase.hl.color "Changed target mode '#{ARGV[1]}'", :green
|
|
19
19
|
else
|
|
20
20
|
raise "Change mode error '#{ARGV[1]}' is not exists"
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
|
+
|
|
23
24
|
ret = JSON.parse(File.read("Project.json"))
|
|
24
25
|
target = ret["project"] << '/**'
|
|
25
26
|
|
|
@@ -31,6 +32,7 @@ module ItamaeMitsurin
|
|
|
31
32
|
rescue JSON::ParserError => e
|
|
32
33
|
puts e.class.to_s + ", " + e.backtrace[0].to_s
|
|
33
34
|
puts "Node error, nodefile:#{node_file}, reason:#{e.message}"
|
|
35
|
+
TaskBase.file_logger.fatal "Node error, nodefile:#{node_file}, reason:#{e.message}"
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
node_short = node_h[:environments][:hostname].split(".")[0]
|
|
@@ -51,6 +53,7 @@ module ItamaeMitsurin
|
|
|
51
53
|
rescue Exception => e
|
|
52
54
|
puts e.class.to_s + ", " + e.backtrace[0].to_s
|
|
53
55
|
puts "Node or role error, nodefile:#{node_file}, reason:#{e.message}"
|
|
56
|
+
TaskBase.file_logger.fatal "Node or role error, nodefile:#{node_file}, reason:#{e.message}"
|
|
54
57
|
else
|
|
55
58
|
recipes.flatten!
|
|
56
59
|
end
|
|
@@ -63,6 +66,7 @@ module ItamaeMitsurin
|
|
|
63
66
|
rescue Exception => e
|
|
64
67
|
puts e.class.to_s + ", " + e.backtrace[0].to_s
|
|
65
68
|
puts "Node or environment error, nodefile:#{node_file}, reason:#{e.message}"
|
|
69
|
+
TaskBase.file_logger.fatal "Node or environment error, nodefile:#{node_file}, reason:#{e.message}"
|
|
66
70
|
end
|
|
67
71
|
|
|
68
72
|
# get recipes attr
|
|
@@ -132,7 +136,7 @@ module ItamaeMitsurin
|
|
|
132
136
|
command << " --ask-password" unless ssh_password.nil?
|
|
133
137
|
command << " --dry-run" if ENV['dry-run'] == "true"
|
|
134
138
|
command << " -l debug" if ENV['debug'] == "true"
|
|
135
|
-
command << " -c logs/config/itamae_with_target_task.config"
|
|
139
|
+
# command << " -c logs/config/itamae_with_target_task.config"
|
|
136
140
|
|
|
137
141
|
# Pass to read the recipe command
|
|
138
142
|
command_recipe = []
|
|
@@ -155,6 +159,7 @@ module ItamaeMitsurin
|
|
|
155
159
|
command << command_recipe.join
|
|
156
160
|
|
|
157
161
|
puts TaskBase.hl.color(%!Run Itamae to "#{bname}"!, :red)
|
|
162
|
+
TaskBase.file_logger.info(%!Run Itamae to "#{bname}"!)
|
|
158
163
|
run_list_noti = []
|
|
159
164
|
command_recipe.each { |c_recipe|
|
|
160
165
|
unless c_recipe.split("/")[4].split(".")[0] == 'default'
|
|
@@ -165,9 +170,12 @@ module ItamaeMitsurin
|
|
|
165
170
|
}
|
|
166
171
|
|
|
167
172
|
puts TaskBase.hl.color(%!Run List to \"#{run_list_noti.uniq.join(", ")}\"!, :green)
|
|
173
|
+
TaskBase.file_logger.info(%!Run List to \"#{run_list_noti.uniq.join(", ")}\"!)
|
|
168
174
|
puts TaskBase.hl.color(%!#{command}!, :white)
|
|
175
|
+
TaskBase.file_logger.debug(%!#{command}!)
|
|
169
176
|
st = system command
|
|
170
177
|
exit 1 unless st
|
|
178
|
+
TaskBase.file_logger.info "itamae_with_target_task end."
|
|
171
179
|
end
|
|
172
180
|
end
|
|
173
181
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require 'json'
|
|
2
2
|
require 'highline'
|
|
3
|
-
require
|
|
3
|
+
require 'tmpdir'
|
|
4
|
+
require 'logger'
|
|
4
5
|
|
|
5
6
|
module ItamaeMitsurin
|
|
6
7
|
module Mitsurin
|
|
@@ -82,6 +83,16 @@ module ItamaeMitsurin
|
|
|
82
83
|
def handler_logger
|
|
83
84
|
default = {"handlers"=>[{"type"=>"json", "path"=>"itamae-log.json"}]}
|
|
84
85
|
end
|
|
86
|
+
|
|
87
|
+
def file_logger
|
|
88
|
+
file_logger = ::Logger.new('logs/itamae.log', 5, 100 * 1024 * 1024).tap do |l|
|
|
89
|
+
l.formatter = proc do |serverity, datetime, progname, msg|
|
|
90
|
+
"#{datetime.strftime('%Y %m %d %H:%M:%S %z')} #{serverity} : #{msg}\n"
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
file_logger
|
|
95
|
+
end
|
|
85
96
|
end
|
|
86
97
|
|
|
87
98
|
end
|
data/lib/itamae-mitsurin/node.rb
CHANGED
|
@@ -35,6 +35,7 @@ module ItamaeMitsurin
|
|
|
35
35
|
unless errors.empty?
|
|
36
36
|
errors.each do |error|
|
|
37
37
|
ItamaeMitsurin.logger.error "'#{error.position.join('->')}' #{error.message}"
|
|
38
|
+
ItamaeMitsurin.file_logger.error "'#{error.position.join('->')}' #{error.message}"
|
|
38
39
|
end
|
|
39
40
|
raise ValidationError
|
|
40
41
|
end
|
|
@@ -33,6 +33,7 @@ module ItamaeMitsurin
|
|
|
33
33
|
def validate!
|
|
34
34
|
unless [:delay, :delayed, :immediately].include?(timing)
|
|
35
35
|
ItamaeMitsurin.logger.error "'#{timing}' is not valid notification timing. (Valid option is delayed or immediately)"
|
|
36
|
+
ItamaeMitsurin.file_logger.error "'#{timing}' is not valid notification timing. (Valid option is delayed or immediately)"
|
|
36
37
|
abort
|
|
37
38
|
end
|
|
38
39
|
end
|
|
@@ -66,6 +66,11 @@ module ItamaeMitsurin
|
|
|
66
66
|
@children.run
|
|
67
67
|
run_delayed_notifications
|
|
68
68
|
end
|
|
69
|
+
|
|
70
|
+
ItamaeMitsurin.file_logger.with_indent do
|
|
71
|
+
@children.run
|
|
72
|
+
run_delayed_notifications
|
|
73
|
+
end
|
|
69
74
|
end
|
|
70
75
|
end
|
|
71
76
|
|
|
@@ -83,6 +88,7 @@ module ItamaeMitsurin
|
|
|
83
88
|
|
|
84
89
|
def show_banner
|
|
85
90
|
ItamaeMitsurin.logger.info "Recipe: #{@path}"
|
|
91
|
+
ItamaeMitsurin.file_logger.info "Recipe: #{@path}"
|
|
86
92
|
end
|
|
87
93
|
|
|
88
94
|
class EvalContext
|
|
@@ -149,6 +149,7 @@ module ItamaeMitsurin
|
|
|
149
149
|
end
|
|
150
150
|
rescue Backend::CommandExecutionError
|
|
151
151
|
ItamaeMitsurin.logger.error "#{resource_type}[#{resource_name}] Failed."
|
|
152
|
+
ItamaeMitsurin.file_logger.error "#{resource_type}[#{resource_name}] Failed."
|
|
152
153
|
exit 2
|
|
153
154
|
end
|
|
154
155
|
|
|
@@ -189,6 +190,7 @@ module ItamaeMitsurin
|
|
|
189
190
|
if runner.dry_run?
|
|
190
191
|
unless respond_to?(method_name)
|
|
191
192
|
ItamaeMitsurin.logger.error "action #{action.inspect} is unavailable"
|
|
193
|
+
ItamaeMitsurin.file_logger.error "action #{action.inspect} is unavailable"
|
|
192
194
|
end
|
|
193
195
|
else
|
|
194
196
|
args = [method_name]
|
|
@@ -239,12 +241,14 @@ module ItamaeMitsurin
|
|
|
239
241
|
elsif current_value.nil? && !value.nil?
|
|
240
242
|
ItamaeMitsurin.logger.color :green do
|
|
241
243
|
ItamaeMitsurin.logger.info "#{resource_type}[#{resource_name}] #{key} will be '#{value}'"
|
|
244
|
+
ItamaeMitsurin.file_logger.info "#{resource_type}[#{resource_name}] #{key} will be '#{value}'"
|
|
242
245
|
end
|
|
243
246
|
elsif current_value == value || value.nil?
|
|
244
247
|
ItamaeMitsurin.logger.debug "#{resource_type}[#{resource_name}] #{key} will not change (current value is '#{current_value}')"
|
|
245
248
|
else
|
|
246
249
|
ItamaeMitsurin.logger.color :green do
|
|
247
250
|
ItamaeMitsurin.logger.info "#{resource_type}[#{resource_name}] #{key} will change from '#{current_value}' to '#{value}'"
|
|
251
|
+
ItamaeMitsurin.file_logger.info "#{resource_type}[#{resource_name}] #{key} will change from '#{current_value}' to '#{value}'"
|
|
248
252
|
end
|
|
249
253
|
end
|
|
250
254
|
end
|
|
@@ -347,9 +351,11 @@ module ItamaeMitsurin
|
|
|
347
351
|
end
|
|
348
352
|
|
|
349
353
|
ItamaeMitsurin.logger.info message
|
|
354
|
+
ItamaeMitsurin.file_logger.info message
|
|
350
355
|
|
|
351
356
|
if notification.instance_of?(Subscription)
|
|
352
357
|
ItamaeMitsurin.logger.info "(because it subscribes this resource)"
|
|
358
|
+
ItamaeMitsurin.file_logger.info "(because it subscribes this resource)"
|
|
353
359
|
end
|
|
354
360
|
|
|
355
361
|
if notification.delayed?
|
|
@@ -364,11 +370,17 @@ module ItamaeMitsurin
|
|
|
364
370
|
return if @verify_commands.empty?
|
|
365
371
|
|
|
366
372
|
ItamaeMitsurin.logger.info "Verifying..."
|
|
373
|
+
ItamaeMitsurin.file_logger.info "Verifying..."
|
|
367
374
|
ItamaeMitsurin.logger.with_indent do
|
|
368
375
|
@verify_commands.each do |command|
|
|
369
376
|
run_command(command)
|
|
370
377
|
end
|
|
371
378
|
end
|
|
379
|
+
ItamaeMitsurin.file_logger.with_indent do
|
|
380
|
+
@verify_commands.each do |command|
|
|
381
|
+
run_command(command)
|
|
382
|
+
end
|
|
383
|
+
end
|
|
372
384
|
end
|
|
373
385
|
end
|
|
374
386
|
end
|
|
@@ -7,6 +7,7 @@ module ItamaeMitsurin
|
|
|
7
7
|
class << self
|
|
8
8
|
def run(recipe_files, backend_type, options)
|
|
9
9
|
ItamaeMitsurin.logger.info "Starting Itamae..."
|
|
10
|
+
ItamaeMitsurin.file_logger.info "Starting Itamae..."
|
|
10
11
|
|
|
11
12
|
backend = Backend.create(backend_type, options)
|
|
12
13
|
runner = self.new(backend, options)
|
|
@@ -99,22 +100,26 @@ module ItamaeMitsurin
|
|
|
99
100
|
unless @backend.run_command("which ohai", error: false).exit_status == 0
|
|
100
101
|
# install Ohai
|
|
101
102
|
ItamaeMitsurin.logger.info "Installing Chef package... (to use Ohai)"
|
|
103
|
+
ItamaeMitsurin.file_logger.info "Installing Chef package... (to use Ohai)"
|
|
102
104
|
@backend.run_command("curl -L https://www.opscode.com/chef/install.sh | bash")
|
|
103
105
|
end
|
|
104
106
|
|
|
105
107
|
ItamaeMitsurin.logger.info "Loading node data via ohai..."
|
|
108
|
+
ItamaeMitsurin.file_logger.info "Loading node data via ohai..."
|
|
106
109
|
hash.merge!(JSON.parse(@backend.run_command("ohai").stdout))
|
|
107
110
|
end
|
|
108
111
|
|
|
109
112
|
if @options[:node_json]
|
|
110
113
|
path = File.expand_path(@options[:node_json])
|
|
111
114
|
ItamaeMitsurin.logger.info "Loading node data from #{path}..."
|
|
115
|
+
ItamaeMitsurin.file_logger.info "Loading node data from #{path}..."
|
|
112
116
|
hash.merge!(JSON.load(open(path)))
|
|
113
117
|
end
|
|
114
118
|
|
|
115
119
|
if @options[:node_yaml]
|
|
116
120
|
path = File.expand_path(@options[:node_yaml])
|
|
117
121
|
ItamaeMitsurin.logger.info "Loading node data from #{path}..."
|
|
122
|
+
ItamaeMitsurin.file_logger.info "Loading node data from #{path}..."
|
|
118
123
|
hash.merge!(YAML.load(open(path)) || {})
|
|
119
124
|
end
|
|
120
125
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.47
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: itamae-mitsurin
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: '0.
|
|
4
|
+
version: '0.47'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Akihiro Kamiyama
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-07-
|
|
11
|
+
date: 2016-07-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|