chef-provisioning 0.18 → 0.19
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/CHANGELOG.md +17 -0
- data/README.md +3 -1
- data/lib/chef/provider/load_balancer.rb +1 -1
- data/lib/chef/provider/machine.rb +5 -4
- data/lib/chef/provider/machine_batch.rb +0 -3
- data/lib/chef/provisioning/chef_load_balancer_spec.rb +1 -1
- data/lib/chef/provisioning/convergence_strategy/install_msi.rb +1 -1
- data/lib/chef/provisioning/convergence_strategy/install_sh.rb +16 -3
- data/lib/chef/provisioning/convergence_strategy/no_converge.rb +0 -4
- data/lib/chef/provisioning/convergence_strategy/precreate_chef_objects.rb +45 -26
- data/lib/chef/provisioning/machine/unix_machine.rb +1 -1
- data/lib/chef/provisioning/version.rb +1 -1
- data/lib/chef/resource/machine.rb +3 -0
- 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: 35d07c9ee156834b006ec670fa2ad4f9fdaa467d
|
4
|
+
data.tar.gz: 746b88dd6944cdf449513dee69ef5c8bbfdb91a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf65fd08788dcb554a21f2cf75d7284bbe4e030abb2ea96d13b108e2f9be7a5f88927d2eafcc430746c5092888438eb2e4dfea32f2767242e99c1462c7744bac
|
7
|
+
data.tar.gz: aa704ae71a32b3fd590d16e848a62d01d048c10570f5b60780da65da590aa54901fa5464572d3784f7451646e5901758b99eff47db14d7de59e479b3cef16fe3
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# Chef Provisioning Changelog
|
2
2
|
|
3
|
+
## 0.19 (2/25/2015)
|
4
|
+
|
5
|
+
- Support for different versions of Chef with the :chef_version and :prerelease arguments (`machine_options convergence_options: { chef_version: '12.0.1' }` or `prerelease: true`)
|
6
|
+
- Support HTTPS proxy (@causton1)
|
7
|
+
- Automatically configure HTTPS proxy when specifying `machine_options convergence_options: { http_proxy: '...' }`
|
8
|
+
- Support for arbitrary configuration using `machine_options convergence_options: { chef_config: "anything you want dumped in /etc/chef/client.rb (will be appended to the standard options already placed in the file)" }`
|
9
|
+
|
10
|
+
- Make load_balancer :destroy work (@lynchc)
|
11
|
+
- Default to SSL for Chef install download (@xeon22)
|
12
|
+
- Fix Chef overwriting attributes on first converge in `machine_batch` (#209)
|
13
|
+
- Fix node permissions on Hosted / Enterprise Chef: no more adding your clients to the `admins` group (ewww). (#59)
|
14
|
+
- Always pass an array (never nil) to the driver, even when there are no machines to add to it (partial fix for chef/chef-provisioning-aws#81)
|
15
|
+
-
|
16
|
+
|
17
|
+
|
18
|
+
915eac3 (origin/jk/install-sh-version, jk/install-sh-version) Add chef_version, prerelease and install_sh_arguments to InstallSh
|
19
|
+
|
3
20
|
## 0.18 (1/27/2015)
|
4
21
|
|
5
22
|
- Allow `ssl_verify_mode` to be overridden (@mivok)
|
data/README.md
CHANGED
@@ -86,9 +86,10 @@ Chef Provisioning has two major abstractions: the machine resource, and drivers.
|
|
86
86
|
|
87
87
|
You declare what your machines do (recipes, tags, etc.) with the `machine` resource, the fundamental unit of Chef Provisioning. You will typically declare `machine` resources in a separate, OS/provisioning-independent file that declares the *topology* of your app--your machines and the recipes that will run on them.
|
88
88
|
|
89
|
-
The machine resources from the example
|
89
|
+
The machine resources from the [cluster.rb example](https://github.com/chef/chef-provisioning/blob/master/docs/examples/cluster.rb) are pretty straightforward. Here's a copy/paste:
|
90
90
|
|
91
91
|
```ruby
|
92
|
+
# Database!
|
92
93
|
machine 'mario' do
|
93
94
|
recipe 'postgresql'
|
94
95
|
recipe 'mydb'
|
@@ -97,6 +98,7 @@ end
|
|
97
98
|
|
98
99
|
num_webservers = 1
|
99
100
|
|
101
|
+
# Web servers!
|
100
102
|
1.upto(num_webservers) do |i|
|
101
103
|
machine "luigi#{i}" do
|
102
104
|
recipe 'apache'
|
@@ -25,7 +25,7 @@ class Chef
|
|
25
25
|
Chef::Provisioning::ChefLoadBalancerSpec.empty(new_resource.name)
|
26
26
|
|
27
27
|
Chef::Log.debug "Creating load balancer: #{new_resource.name}; loaded #{lb_spec.inspect}"
|
28
|
-
machine_specs = new_resource.machines ? new_resource.machines.map { |machine| get_machine_spec(machine) } :
|
28
|
+
machine_specs = new_resource.machines ? new_resource.machines.map { |machine| get_machine_spec(machine) } : []
|
29
29
|
|
30
30
|
new_driver.allocate_load_balancer(action_handler, lb_spec, lb_options, machine_specs)
|
31
31
|
lb_spec.save(action_handler)
|
@@ -19,12 +19,12 @@ class Machine < Chef::Provider::LWRPBase
|
|
19
19
|
end
|
20
20
|
|
21
21
|
action :allocate do
|
22
|
-
if current_driver && current_driver.driver_url != new_driver.driver_url
|
23
|
-
raise "Cannot move '#{machine_spec.name}' from #{current_driver.driver_url} to #{new_driver.driver_url}: machine moving is not supported. Destroy and recreate."
|
24
|
-
end
|
25
22
|
if !new_driver
|
26
23
|
raise "Driver not specified for machine #{machine_spec.name}"
|
27
24
|
end
|
25
|
+
if current_driver && current_driver.driver_url != new_driver.driver_url
|
26
|
+
raise "Cannot move '#{machine_spec.name}' from #{current_driver.driver_url} to #{new_driver.driver_url}: machine moving is not supported. Destroy and recreate."
|
27
|
+
end
|
28
28
|
new_driver.allocate_machine(action_handler, machine_spec, new_machine_options)
|
29
29
|
machine_spec.save(action_handler)
|
30
30
|
end
|
@@ -137,7 +137,8 @@ class Machine < Chef::Provider::LWRPBase
|
|
137
137
|
:private_key_options,
|
138
138
|
:ohai_hints,
|
139
139
|
:public_key_path, :public_key_format,
|
140
|
-
:admin, :validator
|
140
|
+
:admin, :validator,
|
141
|
+
:chef_config
|
141
142
|
].inject({}) do |result, key|
|
142
143
|
result[key] = new_resource.send(key)
|
143
144
|
result
|
@@ -54,15 +54,12 @@ class MachineBatch < Chef::Provider::LWRPBase
|
|
54
54
|
if m[:resource] && m[:resource].converge
|
55
55
|
Chef::Log.info("Converging #{m[:spec].name} because 'converge true' is set ...")
|
56
56
|
m[:machine].converge(m[:action_handler])
|
57
|
-
m[:spec].save(m[:action_handler])
|
58
57
|
elsif (!m[:resource] || m[:resource].converge.nil?) && m[:action_handler].locally_updated
|
59
58
|
Chef::Log.info("Converging #{m[:spec].name} because the resource was updated ...")
|
60
59
|
m[:machine].converge(m[:action_handler])
|
61
|
-
m[:spec].save(m[:action_handler])
|
62
60
|
elsif !m[:spec].node['automatic'] || m[:spec].node['automatic'].size == 0
|
63
61
|
Chef::Log.info("Converging #{m[:spec].name} because it has never been converged (automatic attributes are empty) ...")
|
64
62
|
m[:machine].converge(m[:action_handler])
|
65
|
-
m[:spec].save(m[:action_handler])
|
66
63
|
elsif m[:resource] && m[:resource].converge == false
|
67
64
|
Chef::Log.debug("Not converging #{m[:spec].name} because 'converge false' is set.")
|
68
65
|
end
|
@@ -9,7 +9,7 @@ module Provisioning
|
|
9
9
|
|
10
10
|
def initialize(convergence_options, config)
|
11
11
|
super
|
12
|
-
@install_msi_url = convergence_options[:install_msi_url] || '
|
12
|
+
@install_msi_url = convergence_options[:install_msi_url] || 'https://www.chef.io/chef/install.msi'
|
13
13
|
@install_msi_path = convergence_options[:install_msi_path] || "$env:TEMP\\#{File.basename(@install_msi_url)}"
|
14
14
|
@chef_client_timeout = convergence_options.has_key?(:chef_client_timeout) ? convergence_options[:chef_client_timeout] : 120*60 # Default: 2 hours
|
15
15
|
end
|
@@ -13,16 +13,29 @@ module Provisioning
|
|
13
13
|
:client_pem_path => '/etc/chef/client.pem'
|
14
14
|
})
|
15
15
|
super(convergence_options, config)
|
16
|
-
@install_sh_url = convergence_options[:install_sh_url] || '
|
16
|
+
@install_sh_url = convergence_options[:install_sh_url] || 'https://www.chef.io/chef/install.sh'
|
17
17
|
@install_sh_path = convergence_options[:install_sh_path] || '/tmp/chef-install.sh'
|
18
|
-
@
|
18
|
+
@chef_version = convergence_options[:chef_version]
|
19
|
+
@prerelease = convergence_options[:prerelease]
|
20
|
+
@install_sh_arguments = convergence_options[:install_sh_arguments]
|
21
|
+
@bootstrap_env = convergence_options[:bootstrap_proxy] ? "http_proxy=#{convergence_options[:bootstrap_proxy]} https_proxy=$http_proxy " : ""
|
19
22
|
@chef_client_timeout = convergence_options.has_key?(:chef_client_timeout) ? convergence_options[:chef_client_timeout] : 120*60 # Default: 2 hours
|
20
23
|
end
|
21
24
|
|
25
|
+
attr_reader :chef_version
|
26
|
+
attr_reader :prerelease
|
22
27
|
attr_reader :install_sh_url
|
23
28
|
attr_reader :install_sh_path
|
29
|
+
attr_reader :install_sh_arguments
|
24
30
|
attr_reader :bootstrap_env
|
25
31
|
|
32
|
+
def install_sh_command_line
|
33
|
+
arguments = install_sh_arguments ? " #{install_sh_arguments}" : ""
|
34
|
+
arguments << " -v #{chef_version}" if chef_version
|
35
|
+
arguments << " -p" if prerelease
|
36
|
+
"bash -c '#{bootstrap_env} bash #{install_sh_path}#{arguments}'"
|
37
|
+
end
|
38
|
+
|
26
39
|
def setup_convergence(action_handler, machine)
|
27
40
|
super
|
28
41
|
|
@@ -31,7 +44,7 @@ module Provisioning
|
|
31
44
|
# TODO ssh verification of install.sh before running arbtrary code would be nice?
|
32
45
|
@@install_sh_cache[install_sh_url] ||= Net::HTTP.get(URI(install_sh_url))
|
33
46
|
machine.write_file(action_handler, install_sh_path, @@install_sh_cache[install_sh_url], :ensure_dir => true)
|
34
|
-
machine.execute(action_handler,
|
47
|
+
machine.execute(action_handler, install_sh_command_line)
|
35
48
|
end
|
36
49
|
end
|
37
50
|
|
@@ -6,10 +6,6 @@ class Chef
|
|
6
6
|
module Provisioning
|
7
7
|
class ConvergenceStrategy
|
8
8
|
class NoConverge < ConvergenceStrategy
|
9
|
-
def initialize(convergence_options, config)
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
9
|
def chef_server
|
14
10
|
@chef_server ||= convergence_options[:chef_server] || Cheffish.default_chef_server(config)
|
15
11
|
end
|
@@ -6,19 +6,15 @@ class Chef
|
|
6
6
|
module Provisioning
|
7
7
|
class ConvergenceStrategy
|
8
8
|
class PrecreateChefObjects < ConvergenceStrategy
|
9
|
-
def initialize(convergence_options, config)
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
9
|
def chef_server
|
14
10
|
@chef_server ||= convergence_options[:chef_server] || Cheffish.default_chef_server(config)
|
15
11
|
end
|
16
12
|
|
17
13
|
def setup_convergence(action_handler, machine)
|
18
14
|
# Create keys on machine
|
19
|
-
public_key = create_keys(action_handler, machine)
|
15
|
+
private_key, public_key = create_keys(action_handler, machine)
|
20
16
|
# Create node and client on chef server
|
21
|
-
create_chef_objects(action_handler, machine, public_key)
|
17
|
+
create_chef_objects(action_handler, machine, private_key, public_key)
|
22
18
|
|
23
19
|
# If the chef server lives on localhost, tunnel the port through to the guest
|
24
20
|
# (we need to know what got tunneled!)
|
@@ -93,7 +89,8 @@ module Provisioning
|
|
93
89
|
machine.write_file(action_handler, convergence_options[:client_pem_path], server_private_key.to_pem, :ensure_dir => true)
|
94
90
|
end
|
95
91
|
|
96
|
-
|
92
|
+
# We shouldn't be returning this: see https://github.com/chef/chef-provisioning/issues/292
|
93
|
+
[ server_private_key, server_private_key.public_key ]
|
97
94
|
end
|
98
95
|
|
99
96
|
def is_localhost(host)
|
@@ -125,7 +122,7 @@ module Provisioning
|
|
125
122
|
end
|
126
123
|
end
|
127
124
|
|
128
|
-
def create_chef_objects(action_handler, machine, public_key)
|
125
|
+
def create_chef_objects(action_handler, machine, private_key, public_key)
|
129
126
|
_convergence_options = convergence_options
|
130
127
|
_chef_server = chef_server
|
131
128
|
# Save the node and create the client keys and client.
|
@@ -150,21 +147,41 @@ module Provisioning
|
|
150
147
|
|
151
148
|
# If using enterprise/hosted chef, fix acls
|
152
149
|
if chef_server[:chef_server_url] =~ /\/+organizations\/.+/
|
153
|
-
grant_client_node_permissions(action_handler, chef_server, machine
|
150
|
+
grant_client_node_permissions(action_handler, chef_server, machine, ["read", "update"], private_key)
|
154
151
|
end
|
155
152
|
end
|
156
153
|
|
157
154
|
# Grant the client permissions to the node
|
158
155
|
# This procedure assumes that the client name and node name are the same
|
159
|
-
def grant_client_node_permissions(action_handler, chef_server,
|
156
|
+
def grant_client_node_permissions(action_handler, chef_server, machine, perms, private_key)
|
157
|
+
node_name = machine.name
|
160
158
|
api = Cheffish.chef_server_api(chef_server)
|
161
159
|
node_perms = api.get("/nodes/#{node_name}/_acl")
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
160
|
+
|
161
|
+
begin
|
162
|
+
perms.each do |p|
|
163
|
+
if !node_perms[p]['actors'].include?(node_name)
|
164
|
+
action_handler.perform_action "Add #{node_name} to client #{p} ACLs" do
|
165
|
+
node_perms[p]['actors'] << node_name
|
166
|
+
api.put("/nodes/#{node_name}/_acl/#{p}", p => node_perms[p])
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
rescue Net::HTTPServerException => e
|
171
|
+
if e.response.code == "400"
|
172
|
+
action_handler.perform_action "Delete #{node_name} and recreate as client #{node_name}" do
|
173
|
+
api.delete("/nodes/#{node_name}")
|
174
|
+
as_user = chef_server.dup
|
175
|
+
as_user[:options] = as_user[:options].merge(
|
176
|
+
client_name: node_name,
|
177
|
+
signing_key_filename: nil,
|
178
|
+
raw_key: private_key.to_pem
|
179
|
+
)
|
180
|
+
as_user_api = Cheffish.chef_server_api(as_user)
|
181
|
+
as_user_api.post("/nodes", machine.node)
|
167
182
|
end
|
183
|
+
else
|
184
|
+
raise
|
168
185
|
end
|
169
186
|
end
|
170
187
|
end
|
@@ -177,18 +194,20 @@ module Provisioning
|
|
177
194
|
:verify_none
|
178
195
|
end
|
179
196
|
|
180
|
-
content =
|
181
|
-
chef_server_url #{chef_server_url.inspect}
|
182
|
-
node_name #{node_name.inspect}
|
183
|
-
client_key #{convergence_options[:client_pem_path].inspect}
|
184
|
-
ssl_verify_mode #{ssl_verify_mode.to_sym.inspect}
|
185
|
-
EOM
|
186
|
-
|
187
|
-
content <<
|
188
|
-
http_proxy #{convergence_options[:bootstrap_proxy].inspect}
|
189
|
-
https_proxy #{convergence_options[:bootstrap_proxy].inspect}
|
190
|
-
EOM
|
197
|
+
content = <<-EOM
|
198
|
+
chef_server_url #{chef_server_url.inspect}
|
199
|
+
node_name #{node_name.inspect}
|
200
|
+
client_key #{convergence_options[:client_pem_path].inspect}
|
201
|
+
ssl_verify_mode #{ssl_verify_mode.to_sym.inspect}
|
202
|
+
EOM
|
203
|
+
if convergence_options[:bootstrap_proxy]
|
204
|
+
content << <<-EOM
|
205
|
+
http_proxy #{convergence_options[:bootstrap_proxy].inspect}
|
206
|
+
https_proxy #{convergence_options[:bootstrap_proxy].inspect}
|
207
|
+
EOM
|
191
208
|
end
|
209
|
+
content.gsub!(/^\s+/, "")
|
210
|
+
content << convergence_options[:chef_config] if convergence_options[:chef_config]
|
192
211
|
content
|
193
212
|
end
|
194
213
|
end
|
@@ -144,7 +144,7 @@ prerelease="false"
|
|
144
144
|
project="chef"
|
145
145
|
|
146
146
|
report_bug() {
|
147
|
-
echo "Please file a bug report at
|
147
|
+
echo "Please file a bug report at https://github.com/chef/chef-provisioning/issues"
|
148
148
|
echo "Project: Chef"
|
149
149
|
echo "Component: Packages"
|
150
150
|
echo "Label: Omnibus"
|
@@ -51,6 +51,9 @@ class Machine < Chef::Resource::LWRPBase
|
|
51
51
|
# e.g. ohai_hint 'ec2' => { 'a' => 'b' } creates file ec2.json with json contents { 'a': 'b' }
|
52
52
|
attribute :ohai_hints, :kind_of => Hash
|
53
53
|
|
54
|
+
# A string containing extra configuration for the machine
|
55
|
+
attribute :chef_config, :kind_of => String
|
56
|
+
|
54
57
|
# Allows you to turn convergence off in the :create action by writing "converge false"
|
55
58
|
# or force it with "true"
|
56
59
|
attribute :converge, :kind_of => [TrueClass, FalseClass]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chef-provisioning
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.19'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Keiser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|