docker-builder 0.1.5

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.
Files changed (72) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/CODE_OF_CONDUCT.md +49 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +21 -0
  6. data/Rakefile +140 -0
  7. data/bin/console +14 -0
  8. data/bin/setup +8 -0
  9. data/docker-builder.gemspec +36 -0
  10. data/examples/example-apps-php/.chef/knife.rb +6 -0
  11. data/examples/example-apps-php/config.rb +19 -0
  12. data/examples/example-apps-php/servers/apps-php/.chef/knife.rb +2 -0
  13. data/examples/example-apps-php/servers/apps-php/config.rb +69 -0
  14. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/README.md +1 -0
  15. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/metadata.rb +9 -0
  16. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/build.rb +43 -0
  17. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/install.rb +55 -0
  18. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/install_app.rb +27 -0
  19. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/recipes/install_host.rb +9 -0
  20. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/index.html.erb +4 -0
  21. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/nginx-sites/app.conf.erb +55 -0
  22. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/nginx-sites/app.conf.erb.1 +55 -0
  23. data/examples/example-apps-php/servers/apps-php/cookbooks/apps-php/templates/nginx-sites/default.conf.erb +45 -0
  24. data/examples/example-apps-php/servers/apps-php/readme.md +0 -0
  25. data/examples/example-nginx/config.rb +19 -0
  26. data/examples/example-nginx/servers/nginx/.chef/knife.rb +8 -0
  27. data/examples/example-nginx/servers/nginx/config.rb +54 -0
  28. data/examples/example-nginx/servers/nginx/cookbooks/nginx/README.md +1 -0
  29. data/examples/example-nginx/servers/nginx/cookbooks/nginx/metadata.rb +9 -0
  30. data/examples/example-nginx/servers/nginx/cookbooks/nginx/recipes/build.rb +10 -0
  31. data/examples/example-nginx/servers/nginx/cookbooks/nginx/recipes/install.rb +28 -0
  32. data/examples/example-nginx/servers/nginx/cookbooks/nginx/recipes/install_host.rb +9 -0
  33. data/examples/example-nginx/servers/nginx/cookbooks/nginx/templates/index.html.erb +4 -0
  34. data/examples/example-nginx/servers/nginx/cookbooks/nginx/templates/nginx-sites/default.conf.erb +45 -0
  35. data/examples/example-nginx/servers/nginx/readme.md +0 -0
  36. data/examples/example-nginx/temp/ex_nginx.json +20 -0
  37. data/examples/example-nginx/temp/nginx.json +1 -0
  38. data/exe/docker-builder +20 -0
  39. data/install_local.sh +2 -0
  40. data/lib/docker_builder.rb +18 -0
  41. data/lib/docker_builder/chef/.chef/knife.rb +115 -0
  42. data/lib/docker_builder/chef/chef_build_image.copy0.rb +60 -0
  43. data/lib/docker_builder/chef/chef_destroy_image.copy0.rb +35 -0
  44. data/lib/docker_builder/cli.rb +346 -0
  45. data/lib/docker_builder/config.rb +199 -0
  46. data/lib/docker_builder/config/dsl.rb +48 -0
  47. data/lib/docker_builder/config/helpers.rb +99 -0
  48. data/lib/docker_builder/manager.rb +364 -0
  49. data/lib/docker_builder/server_settings.rb +286 -0
  50. data/lib/docker_builder/version.rb +3 -0
  51. data/lib/templates/example-chef/config.rb.erb +18 -0
  52. data/lib/templates/example-chef/servers/server1/.chef/knife.rb +8 -0
  53. data/lib/templates/example-chef/servers/server1/config.rb.erb +54 -0
  54. data/lib/templates/example-chef/servers/server1/cookbooks/server1/README.md +1 -0
  55. data/lib/templates/example-chef/servers/server1/cookbooks/server1/metadata.rb.erb +8 -0
  56. data/lib/templates/example-chef/servers/server1/cookbooks/server1/recipes/build.rb +10 -0
  57. data/lib/templates/example-chef/servers/server1/cookbooks/server1/recipes/install.rb +36 -0
  58. data/lib/templates/example-chef/servers/server1/cookbooks/server1/recipes/install_host.rb +9 -0
  59. data/lib/templates/example-chef/servers/server1/cookbooks/server1/templates/index.html.erb +5 -0
  60. data/lib/templates/example-chef/servers/server1/cookbooks/server1/templates/nginx-sites/default.conf.erb +45 -0
  61. data/readme.md +233 -0
  62. data/readme_developers.md +54 -0
  63. data/temp.sh +21 -0
  64. data/temp/app-php.json +1 -0
  65. data/temp/build.sh +29 -0
  66. data/temp/chef_build_image.rb +37 -0
  67. data/temp/chef_destroy_image.rb +16 -0
  68. data/temp/cookbooks/temp1/README.md +1 -0
  69. data/temp/cookbooks/temp1/metadata.rb +9 -0
  70. data/temp/cookbooks/temp1/recipes/build.rb +42 -0
  71. data/temp/run.sh +2 -0
  72. metadata +157 -0
@@ -0,0 +1,20 @@
1
+ {
2
+ "build":{
3
+ "image_name":"nginx","build_type":"chef", "base_image":{"name":"nginx","repository":"nginx","tag":"1.10"}
4
+ },
5
+
6
+ "install":{
7
+ "host":{"script_type":"chef_recipe","script":"install_host"},
8
+ "node":{"script_type":"chef_recipe","script":"install"}
9
+ },
10
+ "docker": {
11
+ "command":"nginx -g 'daemon off;'","ports":[[8080,80]],
12
+ "volumes":[["html","/usr/share/nginx/html"],["log/nginx","/var/log/nginx/"]],"links":[]
13
+ },
14
+
15
+ "attributes":{
16
+ "nginx":{"sitename":"mysite.local"}},"name":"nginx","common":{"prefix":"example-","image_prefix":"example-","dir_data":"/disk3/data/my-examples/"
17
+ },
18
+
19
+ "base":{"image_name":"example-nginx"}
20
+ }
@@ -0,0 +1 @@
1
+ {"build":{"image_name":"nginx","build_type":"chef","base_image":{"name":"nginx","repository":"nginx","tag":"1.10"}},"install":{"host":{"script_type":"chef_recipe","script":"install_host"},"node":{"script_type":"chef_recipe","script":"install"}},"docker":{"command":"nginx -g 'daemon off;'","ports":[[8080,80]],"volumes":[["/disk3/data/my-examples/nginx/html","/usr/share/nginx/html"],["/disk3/data/my-examples/nginx/log/nginx","/var/log/nginx/"]],"links":[]},"attributes":{"nginx":{"sitename":"mysite.local"}},"name":"nginx","common":{"prefix":"example-","image_prefix":"example-","dir_data":"/disk3/data/my-examples/"},"base":{"image_name":"example-nginx","container_name":"example-nginx"}}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ #lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ lib = File.expand_path(File.dirname(__FILE__) + 'lib')
5
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
6
+
7
+ require File.expand_path("../../lib/docker_builder", __FILE__)
8
+ #require "docker_builder"
9
+
10
+
11
+
12
+ puts "Docker builder v.#{DockerBuilder::VERSION}"
13
+
14
+ # input
15
+ #args = ARGV.dup
16
+ #ARGV.clear
17
+ #command = args.shift.strip rescue 'help'
18
+
19
+
20
+ DockerBuilder::CLI.start
@@ -0,0 +1,2 @@
1
+ gem build docker-builder.gemspec
2
+ gem install ./docker-builder-0.1.4.gem
@@ -0,0 +1,18 @@
1
+ require "docker_builder/version"
2
+
3
+ require 'thor'
4
+
5
+ LIBRARY_PATH = File.join(File.dirname(__FILE__), 'docker_builder')
6
+
7
+ module DockerBuilder
8
+
9
+
10
+ ##
11
+ # Require Backup base files
12
+ %w{
13
+ config
14
+ cli
15
+ server_settings
16
+ manager
17
+ }.each {|lib| require File.join(LIBRARY_PATH, lib) }
18
+ end
@@ -0,0 +1,115 @@
1
+ # settings
2
+ local_mode true
3
+
4
+ #
5
+ #log_level :debug
6
+ log_level :info
7
+
8
+
9
+ #
10
+ root = File.absolute_path(File.dirname(__FILE__))
11
+ current_dir = File.dirname(__FILE__)
12
+
13
+ #puts "***** current dir =#{current_dir}"
14
+ #puts "***** SERVER root dir =#{ENV['SERVER_PATH']}"
15
+ #exit
16
+
17
+ #
18
+ my_server_name = ENV["NODE_NAME"] || ENV["SERVER_NAME"]
19
+ node_name my_server_name
20
+
21
+ knife[:chef_node_name] = my_server_name
22
+
23
+ server_base_dir = ENV['SERVER_PATH']
24
+ server_cookbooks_path = File.expand_path('cookbooks', server_base_dir)
25
+
26
+
27
+ #client_key "#{current_dir}/dummy.pem"
28
+ #validation_client_name "validator"
29
+
30
+ cookbooks_paths = [
31
+ server_cookbooks_path,
32
+
33
+ #'/mnt/data/projects/mmx/docker-builder/examples/example-nginx/servers/nginx/cookbooks',
34
+ #File.expand_path('../temp-cookbooks', root),
35
+ #File.join(root, '../cookbooks'),
36
+ #File.join(root, '../', node_name, 'cookbooks'),
37
+
38
+ #'/mnt/data/projects/mmx/chef-repo/cookbooks-common',
39
+ #'/mnt/data/projects/mmx/chef-repo/cookbooks',
40
+ #'/work/chef-repo/cookbooks-common',
41
+ #'/work/chef-repo/cookbooks',
42
+
43
+ ]
44
+
45
+ cookbooks_paths.reject!{|f| !Dir.exists?(f)}
46
+
47
+ #puts "cookbooks: #{cookbooks_paths.inspect}"
48
+
49
+
50
+
51
+
52
+ # load another knife file
53
+ knife_custom_files = [
54
+ File.expand_path(".chef/knife.rb", server_base_dir),
55
+ File.expand_path("../../.chef/knife.rb", server_base_dir),
56
+ ]
57
+ #File.expand_path("../../examples/example-nginx/servers/#{my_server_name}/.chef/knife.rb", __FILE__)
58
+
59
+ knife_custom_files.each do |file_knife_custom|
60
+ if ::File.exist?(file_knife_custom)
61
+ #puts "load from file #{file_knife_custom}"
62
+ Chef::Config.from_file(file_knife_custom)
63
+ end
64
+ end
65
+
66
+
67
+ cookbook_path cookbook_path+cookbooks_paths
68
+
69
+ puts "FINAL cookbooks: #{cookbook_path}"
70
+
71
+ # node name
72
+ knife[:force] = true
73
+
74
+
75
+ # ssh
76
+ knife[:ssh_attribute] = "knife_zero.host"
77
+
78
+
79
+ #knife[:ssh_user] = 'mmx'
80
+ #knife[:ssh_password] = 'pwd'
81
+
82
+ #knife[:use_sudo] = true
83
+
84
+ #--no-host-key-verify
85
+ knife[:host_key_verify] = false
86
+ #--use-sudo-password
87
+ #knife[:use_sudo_password] = true
88
+
89
+
90
+
91
+ # ssl
92
+
93
+ ssl_verify_mode :verify_none
94
+
95
+
96
+
97
+
98
+ ## Attributes of node objects will be saved to json file.
99
+ ## the automatic_attribute_whitelist option limits the attributes to be saved.
100
+ knife[:automatic_attribute_whitelist] = %w[
101
+ fqdn
102
+ os
103
+ os_version
104
+ hostname
105
+ ipaddress
106
+ roles
107
+ recipes
108
+ ipaddress
109
+ platform
110
+ platform_version
111
+ platform_version
112
+ cloud
113
+ cloud_v2
114
+ chef_packages
115
+ ]
@@ -0,0 +1,60 @@
1
+ base_dir = File.dirname(__FILE__)
2
+
3
+ puts "dir=#{base_dir}"
4
+ puts "node: #{node.inspect}"
5
+ exit
6
+
7
+ #
8
+ require_relative '../config'
9
+ require_relative '../server_settings'
10
+
11
+ #
12
+ require 'chef/provisioning'
13
+
14
+ #
15
+ server_name = ENV['SERVER_NAME']
16
+ settings = DockerBuilder::Settings.load_settings_for_server(server_name)
17
+
18
+ #a_volumes = (settings.attributes['build']['volumes'] || [])
19
+
20
+ # settings
21
+ docker_options = {
22
+ base_image: settings.attributes['build']['base_image'],
23
+ privileged: true,
24
+ command: settings.attributes['docker']['command'] || '',
25
+ #ports: settings.docker_ports_array,
26
+ #volume: [], # '/var/www/html',
27
+ #volumes: ['/var/www/html'], # ,
28
+
29
+ #links: settings.docker_links_array
30
+ }
31
+
32
+ puts "image = #{settings.image_name}"
33
+ puts "opt = #{docker_options}"
34
+ #exit
35
+
36
+ ### docker image
37
+ with_driver 'docker'
38
+ machine_image settings.image_name do
39
+ action :create
40
+
41
+ recipe "#{server_name}::build"
42
+
43
+ # attributes
44
+ node.keys.each do |k|
45
+ attribute k, node[k]
46
+ end
47
+
48
+ # attributes
49
+ settings.node.keys.each do |k|
50
+ attribute k, settings.node[k]
51
+ end
52
+
53
+ #
54
+ machine_options docker_options: docker_options
55
+
56
+
57
+ end
58
+
59
+
60
+
@@ -0,0 +1,35 @@
1
+ base_dir = File.dirname(__FILE__)
2
+
3
+ #
4
+ require_relative 'lib/settings'
5
+
6
+ #
7
+ require 'chef/provisioning'
8
+
9
+ #
10
+ server_name = ENV['SERVER_NAME']
11
+ settings = Settings.load_settings_for_server(server_name)
12
+
13
+
14
+
15
+ # settings
16
+ docker_options = {
17
+ base_image: settings.attributes['build']['base_image'],
18
+ privileged: true,
19
+ command: settings.attributes['docker']['command'] || '',
20
+ #ports: settings.docker_ports_array,
21
+ #volumes: settings.docker_volumes_array,
22
+ #links: settings.docker_links_array
23
+ }
24
+
25
+ puts "image = #{settings.image_name}"
26
+ puts "opt = #{docker_options}"
27
+
28
+
29
+ ### docker image
30
+ with_driver 'docker'
31
+
32
+ machine_image settings.image_name do
33
+ action :destroy
34
+ end
35
+
@@ -0,0 +1,346 @@
1
+ module DockerBuilder
2
+ class CLI < Thor
3
+ include Thor::Actions
4
+
5
+ def self.source_root
6
+ #File.dirname(__FILE__)
7
+ File.expand_path('../../templates', __FILE__)
8
+ end
9
+
10
+
11
+ ##
12
+ # [build]
13
+ #
14
+ #
15
+ desc 'build', 'Build Docker image'
16
+
17
+ long_desc <<-EOS.gsub(/^ +/, '')
18
+ Build Docker image.
19
+ EOS
20
+
21
+ method_option :server,
22
+ :aliases => ['-s', '--server'],
23
+ :required => false,
24
+ :type => :string,
25
+ :desc => "Server name"
26
+
27
+ method_option :root_path,
28
+ :aliases => '-r',
29
+ :type => :string,
30
+ :default => '',
31
+ :desc => 'Root path to base all relative path on.'
32
+
33
+ method_option :config_file,
34
+ :aliases => '-c',
35
+ :type => :string,
36
+ :default => '',
37
+ :desc => 'Path to your config.rb file.'
38
+
39
+ def build
40
+ puts "building..."
41
+
42
+ opts = options
43
+ #puts "opt from command line: #{options.inspect}"
44
+
45
+
46
+ warnings = false
47
+ errors = false
48
+
49
+
50
+ servers = nil
51
+ begin
52
+ Config.load(options)
53
+
54
+ Config.servers.each do |name, opts|
55
+ server_settings = Manager.load_settings(name, opts)
56
+
57
+ Manager.destroy_image(name, server_settings)
58
+ Manager.build_image(name, server_settings)
59
+ end
60
+
61
+
62
+ #servers = options[:server].split(',').map(&:strip)
63
+ #models = triggers.map {|trigger|
64
+ # Model.find_by_trigger(trigger)
65
+ #}.flatten.uniq
66
+
67
+ #raise Error, "No servers found " + "'#{ triggers.join(',') }'." if models.empty?
68
+
69
+ # Finalize Logger and begin real-time logging.
70
+ #Logger.start!
71
+
72
+ rescue Exception => err
73
+ #Logger.error Error.wrap(err)
74
+ #unless Helpers.is_backup_error? err
75
+ # Logger.error err.backtrace.join("\n")
76
+ #end
77
+
78
+ # Logger configuration will be ignored
79
+ # and messages will be output to the console only.
80
+ #Logger.abort!
81
+
82
+ puts "exception: #{err.inspect}"
83
+ raise err
84
+ exit(3)
85
+ end
86
+
87
+ exit(errors ? 2 : 1) if errors || warnings
88
+
89
+ end
90
+
91
+
92
+ ##
93
+ # [destroy_image]
94
+ #
95
+ #
96
+ desc 'destroy_image', 'Destroy Docker image'
97
+
98
+ long_desc <<-EOS.gsub(/^ +/, '')
99
+ Destroy Docker image.
100
+ EOS
101
+
102
+ method_option :server,
103
+ :aliases => ['-s', '--server'],
104
+ :required => false,
105
+ :type => :string,
106
+ :desc => "Server name"
107
+
108
+ method_option :root_path,
109
+ :aliases => '-r',
110
+ :type => :string,
111
+ :default => '',
112
+ :desc => 'Root path to base all relative path on.'
113
+
114
+ method_option :config_file,
115
+ :aliases => '-c',
116
+ :type => :string,
117
+ :default => '',
118
+ :desc => 'Path to your config.rb file.'
119
+
120
+ def destroy_image
121
+ puts "destroying image..."
122
+
123
+ warnings = false
124
+ errors = false
125
+
126
+ begin
127
+ Config.load(options)
128
+
129
+ puts "root: #{Config.root_path}"
130
+
131
+ #puts "servers: #{Config.servers.inspect}"
132
+
133
+ Config.servers.each do |name, opts|
134
+ server_settings = Manager.load_settings(name, opts)
135
+
136
+ Manager.destroy_image(name, server_settings)
137
+ end
138
+
139
+ #raise Error, "No servers found " + "'#{ triggers.join(',') }'." if models.empty?
140
+
141
+ rescue Exception => err
142
+ puts "exception: #{err.inspect}"
143
+ raise err
144
+ exit(3)
145
+ end
146
+
147
+ exit(errors ? 2 : 1) if errors || warnings
148
+
149
+ end
150
+
151
+
152
+ ##
153
+ # [up]
154
+ #
155
+ #
156
+ desc 'up', 'Run Docker container'
157
+
158
+ long_desc <<-EOS.gsub(/^ +/, '')
159
+ Run Docker container.
160
+ EOS
161
+
162
+ method_option :server,
163
+ :aliases => ['-s', '--server'],
164
+ :required => false,
165
+ :type => :string,
166
+ :desc => "Server name"
167
+
168
+ method_option :root_path,
169
+ :aliases => '-r',
170
+ :type => :string,
171
+ :default => '',
172
+ :desc => 'Root path to base all relative path on.'
173
+
174
+ method_option :config_file,
175
+ :aliases => '-c',
176
+ :type => :string,
177
+ :default => '',
178
+ :desc => 'Path to your config.rb file.'
179
+
180
+ def up
181
+ puts "running..."
182
+
183
+ opts = options
184
+
185
+ warnings = false
186
+ errors = false
187
+
188
+
189
+ servers = nil
190
+ begin
191
+ Config.load(options)
192
+
193
+ Config.servers.each do |name, opts|
194
+ server_settings = Manager.load_settings(name, opts)
195
+
196
+ Manager.destroy_container(name, server_settings)
197
+ Manager.run_container(name, server_settings)
198
+ end
199
+
200
+ rescue Exception => err
201
+ puts "exception: #{err.inspect}"
202
+ raise err
203
+ exit(3)
204
+ end
205
+
206
+ exit(errors ? 2 : 1) if errors || warnings
207
+
208
+ end
209
+
210
+
211
+
212
+ ##
213
+ # [destroy]
214
+ #
215
+ #
216
+ desc 'destroy', 'Destroy Docker container'
217
+
218
+ long_desc <<-EOS.gsub(/^ +/, '')
219
+ Destroy Docker container.
220
+ EOS
221
+
222
+ method_option :server,
223
+ :aliases => ['-s', '--server'],
224
+ :required => false,
225
+ :type => :string,
226
+ :desc => "Server name"
227
+
228
+ method_option :root_path,
229
+ :aliases => '-r',
230
+ :type => :string,
231
+ :default => '',
232
+ :desc => 'Root path to base all relative path on.'
233
+
234
+ method_option :config_file,
235
+ :aliases => '-c',
236
+ :type => :string,
237
+ :default => '',
238
+ :desc => 'Path to your config.rb file.'
239
+
240
+ def destroy
241
+ puts "destroying..."
242
+
243
+ opts = options
244
+
245
+ warnings = false
246
+ errors = false
247
+
248
+
249
+ servers = nil
250
+ begin
251
+ Config.load(options)
252
+
253
+ Config.servers.each do |name, opts|
254
+ server_settings = Manager.load_settings(name, opts)
255
+
256
+ Manager.destroy_container(name, server_settings)
257
+ end
258
+
259
+ rescue Exception => err
260
+ puts "exception: #{err.inspect}"
261
+ raise err
262
+ exit(3)
263
+ end
264
+
265
+ exit(errors ? 2 : 1) if errors || warnings
266
+
267
+ end
268
+
269
+
270
+ ### generators
271
+
272
+ ##
273
+ # [generate new project]
274
+ #
275
+ #
276
+ desc 'generate', 'Generate new project'
277
+
278
+ long_desc <<-EOS.gsub(/^ +/, '')
279
+ Generate new project
280
+ EOS
281
+
282
+ method_option :name,
283
+ :aliases => ['-n', '--name'],
284
+ :required => false,
285
+ :type => :string,
286
+ :desc => "Project name"
287
+
288
+
289
+ method_option :type,
290
+ :aliases => ['-t', '--type'],
291
+ :required => false,
292
+ :type => :string,
293
+ :default => 'chef',
294
+ :desc => "Provision type"
295
+
296
+ def generate
297
+ puts "creating project..."
298
+
299
+ puts "opts: #{options}"
300
+ name = options[:name]
301
+ @name = name
302
+
303
+ empty_directory(name)
304
+
305
+ if options[:type] == 'chef'
306
+ source_base_dir = "example-chef"
307
+
308
+ empty_directory("#{name}/servers")
309
+ template "#{source_base_dir}/config.rb.erb", "#{name}/config.rb"
310
+
311
+
312
+ # server
313
+ source_server_dir = "#{source_base_dir}/servers/server1"
314
+ server_dir = "#{name}/servers/#{name}"
315
+
316
+ directory("#{source_base_dir}/servers/server1/.chef", "#{server_dir}/.chef")
317
+
318
+
319
+ # cookbooks
320
+ empty_directory("#{server_dir}/cookbooks")
321
+ empty_directory("#{server_dir}/cookbooks/#{name}")
322
+ empty_directory("#{server_dir}/cookbooks/#{name}/recipes")
323
+ empty_directory("#{server_dir}/cookbooks/#{name}/templates")
324
+
325
+ template "#{source_server_dir}/config.rb.erb", "#{server_dir}/config.rb"
326
+ template "#{source_server_dir}/cookbooks/server1/metadata.rb.erb", "#{server_dir}/cookbooks/#{name}/metadata.rb"
327
+
328
+ directory("#{source_base_dir}/servers/server1/cookbooks/server1/recipes", "#{server_dir}/cookbooks/#{name}/recipes")
329
+ directory("#{source_base_dir}/servers/server1/cookbooks/server1/templates", "#{server_dir}/cookbooks/#{name}/templates")
330
+ copy_file("#{source_base_dir}/servers/server1/cookbooks/server1/README.md", "#{server_dir}/cookbooks/#{name}/README.md")
331
+
332
+
333
+ end
334
+
335
+
336
+
337
+ end
338
+
339
+
340
+ ### helpers
341
+
342
+
343
+
344
+
345
+ end
346
+ end