Class: Chef::Client
- Inherits:
-
Object
- Object
- Chef::Client
- Defined in:
- lib/chef/client.rb
Overview
Chef::Client
The main object in a Chef run. Preps a Chef::Node and Chef::RunContext, syncs cookbooks if necessary, and triggers convergence.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#json_attribs ⇒ Object
readonly
– TODO: timh/cw: 5-19-2010: json_attribs should be moved to RunContext?.
-
#node ⇒ Object
Returns the value of attribute node.
-
#ohai ⇒ Object
Returns the value of attribute ohai.
-
#rest ⇒ Object
Returns the value of attribute rest.
-
#run_status ⇒ Object
readonly
Returns the value of attribute run_status.
-
#runner ⇒ Object
Returns the value of attribute runner.
Class Method Summary collapse
-
.clear_notifications ⇒ Object
Clears all notifications for client run status events.
-
.run_completed_successfully_notifications ⇒ Object
The list of notifications to be run when the client run completes successfully.
-
.run_failed_notifications ⇒ Object
The list of notifications to be run when the client run fails.
-
.run_start_notifications ⇒ Object
The list of notifications to be run when the client run starts.
-
.when_run_completes_successfully(¬ification_block) ⇒ Object
Add a notification for the ‘client run success’ event.
-
.when_run_fails(¬ification_block) ⇒ Object
Add a notification for the ‘client run failed’ event.
-
.when_run_starts(¬ification_block) ⇒ Object
Add a notification for the ‘client run started’ event.
Instance Method Summary collapse
-
#build_node ⇒ Object
Builds a new node object for this client.
-
#converge(run_context) ⇒ Object
Converges the node.
-
#initialize(json_attribs = nil) ⇒ Client
constructor
Creates a new Chef::Client.
- #node_name ⇒ Object
-
#register ⇒ Object
Returns rest<Chef::REST>:: returns Chef::REST connection object.
-
#run ⇒ Object
Do a full run for this Chef::Client.
-
#run_completed_successfully ⇒ Object
Callback to fire notifications that the run completed successfully.
-
#run_failed ⇒ Object
Callback to fire notifications that the Chef run failed.
- #run_ohai ⇒ Object
-
#run_started ⇒ Object
Callback to fire notifications that the Chef run is starting.
-
#sync_cookbooks ⇒ Object
Synchronizes all the cookbooks from the chef-server.
Constructor Details
#initialize(json_attribs = nil) ⇒ Client
Creates a new Chef::Client.
122 123 124 125 126 127 128 |
# File 'lib/chef/client.rb', line 122 def initialize(json_attribs=nil) @json_attribs = json_attribs @node = nil @run_status = nil @runner = nil @ohai = Ohai::System.new end |
Instance Attribute Details
#json_attribs ⇒ Object (readonly)
– TODO: timh/cw: 5-19-2010: json_attribs should be moved to RunContext?
117 118 119 |
# File 'lib/chef/client.rb', line 117 def json_attribs @json_attribs end |
#node ⇒ Object
Returns the value of attribute node.
110 111 112 |
# File 'lib/chef/client.rb', line 110 def node @node end |
#ohai ⇒ Object
Returns the value of attribute ohai.
111 112 113 |
# File 'lib/chef/client.rb', line 111 def ohai @ohai end |
#rest ⇒ Object
Returns the value of attribute rest.
112 113 114 |
# File 'lib/chef/client.rb', line 112 def rest @rest end |
#run_status ⇒ Object (readonly)
Returns the value of attribute run_status.
119 120 121 |
# File 'lib/chef/client.rb', line 119 def run_status @run_status end |
#runner ⇒ Object
Returns the value of attribute runner.
113 114 115 |
# File 'lib/chef/client.rb', line 113 def runner @runner end |
Class Method Details
.clear_notifications ⇒ Object
Clears all notifications for client run status events. Primarily for testing purposes.
46 47 48 49 50 |
# File 'lib/chef/client.rb', line 46 def self.clear_notifications @run_start_notifications = nil @run_completed_successfully_notifications = nil @run_failed_notifications = nil end |
.run_completed_successfully_notifications ⇒ Object
The list of notifications to be run when the client run completes successfully.
59 60 61 |
# File 'lib/chef/client.rb', line 59 def self.run_completed_successfully_notifications @run_completed_successfully_notifications ||= [] end |
.run_failed_notifications ⇒ Object
The list of notifications to be run when the client run fails.
64 65 66 |
# File 'lib/chef/client.rb', line 64 def self.run_failed_notifications @run_failed_notifications ||= [] end |
.run_start_notifications ⇒ Object
The list of notifications to be run when the client run starts.
53 54 55 |
# File 'lib/chef/client.rb', line 53 def self.run_start_notifications @run_start_notifications ||= [] end |
.when_run_completes_successfully(¬ification_block) ⇒ Object
Add a notification for the ‘client run success’ event. The notification is provided as a block. The current Chef::RunStatus object will be passed to the notification_block when the event is triggered.
78 79 80 |
# File 'lib/chef/client.rb', line 78 def self.when_run_completes_successfully(¬ification_block) run_completed_successfully_notifications << notification_block end |
.when_run_fails(¬ification_block) ⇒ Object
Add a notification for the ‘client run failed’ event. The notification is provided as a block. The current Chef::RunStatus is passed to the notification_block when the event is triggered.
85 86 87 |
# File 'lib/chef/client.rb', line 85 def self.when_run_fails(¬ification_block) run_failed_notifications << notification_block end |
.when_run_starts(¬ification_block) ⇒ Object
Add a notification for the ‘client run started’ event. The notification is provided as a block. The current Chef::RunStatus object will be passed to the notification_block when the event is triggered.
71 72 73 |
# File 'lib/chef/client.rb', line 71 def self.when_run_starts(¬ification_block) run_start_notifications << notification_block end |
Instance Method Details
#build_node ⇒ Object
Builds a new node object for this client. Starts with querying for the FQDN of the current host (unless it is supplied), then merges in the facts from Ohai.
Returns
- node<Chef::Node>
-
Returns the created node object, also stored in @node
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/chef/client.rb', line 212 def build_node Chef::Log.debug("Building node object for #{@node_name}") if Chef::Config[:solo] @node = Chef::Node.build(node_name) else @node = Chef::Node.find_or_create(node_name) end @node.consume_external_attrs(ohai.data, @json_attribs) @node. @node.save unless Chef::Config[:solo] @node.reset_defaults_and_overrides @run_status = Chef::RunStatus.new(@node) @node end |
#converge(run_context) ⇒ Object
Converges the node.
Returns
- true
-
Always returns true
265 266 267 268 269 270 |
# File 'lib/chef/client.rb', line 265 def converge(run_context) Chef::Log.debug("Converging node #{node_name}") @runner = Chef::Runner.new(run_context) runner.converge true end |
#node_name ⇒ Object
195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/chef/client.rb', line 195 def node_name name = Chef::Config[:node_name] || ohai[:fqdn] || ohai[:hostname] Chef::Config[:node_name] = name unless name msg = "Unable to determine node name: configure node_name or configure the system's hostname and fqdn" raise Chef::Exceptions::CannotDetermineNodeName, msg end name end |
#register ⇒ Object
Returns
- rest<Chef::REST>
-
returns Chef::REST connection object
235 236 237 238 239 240 241 242 243 244 |
# File 'lib/chef/client.rb', line 235 def register if File.exists?(Chef::Config[:client_key]) Chef::Log.debug("Client key #{Chef::Config[:client_key]} is present - skipping registration") else Chef::Log.info("Client key #{Chef::Config[:client_key]} is not present - registering") Chef::REST.new(Chef::Config[:client_url], Chef::Config[:validation_client_name], Chef::Config[:validation_key]).register(node_name, Chef::Config[:client_key]) end # We now have the client key, and should use it from now on. self.rest = Chef::REST.new(Chef::Config[:chef_server_url], node_name, Chef::Config[:client_key]) end |
#run ⇒ Object
Do a full run for this Chef::Client. Calls:
* run_ohai - Collect information about the system
* build_node - Get the last known state, merge with local changes
* register - If not in solo mode, make sure the server knows about this client
* sync_cookbooks - If not in solo mode, populate the local cache with the node's cookbooks
* converge - Bring this system up to date
Returns
- true
-
Always returns true.
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 |
# File 'lib/chef/client.rb', line 140 def run run_context = nil run_ohai register unless Chef::Config[:solo] build_node begin run_status.start_clock Chef::Log.info("Starting Chef Run (Version #{Chef::VERSION})") run_started if Chef::Config[:solo] Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::FileSystemFileVendor.new(manifest) } run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(Chef::CookbookLoader.new)) run_status.run_context = run_context assert_cookbook_path_not_empty(run_context) converge(run_context) else # Sync_cookbooks eagerly loads all files except files and templates. # It returns the cookbook_hash -- the return result from # /nodes/#{nodename}/cookbooks -- which we will use for our # run_context. Chef::Cookbook::FileVendor.on_create { |manifest| Chef::Cookbook::RemoteFileVendor.new(manifest, rest) } cookbook_hash = sync_cookbooks run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new(cookbook_hash)) run_status.run_context = run_context assert_cookbook_path_not_empty(run_context) converge(run_context) Chef::Log.debug("Saving the current state of node #{node_name}") @node.save end run_status.stop_clock Chef::Log.info("Chef Run complete in #{run_status.elapsed_time} seconds") run_completed_successfully true rescue Exception => e run_status.stop_clock run_status.exception = e run_failed Chef::Log.debug("Re-raising exception: #{e.class} - #{e.}\n#{e.backtrace.join("\n ")}") raise ensure run_status = nil end end |
#run_completed_successfully ⇒ Object
Callback to fire notifications that the run completed successfully
97 98 99 100 101 |
# File 'lib/chef/client.rb', line 97 def run_completed_successfully self.class.run_completed_successfully_notifications.each do |notification| notification.call(run_status) end end |
#run_failed ⇒ Object
Callback to fire notifications that the Chef run failed
104 105 106 107 108 |
# File 'lib/chef/client.rb', line 104 def run_failed self.class.run_failed_notifications.each do |notification| notification.call(run_status) end end |
#run_ohai ⇒ Object
191 192 193 |
# File 'lib/chef/client.rb', line 191 def run_ohai ohai.all_plugins end |
#run_started ⇒ Object
Callback to fire notifications that the Chef run is starting
90 91 92 93 94 |
# File 'lib/chef/client.rb', line 90 def run_started self.class.run_start_notifications.each do |notification| notification.call(run_status) end end |
#sync_cookbooks ⇒ Object
Synchronizes all the cookbooks from the chef-server.
Returns
- true
-
Always returns true
250 251 252 253 254 255 256 257 258 259 |
# File 'lib/chef/client.rb', line 250 def sync_cookbooks Chef::Log.debug("Synchronizing cookbooks") cookbook_hash = rest.get_rest("nodes/#{node_name}/cookbooks") Chef::CookbookVersion.sync_cookbooks(cookbook_hash) # register the file cache path in the cookbook path so that CookbookLoader actually picks up the synced cookbooks Chef::Config[:cookbook_path] = File.join(Chef::Config[:file_cache_path], "cookbooks") cookbook_hash end |