During major Chef Client version upgrades, some instructions need to be changed based on the version of the Chef Client. For example, upgrading from version 12 to version 13, the “windows_task” resource requires a different action to make changes to existing scheduled tasks.
To call a Chef resource in your cookbook, you need another resource to call from. If you execute the notifies command by itself you get the error message:
NoMethodError
————-
undefined method `declared_key’ for “….[…]”:String
In this example, we call the “windows_task” resource to delay the execution of the chef-client by two hours to give enough time for the server configuration to complete. In Chef version 12 we need to set the action to “:change”, in Chef version 13, it needs to be “:create”.
if ( Chef::VERSION.to_f >= 13.0 )
puts "Version 13.0 or higher"
ruby_block "call delay chef-client" do
block do
# Do nothing, "block do" has to be here
end
notifies :create, "windows_task[delay chef-client]", :immediately
end
else
puts "Before version 13.0"
ruby_block "call delay chef-client" do
block do
# Do nothing, "block do" has to be here
end
notifies :change, "windows_task[delay chef-client]", :immediately
end
end
future_time = Time.now.utc + 7200 # Offset is in seconds: 2 hour delay
new_start_day = future_time.strftime('%m/%d/%Y')
new_start_time = future_time.strftime('%H:%M')
windows_task 'delay chef-client' do
task_name 'chef-client'
start_day new_start_day
start_time new_start_time
action :nothing
guard_interpreter :powershell_script
only_if "(Get-ScheduledTask | Where-Object {$_.TaskName -eq 'chef-client'}).TaskName.Length -gt 0"
end