itamae-mitsurin 0.50 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +5 -5
  2. data/lib/itamae-mitsurin/cli.rb +0 -2
  3. data/lib/itamae-mitsurin/logger.rb +74 -20
  4. data/lib/itamae-mitsurin/mitsurin/base.rb +109 -0
  5. data/lib/itamae-mitsurin/mitsurin/base_task.rb +147 -0
  6. data/lib/itamae-mitsurin/mitsurin/creators/templates/project/site-cookbooks/_base/_base/recipes/default.rb +0 -11
  7. data/lib/itamae-mitsurin/mitsurin/itamae_task.rb +44 -130
  8. data/lib/itamae-mitsurin/mitsurin/itamae_with_target_task.rb +64 -157
  9. data/lib/itamae-mitsurin/mitsurin/local_task.rb +57 -131
  10. data/lib/itamae-mitsurin/mitsurin/serverspec_task.rb +56 -81
  11. data/lib/itamae-mitsurin/mitsurin/serverspec_with_target_task.rb +80 -143
  12. data/lib/itamae-mitsurin/node.rb +0 -1
  13. data/lib/itamae-mitsurin/notification.rb +0 -1
  14. data/lib/itamae-mitsurin/recipe.rb +2 -5
  15. data/lib/itamae-mitsurin/resource.rb +1 -1
  16. data/lib/itamae-mitsurin/resource/base.rb +0 -12
  17. data/lib/itamae-mitsurin/resource/http_request.rb +23 -8
  18. data/lib/itamae-mitsurin/resource/s3_file.rb +33 -0
  19. data/lib/itamae-mitsurin/runner.rb +4 -5
  20. data/lib/itamae-mitsurin/version.txt +1 -1
  21. metadata +6 -221
  22. data/lib/itamae-mitsurin/mitsurin/itamae_with_git_task.rb +0 -159
  23. data/lib/itamae-mitsurin/mitsurin/task_base.rb +0 -100
  24. data/test/test_itamae-mitsurin.rb +0 -18
  25. data/test/test_itamae-mitsurin/ext/test_specinfra.rb +0 -39
  26. data/test/test_itamae-mitsurin/handler/test_base.rb +0 -40
  27. data/test/test_itamae-mitsurin/handler/test_debug.rb +0 -10
  28. data/test/test_itamae-mitsurin/handler/test_fluentd.rb +0 -44
  29. data/test/test_itamae-mitsurin/handler/test_json.rb +0 -22
  30. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/.rspec +0 -2
  31. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/Gemfile +0 -3
  32. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/Rakefile +0 -2
  33. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/environments/.keep +0 -0
  34. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/environments/sample.json +0 -7
  35. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/keys/.keep +0 -0
  36. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/nodes/.keep +0 -0
  37. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/nodes/sample01.json +0 -9
  38. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/roles/.keep +0 -0
  39. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/site-cookbooks/_base/_base/attributes/.keep +0 -0
  40. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/site-cookbooks/_base/_base/files/.keep +0 -0
  41. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/site-cookbooks/_base/_base/recipes/default.rb +0 -1
  42. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/site-cookbooks/_base/_base/spec/default_spec.rb +0 -1
  43. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/site-cookbooks/_base/_base/templates/.keep +0 -0
  44. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/spec/spec_helper.rb +0 -33
  45. data/test/test_itamae-mitsurin/mitsurin/creators/templates/project/tmp-nodes/.keep +0 -0
  46. data/test/test_itamae-mitsurin/mitsurin/creators/templates/site-cookbooks/attributes/.keep +0 -0
  47. data/test/test_itamae-mitsurin/mitsurin/creators/templates/site-cookbooks/files/.keep +0 -0
  48. data/test/test_itamae-mitsurin/mitsurin/creators/templates/site-cookbooks/recipes/default.rb +0 -0
  49. data/test/test_itamae-mitsurin/mitsurin/creators/templates/site-cookbooks/spec/.keep +0 -0
  50. data/test/test_itamae-mitsurin/mitsurin/creators/templates/site-cookbooks/templates/.keep +0 -0
  51. data/test/test_itamae-mitsurin/mitsurin/creators/test_cookbook.rb +0 -24
  52. data/test/test_itamae-mitsurin/mitsurin/creators/test_project.rb +0 -24
  53. data/test/test_itamae-mitsurin/mitsurin/test_cli.rb +0 -56
  54. data/test/test_itamae-mitsurin/mitsurin/test_creators.rb +0 -19
  55. data/test/test_itamae-mitsurin/mitsurin/test_itamae_task.rb +0 -197
  56. data/test/test_itamae-mitsurin/mitsurin/test_itamae_with_git_task.rb +0 -213
  57. data/test/test_itamae-mitsurin/mitsurin/test_serverspec_task.rb +0 -123
  58. data/test/test_itamae-mitsurin/resource/test_aws_ebs_volume.rb +0 -84
  59. data/test/test_itamae-mitsurin/resource/test_base.rb +0 -374
  60. data/test/test_itamae-mitsurin/resource/test_directory.rb +0 -63
  61. data/test/test_itamae-mitsurin/resource/test_execute.rb +0 -26
  62. data/test/test_itamae-mitsurin/resource/test_file.rb +0 -176
  63. data/test/test_itamae-mitsurin/resource/test_gem_package.rb +0 -81
  64. data/test/test_itamae-mitsurin/resource/test_git.rb +0 -94
  65. data/test/test_itamae-mitsurin/resource/test_group.rb +0 -42
  66. data/test/test_itamae-mitsurin/resource/test_http_request.rb +0 -71
  67. data/test/test_itamae-mitsurin/resource/test_link.rb +0 -33
  68. data/test/test_itamae-mitsurin/resource/test_local_ruby_block.rb +0 -15
  69. data/test/test_itamae-mitsurin/resource/test_package.rb +0 -44
  70. data/test/test_itamae-mitsurin/resource/test_remote_directory.rb +0 -84
  71. data/test/test_itamae-mitsurin/resource/test_remote_file.rb +0 -54
  72. data/test/test_itamae-mitsurin/resource/test_service.rb +0 -69
  73. data/test/test_itamae-mitsurin/resource/test_template.rb +0 -53
  74. data/test/test_itamae-mitsurin/resource/test_user.rb +0 -93
  75. data/test/test_itamae-mitsurin/test_backend.rb +0 -297
  76. data/test/test_itamae-mitsurin/test_cli.rb +0 -88
  77. data/test/test_itamae-mitsurin/test_definition.rb +0 -40
  78. data/test/test_itamae-mitsurin/test_ext.rb +0 -1
  79. data/test/test_itamae-mitsurin/test_handler.rb +0 -21
  80. data/test/test_itamae-mitsurin/test_handler_proxy.rb +0 -38
  81. data/test/test_itamae-mitsurin/test_logger.rb +0 -124
  82. data/test/test_itamae-mitsurin/test_mitsurin.rb +0 -14
  83. data/test/test_itamae-mitsurin/test_node.rb +0 -74
  84. data/test/test_itamae-mitsurin/test_notification.rb +0 -46
  85. data/test/test_itamae-mitsurin/test_recipe.rb +0 -171
  86. data/test/test_itamae-mitsurin/test_recipe_children.rb +0 -86
  87. data/test/test_itamae-mitsurin/test_resource.rb +0 -73
  88. data/test/test_itamae-mitsurin/test_runner.rb +0 -124
  89. data/test/test_itamae-mitsurin/test_version.rb +0 -3
  90. data/test/test_itamae-mitsurin/version.txt +0 -1
  91. data/test_project/.rspec +0 -2
  92. data/test_project/Gemfile +0 -4
  93. data/test_project/Rakefile +0 -3
  94. data/test_project/environments/.keep +0 -0
  95. data/test_project/keys/.keep +0 -0
  96. data/test_project/nodes/.keep +0 -0
  97. data/test_project/nodes/test.json +0 -9
  98. data/test_project/roles/.keep +0 -0
  99. data/test_project/roles/test.json +0 -14
  100. data/test_project/site-cookbooks/_base/_base/attributes/.keep +0 -0
  101. data/test_project/site-cookbooks/_base/_base/files/.keep +0 -0
  102. data/test_project/site-cookbooks/_base/_base/recipes/default.rb +0 -1
  103. data/test_project/site-cookbooks/_base/_base/spec/default_spec.rb +0 -1
  104. data/test_project/site-cookbooks/_base/_base/templates/.keep +0 -0
  105. data/test_project/site-cookbooks/a_test/directory/attributes/.keep +0 -0
  106. data/test_project/site-cookbooks/a_test/directory/files/.keep +0 -0
  107. data/test_project/site-cookbooks/a_test/directory/recipes/default.rb +0 -8
  108. data/test_project/site-cookbooks/a_test/directory/spec/.keep +0 -0
  109. data/test_project/site-cookbooks/a_test/directory/spec/default_spec.rb +0 -4
  110. data/test_project/site-cookbooks/a_test/directory/templates/.keep +0 -0
  111. data/test_project/site-cookbooks/a_test/package/attributes/.keep +0 -0
  112. data/test_project/site-cookbooks/a_test/package/files/.keep +0 -0
  113. data/test_project/site-cookbooks/a_test/package/recipes/default.rb +0 -2
  114. data/test_project/site-cookbooks/a_test/package/spec/.keep +0 -0
  115. data/test_project/site-cookbooks/a_test/package/spec/default_spec.rb +0 -4
  116. data/test_project/site-cookbooks/a_test/package/templates/.keep +0 -0
  117. data/test_project/site-cookbooks/a_test/service/attributes/.keep +0 -0
  118. data/test_project/site-cookbooks/a_test/service/files/.keep +0 -0
  119. data/test_project/site-cookbooks/a_test/service/recipes/default.rb +0 -5
  120. data/test_project/site-cookbooks/a_test/service/spec/.keep +0 -0
  121. data/test_project/site-cookbooks/a_test/service/spec/default_spec.rb +0 -6
  122. data/test_project/site-cookbooks/a_test/service/templates/.keep +0 -0
  123. data/test_project/site-cookbooks/b_test/git/attributes/.keep +0 -0
  124. data/test_project/site-cookbooks/b_test/git/files/.keep +0 -0
  125. data/test_project/site-cookbooks/b_test/git/recipes/default.rb +0 -5
  126. data/test_project/site-cookbooks/b_test/git/spec/.keep +0 -0
  127. data/test_project/site-cookbooks/b_test/git/spec/default_spec.rb +0 -5
  128. data/test_project/site-cookbooks/b_test/git/templates/.keep +0 -0
  129. data/test_project/site-cookbooks/b_test/link/attributes/.keep +0 -0
  130. data/test_project/site-cookbooks/b_test/link/files/.keep +0 -0
  131. data/test_project/site-cookbooks/b_test/link/recipes/default.rb +0 -5
  132. data/test_project/site-cookbooks/b_test/link/spec/.keep +0 -0
  133. data/test_project/site-cookbooks/b_test/link/spec/default_spec.rb +0 -5
  134. data/test_project/site-cookbooks/b_test/link/templates/.keep +0 -0
  135. data/test_project/site-cookbooks/b_test/remote_file/attributes/.keep +0 -0
  136. data/test_project/site-cookbooks/b_test/remote_file/files/.keep +0 -0
  137. data/test_project/site-cookbooks/b_test/remote_file/files/remote_file.sh +0 -1
  138. data/test_project/site-cookbooks/b_test/remote_file/recipes/default.rb +0 -9
  139. data/test_project/site-cookbooks/b_test/remote_file/spec/.keep +0 -0
  140. data/test_project/site-cookbooks/b_test/remote_file/spec/default_spec.rb +0 -7
  141. data/test_project/site-cookbooks/b_test/remote_file/templates/.keep +0 -0
  142. data/test_project/site-cookbooks/b_test/template/attributes/.keep +0 -0
  143. data/test_project/site-cookbooks/b_test/template/files/.keep +0 -0
  144. data/test_project/site-cookbooks/b_test/template/recipes/default.rb +0 -5
  145. data/test_project/site-cookbooks/b_test/template/spec/.keep +0 -0
  146. data/test_project/site-cookbooks/b_test/template/spec/default_spec.rb +0 -7
  147. data/test_project/site-cookbooks/b_test/template/templates/.keep +0 -0
  148. data/test_project/site-cookbooks/b_test/template/templates/template.erb +0 -2
  149. data/test_project/site-cookbooks/c_test/execute/attributes/.keep +0 -0
  150. data/test_project/site-cookbooks/c_test/execute/files/.keep +0 -0
  151. data/test_project/site-cookbooks/c_test/execute/recipes/default.rb +0 -6
  152. data/test_project/site-cookbooks/c_test/execute/spec/.keep +0 -0
  153. data/test_project/site-cookbooks/c_test/execute/spec/default_spec.rb +0 -6
  154. data/test_project/site-cookbooks/c_test/execute/templates/.keep +0 -0
  155. data/test_project/site-cookbooks/c_test/remote_directory/attributes/.keep +0 -0
  156. data/test_project/site-cookbooks/c_test/remote_directory/files/.keep +0 -0
  157. data/test_project/site-cookbooks/c_test/remote_directory/recipes/default.rb +0 -10
  158. data/test_project/site-cookbooks/c_test/remote_directory/spec/.keep +0 -0
  159. data/test_project/site-cookbooks/c_test/remote_directory/spec/default_spec.rb +0 -20
  160. data/test_project/site-cookbooks/c_test/remote_directory/templates/.keep +0 -0
  161. data/test_project/site-cookbooks/c_test/remote_directory/templates/remote_dir/a.txt +0 -0
  162. data/test_project/site-cookbooks/c_test/remote_directory/templates/remote_dir/b.txt +0 -0
  163. data/test_project/site-cookbooks/c_test/remote_directory/templates/remote_dir/c.txt +0 -0
  164. data/test_project/site-cookbooks/d_spec/air/attributes/.keep +0 -0
  165. data/test_project/site-cookbooks/d_spec/air/files/.keep +0 -0
  166. data/test_project/site-cookbooks/d_spec/air/recipes/default.rb +0 -0
  167. data/test_project/site-cookbooks/d_spec/air/spec/.keep +0 -0
  168. data/test_project/site-cookbooks/d_spec/air/spec/default_spec.rb +0 -0
  169. data/test_project/site-cookbooks/d_spec/air/templates/.keep +0 -0
  170. data/test_project/spec/spec_helper.rb +0 -33
  171. data/test_project/tmp-nodes/.keep +0 -0
  172. data/test_project/tmp-nodes/test.json +0 -12
@@ -1,3 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'itamae-mitsurin'
@@ -1,2 +0,0 @@
1
- require 'itamae/mitsurin/itamae_task'
2
- require 'itamae/mitsurin/serverspec_task'
@@ -1,7 +0,0 @@
1
- {
2
- "environments": {
3
- "ssh_port": "22",
4
- "ssh_user": "ec2-user",
5
- "ssh_key": "keipair.pem"
6
- }
7
- }
@@ -1,9 +0,0 @@
1
- {
2
- "run_list": [
3
- "recipe[_base]"
4
- ],
5
- "environments": {
6
- "set": "sample",
7
- "hostname": "sample01.localhost"
8
- }
9
- }
@@ -1 +0,0 @@
1
- puts " LOAD : Environment set is " << node[:environments][:set]
@@ -1,33 +0,0 @@
1
- require 'serverspec'
2
- require 'net/ssh'
3
- require 'specinfra/helper/set'
4
- require 'json'
5
- include Specinfra::Helper::Set
6
-
7
- set :backend, :ssh
8
-
9
- if ENV['ASK_SUDO_PASSWORD']
10
- begin
11
- require 'highline/import'
12
- rescue LoadError
13
- fail "highline is not available. Try installing it."
14
- end
15
- set :sudo_password, ask("Enter sudo password: ") { |q| q.echo = false }
16
- else
17
- set :sudo_password, ENV['SUDO_PASSWORD']
18
- end
19
-
20
- host = ENV['TARGET_HOST']
21
- node_file = ENV['NODE_FILE']
22
- attributes = JSON.parse(File.read(node_file), symbolize_names: true)
23
- set_property attributes
24
-
25
- options = Net::SSH::Config.for(host)
26
- options[:user] = ENV['SSH_USER']
27
- options[:password] = ENV['SSH_PASSWORD']
28
- options[:keys] = ENV['SSH_KEY']
29
- options[:port] = ENV['SSH_PORT']
30
-
31
- set :host, options[:host_name] || host
32
- set :shell, '/bin/bash'
33
- set :ssh_options, options
@@ -1,24 +0,0 @@
1
- require 'thor'
2
- require 'thor/group'
3
-
4
- module Itamae
5
- module Mitsurin
6
- module Creators
7
- class Cookbook < Thor::Group
8
- include Thor::Actions
9
-
10
- def self.source_root
11
- File.expand_path('../templates/site-cookbooks', __FILE__)
12
- end
13
-
14
- def copy_files
15
- directory '.'
16
- end
17
-
18
- def remove_files
19
- remove_file '.'
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,24 +0,0 @@
1
- require 'thor'
2
- require 'thor/group'
3
-
4
- module Itamae
5
- module Mitsurin
6
- module Creators
7
- class Project < Thor::Group
8
- include Thor::Actions
9
-
10
- def self.source_root
11
- File.dirname(__FILE__) + '/templates/project'
12
- end
13
-
14
- def copy_files
15
- directory '.'
16
- end
17
-
18
- def bundle
19
- run 'bundle install'
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,56 +0,0 @@
1
- require 'itamae-mitsurin'
2
- require 'itamae-mitsurin/mitsurin'
3
- require 'thor'
4
-
5
- module ItamaeMitsurin
6
- module Mitsurin
7
- class CLI < Thor
8
- CREATE_TARGETS = %w[ cookbook ].freeze
9
-
10
- # class_option :with_git, type: :string, aliases: ['-g']
11
-
12
- desc "version", "Print version"
13
- def version
14
- puts "shikomi(itamae-mitsurin) v#{ItamaeMitsurin::VERSION}"
15
- end
16
-
17
- desc "init", "Create a new project"
18
- def init
19
- creator = Creators::Project.new
20
- creator.destination_root
21
- creator.invoke_all
22
- end
23
-
24
- desc 'create cookbook [LAYER] [NAME]', 'Initialize cookbook (short-cut alias: "c")'
25
- map 'c' => 'create'
26
- def create(target, layer, name)
27
- name = layer + '/' + name
28
- validate_create_target!('create', target)
29
-
30
- creator = Creators.find(target).new
31
- creator.destination_root = File.join("site-cookbooks", name)
32
- creator.copy_files
33
- end
34
-
35
- desc 'destroy cookbook [LAYER] [NAME]', 'Undo cookbook (short-cut alias: "d")'
36
- map 'd' => 'destroy'
37
- def destroy(target, layer, name)
38
- name = layer + '/' + name
39
- validate_create_target!('destroy', target)
40
-
41
- creator = Creators.find(target).new
42
- creator.destination_root = File.join("site-cookbooks", name)
43
- creator.remove_files
44
- end
45
-
46
- private
47
- def validate_create_target!(command, target)
48
- unless CREATE_TARGETS.include?(target)
49
- msg = %Q!ERROR: "shikomi #{command}" was called with "#{target}" !
50
- msg << "but expected to be in #{CREATE_TARGETS.inspect}"
51
- fail InvocationError, msg
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,19 +0,0 @@
1
- require "itamae-mitsurin/mitsurin/creators/cookbook"
2
- require "itamae-mitsurin/mitsurin/creators/project"
3
-
4
- module ItamaeMitsurin
5
- module Mitsurin
6
- module Creators
7
- def self.find(target)
8
- case target
9
- when 'cookbook'
10
- Cookbook
11
- when 'project'
12
- Project
13
- else
14
- raise "unexpected target: #{target}"
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,197 +0,0 @@
1
- require 'json'
2
- require 'simple_color'
3
- include Rake::DSL if defined? Rake::DSL
4
-
5
- module Itamae
6
- module Mitsurin
7
- class ItamaeTask
8
-
9
- class << self
10
- class ::Hash
11
- def deep_merge(other)
12
- merger = lambda {|key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2}
13
- self.merge(other, &merger)
14
- end
15
-
16
- def deep_merge!(other)
17
- merger = lambda {|key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2}
18
- self.merge!(other, &merger)
19
- end
20
- end
21
-
22
- def self.get_roles(node_file)
23
- roles = []
24
- JSON.parse(File.read(node_file))['run_list'].each do |role|
25
- roles << role.gsub(/role\[(.+)\]/, '\1') if /role\[(.+)\]/ === role
26
- end
27
- roles
28
- end
29
-
30
- def self.get_recipes(role)
31
- recipes = []
32
- JSON.parse(File.read("roles/#{role}.json"))['run_list'].each do |recipe|
33
- if /recipe\[(.+)::(.+)\]/ === recipe
34
- recipes << {recipe.gsub(/recipe\[(.+)::(.+)\]/, '\1') => recipe.gsub(/recipe\[(.+)::(.+)\]/, '\2')}
35
- else
36
- recipes << {recipe.gsub(/recipe\[(.+)\]/, '\1') => nil}
37
- end
38
- end
39
- recipes
40
- end
41
-
42
- def self.get_node_recipes(node_file)
43
- recipes = []
44
- JSON.parse(File.read(node_file))['run_list'].each do |recipe|
45
- if /recipe\[(.+)::(.+)\]/ === recipe
46
- recipes << {recipe.gsub(/recipe\[(.+)::(.+)\]/, '\1') => recipe.gsub(/recipe\[(.+)::(.+)\]/, '\2')}
47
- else
48
- recipes << {recipe.gsub(/recipe\[(.+)\]/, '\1') => nil} unless /role\[(.+)\]/ === recipe
49
- end
50
- end
51
- recipes
52
- end
53
-
54
- def self.jq(*objs)
55
- par = nil
56
- objs.each {|obj| par = JSON::pretty_generate(obj, :allow_nan => true, :max_nesting => false)}
57
- return par
58
- end
59
-
60
- def self.write_json(filename)
61
- File.open "tmp-nodes/#{filename}.json", 'w' do |f|
62
- f.flock File::LOCK_EX
63
- yield f
64
- f.flock File::LOCK_UN
65
- end
66
- end
67
-
68
- color = SimpleColor.new
69
-
70
- namespace :itamae do
71
- Dir.glob("nodes/**/*.json").each do |node_file|
72
-
73
- bname = File.basename(node_file, '.json')
74
- node_h = JSON.parse(File.read(node_file), symbolize_names: true)
75
-
76
- desc "Itamae to #{bname}"
77
- task node_h[:environments][:hostname].split(".")[0] do
78
- begin
79
- recipes = []
80
- get_roles(node_file).each do |role|
81
- recipes << get_recipes(role)
82
- end
83
- get_node_recipes(node_file).each do |recipe|
84
- recipes << recipe
85
- end
86
- rescue Exception => e
87
- puts e.class.to_s + ", " + e.backtrace[0].to_s
88
- puts "nodefile or role error, nodefile:#{node_file} reason:#{e.message}"
89
- exit 1
90
- else
91
- recipes.flatten!
92
- end
93
-
94
- # get env attr
95
- begin
96
- env_set = node_h[:environments][:set]
97
- env_h = JSON.parse(File.read("environments/#{env_set}.json"), symbolize_names: true)
98
- rescue Exception => e
99
- puts e.class.to_s + ", " + e.backtrace[0].to_s
100
- puts "nodefile or environments error, nodefile:#{node_file} reason:#{e.message}"
101
- exit 1
102
- end
103
-
104
- # get recipes attr
105
- recipe_attr_file = []
106
- recipes.each do |recipe_h|
107
- if recipe_h["#{recipe_h.keys.join}"].nil?
108
- recipe_attr_file.insert 0,
109
- Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/attributes/default.json")
110
- else
111
- recipe_attr_file <<
112
- Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/attributes/#{recipe_h["#{recipe_h.keys.join}"]}.json")
113
- end
114
- end
115
-
116
- recipe_attr_file.flatten!
117
-
118
- # recipes attr other=env
119
- recipe_env_h_a = []
120
- recipe_attr_file.each do |file|
121
- recipe_h = JSON.parse(File.read(file), symbolize_names: true)
122
- recipe_env_h_a << recipe_h.deep_merge(env_h)
123
- end
124
-
125
- # recipe attr other=recipes_env
126
- moto = recipe_env_h_a[0]
127
- recipe_env_h_a.each {|hash| moto.deep_merge!(hash)}
128
- recipe_env_h = moto
129
-
130
- if recipe_env_h.nil?
131
- # env attr other=node
132
- node_env_h = env_h.deep_merge(node_h)
133
- node_env_j = jq node_env_h
134
- write_json(bname) {|file| file.puts node_env_j}
135
- else
136
- # recipe_env attr other=node
137
- recipe_env_node_h = recipe_env_h.deep_merge(node_h)
138
- recipe_env_node_j = jq recipe_env_node_h
139
- write_json(bname) {|file| file.puts recipe_env_node_j}
140
- end
141
-
142
- recipes << {'_base' => nil}
143
- node_property = JSON.parse(File.read("tmp-nodes/#{bname}.json"), symbolize_names: true)
144
- node = node_property[:environments][:hostname]
145
- ssh_user = node_property[:environments][:ssh_user]
146
- ssh_password = node_property[:environments][:ssh_password]
147
- sudo_password = node_property[:environments][:sudo_password]
148
- ssh_port = node_property[:environments][:ssh_port]
149
- ssh_key = node_property[:environments][:ssh_key]
150
-
151
- ENV['TARGET_HOST'] = node
152
- ENV['NODE_FILE'] = node_file
153
- ENV['SSH_PASSWORD'] = ssh_password
154
- ENV['SUDO_PASSWORD'] = sudo_password
155
-
156
- command = "bundle exec itamae ssh"
157
- command << " -h #{node}"
158
- command << " -u #{ssh_user}"
159
- command << " -p #{ssh_port}"
160
- command << " -i keys/#{ssh_key}" unless ssh_key.nil?
161
- command << " -j tmp-nodes/#{bname}.json"
162
- command << " --shell=bash"
163
- command << " --ask-password" unless ssh_password.nil?
164
- command << " --dry-run" if ENV['dry_run'] == "true"
165
- command << " -l debug" if ENV['debug'] == "true"
166
-
167
- # recipe load to_command
168
- command_recipe = []
169
- recipes.each do |recipe_h|
170
- if recipe_h["#{recipe_h.keys.join}"].nil?
171
- command_recipe <<
172
- " #{Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/recipes/default.rb").join}"
173
- else
174
- command_recipe <<
175
- " #{Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/recipes/#{recipe_h["#{recipe_h.keys.join}"]}.rb").join}"
176
- end
177
- end
178
- command_recipe.sort_by! {|item| File.dirname(item)}
179
- command << command_recipe.join
180
-
181
- color.echos(:red ,%!Run Itamae to \"#{bname}\"!)
182
- color.echos(:blue, %!Role List to \"#{get_roles(node_file).join(", ")}\"!)
183
- run_list_noti = []
184
- command_recipe.each {|c_recipe| run_list_noti << c_recipe.split("/") [2]}
185
- color.echos(:green, %!Run List to \"#{run_list_noti.uniq.join(", ")}\"!)
186
- puts color.echos(:white, %!#{command}!)
187
- st = system command
188
- exit 1 unless st
189
- end
190
-
191
- end
192
- end
193
- end
194
-
195
- end
196
- end
197
- end
@@ -1,213 +0,0 @@
1
- require 'specinfra'
2
- require 'json'
3
- require 'simple_color'
4
- require 'specinfra/helper/set'
5
- include Specinfra::Helper::Set
6
- include Rake::DSL if defined? Rake::DSL
7
-
8
- module Itamae
9
- module Mitsurin
10
- class ItamaeTask
11
-
12
- class << self
13
- class ::Hash
14
- def deep_merge(other)
15
- merger = lambda {|key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2}
16
- self.merge(other, &merger)
17
- end
18
-
19
- def deep_merge!(other)
20
- merger = lambda {|key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2}
21
- self.merge!(other, &merger)
22
- end
23
- end
24
-
25
- def self.get_roles(node_file)
26
- roles = []
27
- JSON.parse(File.read(node_file))['run_list'].each do |role|
28
- roles << role.gsub(/role\[(.+)\]/, '\1') if /role\[(.+)\]/ === role
29
- end
30
- roles
31
- end
32
-
33
- def self.get_recipes(role)
34
- recipes = []
35
- JSON.parse(File.read("roles/#{role}.json"))['run_list'].each do |recipe|
36
- if /recipe\[(.+)::(.+)\]/ === recipe
37
- recipes << {recipe.gsub(/recipe\[(.+)::(.+)\]/, '\1') => recipe.gsub(/recipe\[(.+)::(.+)\]/, '\2')}
38
- else
39
- recipes << {recipe.gsub(/recipe\[(.+)\]/, '\1') => nil}
40
- end
41
- end
42
- recipes
43
- end
44
-
45
- def self.get_node_recipes(node_file)
46
- recipes = []
47
- JSON.parse(File.read(node_file))['run_list'].each do |recipe|
48
- if /recipe\[(.+)::(.+)\]/ === recipe
49
- recipes << {recipe.gsub(/recipe\[(.+)::(.+)\]/, '\1') => recipe.gsub(/recipe\[(.+)::(.+)\]/, '\2')}
50
- else
51
- recipes << {recipe.gsub(/recipe\[(.+)\]/, '\1') => nil} unless /role\[(.+)\]/ === recipe
52
- end
53
- end
54
- recipes
55
- end
56
-
57
- def self.jq(*objs)
58
- par = nil
59
- objs.each {|obj| par = JSON::pretty_generate(obj, :allow_nan => true, :max_nesting => false)}
60
- return par
61
- end
62
-
63
- def self.write_json(filename)
64
- File.open "tmp-nodes/#{filename}.json", 'w' do |f|
65
- f.flock File::LOCK_EX
66
- yield f
67
- f.flock File::LOCK_UN
68
- end
69
- end
70
-
71
- color = SimpleColor.new
72
-
73
- set :backend, :exec
74
-
75
- namespace :itamae do
76
- branches = Specinfra.backend.run_command('git branch')
77
- branch = branches.stdout.split("\n").select{|a| /\*/ === a }
78
- branch = branch.join.gsub(/\* (.+)/, '\1')
79
- if branch == 'staging'
80
- branch = 'staging/**'
81
- elsif branch == 'master'
82
- branch = 'production/**'
83
- else
84
- branch = 'other/**'
85
- end
86
-
87
- Dir.glob("nodes/#{branch}/*.json").each do |node_file|
88
-
89
- bname = File.basename(node_file, '.json')
90
- node_h = JSON.parse(File.read(node_file), symbolize_names: true)
91
-
92
- desc "Itamae to #{bname}"
93
- task node_h[:environments][:hostname].split(".")[0] do
94
- begin
95
- recipes = []
96
- get_roles(node_file).each do |role|
97
- recipes << get_recipes(role)
98
- end
99
- get_node_recipes(node_file).each do |recipe|
100
- recipes << recipe
101
- end
102
- rescue Exception => e
103
- puts e.class.to_s + ", " + e.backtrace[0].to_s
104
- puts "nodefile or role error, nodefile:#{node_file} reason:#{e.message}"
105
- exit 1
106
- else
107
- recipes.flatten!
108
- end
109
-
110
- # get env attr
111
- begin
112
- env_set = node_h[:environments][:set]
113
- env_h = JSON.parse(File.read("environments/#{env_set}.json"), symbolize_names: true)
114
- rescue Exception => e
115
- puts e.class.to_s + ", " + e.backtrace[0].to_s
116
- puts "nodefile or environments error, nodefile:#{node_file} reason:#{e.message}"
117
- exit 1
118
- end
119
-
120
- # get recipe attr
121
- recipe_attr_file = []
122
- recipes.each do |recipe_h|
123
- if recipe_h["#{recipe_h.keys.join}"].nil?
124
- recipe_attr_file.insert 0,
125
- Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/attributes/default.json")
126
- else
127
- recipe_attr_file <<
128
- Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/attributes/#{recipe_h["#{recipe_h.keys.join}"]}.json")
129
- end
130
- end
131
-
132
- recipe_attr_file.flatten!
133
-
134
- # recipe attr other=env
135
- recipe_env_h_a = []
136
- recipe_attr_file.each do |file|
137
- recipe_h = JSON.parse(File.read(file), symbolize_names: true)
138
- recipe_env_h_a << recipe_h.deep_merge(env_h)
139
- end
140
-
141
- # recipe attr other=recipes
142
- moto = recipe_env_h_a[0]
143
- recipe_env_h_a.each {|hash| moto.deep_merge!(hash)}
144
- recipe_env_h = moto
145
-
146
- if recipe_env_h.nil?
147
- # node attr other=env
148
- node_env_h = env_h.deep_merge(node_h)
149
- node_env_j = jq node_env_h
150
- write_json(bname) {|file| file.puts node_env_j}
151
- else
152
- # node attr other=recipe_env
153
- recipe_env_node_h = recipe_env_h.deep_merge(node_h)
154
- recipe_env_node_j = jq recipe_env_node_h
155
- write_json(bname) {|file| file.puts recipe_env_node_j}
156
- end
157
-
158
- recipes << {'_base' => nil}
159
- node_property = JSON.parse(File.read("tmp-nodes/#{bname}.json"), symbolize_names: true)
160
- node = node_property[:environments][:hostname]
161
- ssh_user = node_property[:environments][:ssh_user]
162
- ssh_password = node_property[:environments][:ssh_password]
163
- sudo_password = node_property[:environments][:sudo_password]
164
- ssh_port = node_property[:environments][:ssh_port]
165
- ssh_key = node_property[:environments][:ssh_key]
166
-
167
- ENV['TARGET_HOST'] = node
168
- ENV['NODE_FILE'] = node_file
169
- ENV['SSH_PASSWORD'] = ssh_password
170
- ENV['SUDO_PASSWORD'] = sudo_password
171
-
172
- command = "bundle exec itamae ssh"
173
- command << " -h #{node}"
174
- command << " -u #{ssh_user}"
175
- command << " -p #{ssh_port}"
176
- command << " -i keys/#{ssh_key}" unless ssh_key.nil?
177
- command << " -j tmp-nodes/#{bname}.json"
178
- command << " --shell=bash"
179
- command << " --ask-password" unless ssh_password.nil?
180
- command << " --dry-run" if ENV['dry_run'] == "true"
181
- command << " -l debug" if ENV['debug'] == "true"
182
-
183
- # recipe load to_command
184
- command_recipe = []
185
- recipes.each do |recipe_h|
186
- if recipe_h["#{recipe_h.keys.join}"].nil?
187
- command_recipe <<
188
- " #{Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/recipes/default.rb").join}"
189
- else
190
- command_recipe <<
191
- " #{Dir.glob("site-cookbooks/**/#{recipe_h.keys.join}/recipes/#{recipe_h["#{recipe_h.keys.join}"]}.rb").join}"
192
- end
193
- end
194
- command_recipe.sort_by! {|item| File.dirname(item)}
195
- command << command_recipe.join
196
-
197
- color.echos(:red ,%!Run Itamae to \"#{bname}\"!)
198
- color.echos(:blue, %!Role List to \"#{get_roles(node_file).join(", ")}\"!)
199
- run_list_noti = []
200
- command_recipe.each {|c_recipe| run_list_noti << c_recipe.split("/") [2]}
201
- color.echos(:green, %!Run List to \"#{run_list_noti.uniq.join(", ")}\"!)
202
- puts color.echos(:white, %!#{command}!)
203
- st = system command
204
- exit 1 unless st
205
- end
206
-
207
- end
208
- end
209
- end
210
-
211
- end
212
- end
213
- end