lambom 0.4.3 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 18348d90022514710524de670d3a08e14a50c34d
4
+ data.tar.gz: 1b06f188691179fd7fafa04aa636d451c7282e02
5
+ SHA512:
6
+ metadata.gz: 058f35736be038c22002cb8f74f11d15db05accdf9380a6381ea7782b0d3c038962cb777fa298d76c25752c6faff655389ef644acaff87f9f24b11ea87be052a
7
+ data.tar.gz: ea449373e8f86512ff94165d710fb999715da0a7b030c6d7ffc85a09c5eef1b55a82bec85411c8bc1153788ec51827b58ef9d4fead4a178b220f687d82ec29d0
data/bin/lambom CHANGED
@@ -24,10 +24,10 @@ OptionParser.new do |opts|
24
24
  options[:json_file] = j
25
25
  end
26
26
 
27
- opts.on("-b", "--berksfile [BERKSFILE FILE]",
28
- "Use specified berksfile to download cookbooks and dependencies") do |j|
29
- options[:berksfile] = b
30
- end
27
+ # opts.on("-b", "--berksfile [BERKSFILE FILE]",
28
+ # "Use specified berksfile to download cookbooks and dependencies") do |j|
29
+ # options[:berksfile] = b
30
+ # end
31
31
 
32
32
  opts.on("-c", "--cached",
33
33
  "Use local cached cookbooks") do
@@ -74,10 +74,21 @@ end.parse!
74
74
 
75
75
  out = ''
76
76
  begin
77
+
77
78
  out = Lambom.run(options)
78
- rescue Exception => e
79
+
80
+ rescue StandardError => e
81
+
79
82
  puts "Error: #{e.message}"
80
83
  exit 1
84
+
85
+ rescue SystemExit => s
86
+
87
+ unless s.success?
88
+ puts "Error executing convergence: #{out}"
89
+ exit s.status
90
+ end
91
+
81
92
  end
82
93
 
83
94
  puts "Command executed successfully"
data/lambom.gemspec CHANGED
@@ -21,11 +21,13 @@ EOF
21
21
  s.files = `git ls-files`.split($/)
22
22
  s.license = 'Apache-2.0'
23
23
 
24
- s.add_runtime_dependency "oj","~> 2.5.4"
25
- s.add_runtime_dependency "mixlib-authentication","~> 1.3.0"
26
- s.add_runtime_dependency "mixlib-shellout","~> 1.3.0"
27
- s.add_runtime_dependency "chef","~> 11.8.2"
28
- s.add_runtime_dependency "berkshelf","~> 2.0.12"
24
+ s.add_runtime_dependency "oj","~> 2.5"
25
+ #s.add_runtime_dependency "mixlib-authentication","~> 1.3"
26
+ #s.add_runtime_dependency "mixlib-shellout","~> 1.3"
27
+ #s.add_runtime_dependency "chef","~> 11.8"
28
+ s.add_runtime_dependency "chef", "~> 12.0.3"
29
+
30
+ # s.add_runtime_dependency "berkshelf","~> 2.0.12"
29
31
 
30
32
  s.add_development_dependency "rspec", "~> 2.0"
31
33
 
data/lib/lambom.rb CHANGED
@@ -22,11 +22,8 @@ module Lambom
22
22
  raise 'Must be run as root' unless Process.uid == 0
23
23
 
24
24
  #cargar config
25
- conf = Lambom::Config.new.load
25
+ conf = Lambom::Config.new.load(argv)
26
26
 
27
- # sobreescribimos a configuracion ca linea de comandos
28
- conf.merge(argv)
29
-
30
27
  # executar converxencia
31
28
  Lambom::Converger.new(conf).run
32
29
  end
data/lib/lambom/config.rb CHANGED
@@ -1,105 +1,121 @@
1
1
  require 'yaml'
2
2
 
3
3
  module Lambom
4
- class Config
5
- CONFIG_DIR = "/etc/riyic"
6
- FILE = "#{CONFIG_DIR}/lambom.conf"
7
- UNIX_PATH_REGEX = /^[\w\s.\/\-_+%]+$/i
8
- URL_REGEX = /^(http(s)?|ftp):\/\/(([A-Za-z0-9-]+\.)*([A-Za-z0-9-]+\.[A-Za-z0-9]+))+((\/?)(([A-Za-z0-9\._\-]+)(\/){0,1}[A-Za-z0-9.-\/]*)){0,1}/
9
-
10
- attr_accessor :server,
11
- :private_key_file,
12
- :environment,
13
- :loglevel,
14
- :json_file,
15
- :berksfile,
16
- :cached,
17
- :download_tarball,
18
- :api_url
19
-
20
- attr_reader :logdir, :logfile
21
-
22
- def initialize
23
- @server = nil
24
- @private_key_file = nil
25
- @json_file = nil
26
- @berksfile = nil
27
- @cached = false
28
- @environment = 'production'
29
- @loglevel = 'debug'
30
- @logdir = '/var/log/riyic'
31
- @logfile = "solo_#{Time.now.strftime("%F_%T")}"
32
- @download_tarball = nil
33
- @api_url = nil
34
- end
35
4
 
36
- def load
37
- # evitamos cascar si o ficheiro de configuracion non existe
38
- return self unless File.exists?(FILE)
39
-
40
- h = {}
41
- begin
42
- h = YAML.load(IO::read(FILE))
43
- rescue Exception => e
44
- e.to_s =~ /line (\d+) column/
45
- raise "Error loading yaml config file #{FILE}, syntax error in line #{$1}"
46
- end
47
-
48
- puts "hash de opcions: #{h.inspect}" if $debug
49
-
50
- # evitamos cargar as opcions si non e un hash
51
- if h.class == Hash
52
- h.each do |k,v|
53
- if validate(k,v)
54
- instance_variable_set "@#{k}".to_sym, v
55
- else
56
- raise "Invalid value '#{v}' to parameter '#{k}'"
57
- end
58
- end
59
- end
5
+ class Config
6
+
7
+ CONFIG_DIR = "/etc/riyic"
8
+ FILE = "#{CONFIG_DIR}/lambom.conf"
9
+ UNIX_PATH_REGEX = /^[\w\s.\/\-_+%]+$/i
10
+ URL_REGEX = /^(http(s)?|ftp):\/\/(([A-Za-z0-9-]+\.)*([A-Za-z0-9-]+\.[A-Za-z0-9]+))+((\/?)(([A-Za-z0-9\._\-]+)(\/){0,1}[A-Za-z0-9.-\/]*)){0,1}/
11
+
12
+ attr_accessor(
13
+ :server,
14
+ :private_key_file,
15
+ :environment,
16
+ :loglevel,
17
+ :json_file,
18
+ :berksfile,
19
+ :cached,
20
+ :download_tarball,
21
+ :api_url
22
+ )
60
23
 
61
- self
24
+ attr_reader :logdir, :logfile
62
25
 
63
- end
26
+
27
+ def initialize
28
+ @server = nil
29
+ @private_key_file = nil
30
+ @json_file = nil
31
+ @berksfile = nil
32
+ @cached = false
33
+ @environment = 'production'
34
+ @loglevel = 'debug'
35
+ @logdir = '/var/log/riyic'
36
+ @logfile = "solo_#{Time.now.strftime("%Y%m%d%H%M%S")}"
37
+ @download_tarball = nil
38
+ @api_url = nil
39
+ end
64
40
 
65
- def merge(options)
66
- options.each do |k,v|
67
- puts "mergeando #{k} con valor #{v} en config" if $debug
68
- self.send("#{k}=",v) if validate(k,v)
69
- #instance_variable_set "@#{k}".to_sym, v if validate(k,v)
70
- end
41
+
42
+ def load(argv={})
43
+
44
+ h = {}
45
+
46
+ # evitamos cascar si o ficheiro de configuracion non existe
47
+ if File.exists?(FILE)
48
+
49
+ begin
50
+ h = YAML.load(IO::read(FILE))
51
+ rescue Exception => e
52
+ e.to_s =~ /line (\d+) column/
53
+ raise "Error loading yaml config file #{FILE}, syntax error in line #{$1}"
71
54
  end
72
55
 
73
- def validate(parametro,valor)
74
-
75
- case parametro.to_sym
76
- when :server
77
- # uuid
78
- valor =~ /^[\d\w\-]{36}$/
79
- when :private_key_file
80
- #unix path
81
- valor =~ UNIX_PATH_REGEX && File.exists?(valor)
82
- when :environment
83
- #env de rails
84
- ["production","development","test"].include?(valor)
85
- when :loglevel
86
- #loglevel de chef
87
- %w{debug info}.include?(valor)
88
- when :berksfile
89
- valor =~ UNIX_PATH_REGEX && File.exists?(valor)
90
- when :json_file
91
- valor =~ UNIX_PATH_REGEX && File.exists?(valor)
92
- when :cached
93
- [true,false].include?(valor)
94
- when :api_url
95
- valor =~ URL_REGEX
96
- when :download_tarball
97
- valor =~ URL_REGEX
98
- else
99
- false
100
- #raise "Invalid parameter #{parametro}"
101
- end
56
+ puts "hash de opcions: #{h.inspect}" if $debug
57
+
58
+ raise "Error in config file, YAML loaded is not a hash" unless h.class == Hash
102
59
 
60
+ # convert keys from string to symbols
61
+ h = h.each_with_object({}) {|(k,v),o| o[k.to_sym] = v}
62
+
63
+ end
64
+
65
+ # merge line command hash with config file loaded
66
+ h.merge!(argv)
67
+
68
+ # validate parametros
69
+ h.each do |k,v|
70
+ if validate(k,v)
71
+ instance_variable_set "@#{k}".to_sym, v
72
+ else
73
+ raise "Invalid value '#{v}' to parameter '#{k}'"
103
74
  end
75
+ end
76
+
77
+ return self
78
+
79
+ end
80
+
81
+ def merge(options={})
82
+ options.each do |k,v|
83
+ puts "mergeando #{k} con valor #{v} en config" if $debug
84
+ self.send("#{k}=",v) if validate(k,v)
85
+ end
86
+ end
87
+
88
+
89
+ def validate(parametro,valor)
90
+
91
+ case parametro.to_sym
92
+ when :server
93
+ # uuid
94
+ valor =~ /^[\d\w\-]{36}$/
95
+ when :private_key_file
96
+ #unix path
97
+ valor =~ UNIX_PATH_REGEX && File.exists?(valor)
98
+ when :environment
99
+ #env de rails
100
+ ["production","development","test"].include?(valor)
101
+ when :loglevel
102
+ #loglevel de chef
103
+ %w{debug info}.include?(valor)
104
+ when :berksfile
105
+ valor =~ UNIX_PATH_REGEX && File.exists?(valor)
106
+ when :json_file
107
+ valor =~ UNIX_PATH_REGEX && File.exists?(valor)
108
+ when :cached
109
+ [true,false].include?(valor)
110
+ when :api_url
111
+ valor =~ URL_REGEX
112
+ when :download_tarball
113
+ valor =~ URL_REGEX
114
+ else
115
+ false
116
+ #raise "Invalid parameter #{parametro}"
117
+ end
118
+
104
119
  end
120
+ end
105
121
  end
@@ -1,4 +1,5 @@
1
1
  #require "berkshelf/cli"
2
+ require 'chef/application/solo'
2
3
  module Lambom
3
4
  class Converger
4
5
  include ShellMixin
@@ -22,7 +23,7 @@ module Lambom
22
23
  CHEF_CONF_FILE = "#{Lambom::Config::CONFIG_DIR}/solo.rb"
23
24
 
24
25
  CHEF_CONF_DEV = <<EOF
25
- cookbook_path ["/mnt/opscode/cookbooks", "/mnt/others/cookbooks", "/mnt/riyic/cookbooks"]
26
+ cookbook_path ["/mnt/cookbooks/supermarket", "/mnt/others/cookbooks", "/mnt/riyic/cookbooks"]
26
27
  file_cache_path "#{CACHE_PATH}"
27
28
  EOF
28
29
 
@@ -72,45 +73,64 @@ EOF
72
73
  end
73
74
 
74
75
  def descargar_cookbooks
76
+
75
77
  if conf.download_tarball
78
+
76
79
  # download cookbooks from a tarball
77
80
  temp = "/tmp/cookbooks.tar.gz"
78
81
  run_cmd('curl','-o',temp, '-L',conf.download_tarball)
79
82
  FileUtils.mkdir_p(DEFAULT_CHEF_PATH) unless File.directory?(DEFAULT_CHEF_PATH)
80
83
  run_cmd('tar','xzf',temp,'--no-same-owner','-C', DEFAULT_CHEF_PATH)
81
84
  File.unlink(temp)
82
- else
83
- # use berkshelf to download cookbooks
84
- # Download berksfile from riyic unless it was passed by command line
85
- descargar_berksfile unless @berksfile
86
- berks_install
85
+
87
86
  end
87
+
88
+ # else
89
+ # # use berkshelf to download cookbooks
90
+ # # Download berksfile from riyic unless it was passed by command line
91
+ # descargar_berksfile unless @berksfile
92
+ # berks_install
93
+ # end
88
94
  end
89
95
 
90
- def descargar_berksfile
91
- @berksfile = "#{CACHE_PATH}/#{@name}.berksfile"
92
- berksfile_str = Lambom::ApiClient.new(conf).get_berksfile
96
+ # def descargar_berksfile
97
+ # @berksfile = "#{CACHE_PATH}/#{@name}.berksfile"
98
+ # berksfile_str = Lambom::ApiClient.new(conf).get_berksfile
93
99
 
94
- file = File.new(@berksfile,"w")
95
- file.write(berksfile_str)
96
- file.close
97
- end
100
+ # file = File.new(@berksfile,"w")
101
+ # file.write(berksfile_str)
102
+ # file.close
103
+ # end
98
104
 
99
105
 
100
- def berks_install
101
- cmd = %W{
102
- berks install -b #{@berksfile} -p #{DEFAULT_CHEF_PATH}/cookbooks
103
- }
106
+ # def berks_install
107
+ # cmd = %W{
108
+ # berks install -b #{@berksfile} -p #{DEFAULT_CHEF_PATH}/cookbooks
109
+ # }
104
110
 
105
- run_cmd *cmd
111
+ # run_cmd *cmd
106
112
 
107
- end
113
+ # end
108
114
 
109
115
 
110
116
  def ejecutar_converger
111
117
 
118
+ #cmd = %W{
119
+ # chef-solo
120
+ # -c #{CHEF_CONF_FILE}
121
+ # --log_level #{conf.loglevel}
122
+ # -j #{@json_file}
123
+ #}
124
+ #
125
+ #unless $debug
126
+ # cmd += [
127
+ # "--logfile",
128
+ # "#{conf.logdir}/#{conf.logfile}"
129
+ # ]
130
+ #end
131
+ #run_cmd *cmd
132
+
112
133
  cmd = %W{
113
- chef-solo
114
134
  -c #{CHEF_CONF_FILE}
115
135
  --log_level #{conf.loglevel}
116
136
  -j #{@json_file}
@@ -122,11 +142,17 @@ EOF
122
142
  "#{conf.logdir}/#{conf.logfile}"
123
143
  ]
124
144
  end
125
-
126
- run_cmd *cmd
127
145
 
146
+ # reseteamos argv
147
+ ARGV.clear
148
+ cmd.each do |arg|
149
+ ARGV << arg
150
+ end
151
+
152
+ Chef::Application::Solo.new.run
128
153
  end
129
154
 
155
+
130
156
  def preparar_entorno
131
157
  # dont drop ruby vars from env
132
158
  #ENV_VARS_DELETE.each {|v| ENV.delete(v)}
@@ -1,3 +1,3 @@
1
1
  module Lambom
2
- VERSION = "0.4.3"
2
+ VERSION = "0.4.7"
3
3
  end
@@ -2,27 +2,27 @@ require "lambom"
2
2
  require "lambom/api"
3
3
 
4
4
  describe Lambom::ApiClient do
5
- conf = Lambom::Config.new.load
6
-
7
- conf.merge(environment: "production",
8
- server: "4586273f-f17a-4984-99ef-69c255e1b395",
9
- private_key_file: "spec/private_key.pem",
10
- api_url: "http://172.17.42.1:3000/api/v1")
5
+ conf = Lambom::Config.new.load(
6
+ environment: "production",
7
+ server: "4586273f-f17a-4984-99ef-69c255e1b395",
8
+ private_key_file: "spec/private_key.pem",
9
+ api_url: "http://172.17.42.1:3000/api/v1"
10
+ )
11
11
 
12
- api = Lambom::ApiClient.new(conf)
12
+ api = Lambom::ApiClient.new(conf)
13
13
 
14
- it "must be an ApiClient object" do
15
- expect(api).to be_an_instance_of(Lambom::ApiClient)
16
- end
14
+ it "must be an ApiClient object" do
15
+ expect(api).to be_an_instance_of(Lambom::ApiClient)
16
+ end
17
17
 
18
- describe "getAttributes" do
19
- it "must connect to riyic api" do
20
- expect(api.get_server_config).to match(/^\{.+\}$/)
21
- end
22
- it "must fail to connect to api" do
23
- conf.merge(server: "61a75d44-9856-4e64-a269-111111111111")
24
- api2 = Lambom::ApiClient.new(conf)
25
- expect{api2.get_server_config}.to raise_error(/api error/)
26
- end
18
+ describe "getAttributes" do
19
+ it "must connect to riyic api" do
20
+ expect(api.get_server_config).to match(/^\{.+\}$/)
21
+ end
22
+ it "must fail to connect to api" do
23
+ conf.merge(server: "61a75d44-9856-4e64-a269-111111111111")
24
+ api2 = Lambom::ApiClient.new(conf)
25
+ expect{api2.get_server_config}.to raise_error(/api error/)
27
26
  end
27
+ end
28
28
  end
@@ -4,12 +4,15 @@ require "lambom/converger"
4
4
  describe Lambom::Converger do
5
5
  conf = Lambom::Config.new
6
6
 
7
- conf.merge(:environment => "production",
8
- :server => "4586273f-f17a-4984-99ef-69c255e1b395",
9
- :private_key_file => "spec/private_key.pem",
10
- :loglevel => 'info',
11
- :json_file => 'spec/test_json_file',
12
- :api_url => 'http://172.17.42.1:3000/api/v1' )
7
+ conf.merge(
8
+ :environment => "production",
9
+ :server => "4586273f-f17a-4984-99ef-69c255e1b395",
10
+ :private_key_file => "spec/private_key.pem",
11
+ :loglevel => 'info',
12
+ :json_file => 'spec/test_json_file',
13
+ :api_url => 'http://172.17.42.1:3000/api/v1',
14
+ :download_tarball => 'https://s3-eu-west-1.amazonaws.com/riyic/cookbooks.tar.gz'
15
+ )
13
16
 
14
17
 
15
18
  it "must run convergence tool" do
data/spec/test_json_file CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "riyic": {
3
- "dockerized": "no",
4
3
  "updates_check_interval": "never",
5
4
  "env": "development"
6
5
  },
7
6
  "run_list": [
8
7
  "recipe[riyic::default]"
9
8
  ]
10
- }
9
+ }
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lambom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
5
- prerelease:
4
+ version: 0.4.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - J. Gomez
@@ -14,100 +13,46 @@ dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: oj
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 2.5.4
19
+ version: '2.5'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 2.5.4
30
- - !ruby/object:Gem::Dependency
31
- name: mixlib-authentication
32
- requirement: !ruby/object:Gem::Requirement
33
- none: false
34
- requirements:
35
- - - ~>
36
- - !ruby/object:Gem::Version
37
- version: 1.3.0
38
- type: :runtime
39
- prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: 1.3.0
46
- - !ruby/object:Gem::Dependency
47
- name: mixlib-shellout
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ~>
52
- - !ruby/object:Gem::Version
53
- version: 1.3.0
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: 1.3.0
26
+ version: '2.5'
62
27
  - !ruby/object:Gem::Dependency
63
28
  name: chef
64
29
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
- requirements:
67
- - - ~>
68
- - !ruby/object:Gem::Version
69
- version: 11.8.2
70
- type: :runtime
71
- prerelease: false
72
- version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
- requirements:
75
- - - ~>
76
- - !ruby/object:Gem::Version
77
- version: 11.8.2
78
- - !ruby/object:Gem::Dependency
79
- name: berkshelf
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
30
  requirements:
83
- - - ~>
31
+ - - "~>"
84
32
  - !ruby/object:Gem::Version
85
- version: 2.0.12
33
+ version: 12.0.3
86
34
  type: :runtime
87
35
  prerelease: false
88
36
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
37
  requirements:
91
- - - ~>
38
+ - - "~>"
92
39
  - !ruby/object:Gem::Version
93
- version: 2.0.12
40
+ version: 12.0.3
94
41
  - !ruby/object:Gem::Dependency
95
42
  name: rspec
96
43
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
44
  requirements:
99
- - - ~>
45
+ - - "~>"
100
46
  - !ruby/object:Gem::Version
101
47
  version: '2.0'
102
48
  type: :development
103
49
  prerelease: false
104
50
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
51
  requirements:
107
- - - ~>
52
+ - - "~>"
108
53
  - !ruby/object:Gem::Version
109
54
  version: '2.0'
110
- description: ! "Riyic is a server configuration service based on chef (http://riyic.com).\nThe
55
+ description: "Riyic is a server configuration service based on chef (http://riyic.com).\nThe
111
56
  lambom gem is a tool to apply chef configurations generated with the riyic service,
112
57
  or defined in a pair of plain text files \n(a json attributes file where the server
113
58
  configuration is detailed and a berkshelf file which specifies cookbooks restrictions
@@ -118,8 +63,8 @@ executables:
118
63
  extensions: []
119
64
  extra_rdoc_files: []
120
65
  files:
121
- - .gitignore
122
- - .rspec
66
+ - ".gitignore"
67
+ - ".rspec"
123
68
  - README.md
124
69
  - bin/lambom
125
70
  - lambom.gemspec
@@ -144,26 +89,25 @@ files:
144
89
  homepage: https://github.com/RIYIC/lambom
145
90
  licenses:
146
91
  - Apache-2.0
92
+ metadata: {}
147
93
  post_install_message:
148
94
  rdoc_options: []
149
95
  require_paths:
150
96
  - lib
151
97
  required_ruby_version: !ruby/object:Gem::Requirement
152
- none: false
153
98
  requirements:
154
- - - ! '>='
99
+ - - ">="
155
100
  - !ruby/object:Gem::Version
156
101
  version: '0'
157
102
  required_rubygems_version: !ruby/object:Gem::Requirement
158
- none: false
159
103
  requirements:
160
- - - ! '>='
104
+ - - ">="
161
105
  - !ruby/object:Gem::Version
162
106
  version: '0'
163
107
  requirements: []
164
108
  rubyforge_project:
165
- rubygems_version: 1.8.24
109
+ rubygems_version: 2.2.2
166
110
  signing_key:
167
- specification_version: 3
111
+ specification_version: 4
168
112
  summary: Tool to configure servers based on chef-solo and berkshelf
169
113
  test_files: []