Troubleshooting powershell_script
First - the easy way. Just run chef-client -l debug. In debug logging, you can see the whole script, which might be enough.What makes troubleshooting powershell_script difficult, is the way it works from inside chef. A temporary file is created, and immediately nuked after execution, making it somewhat difficult to see exactly what happened.
After some messing around, I realized a simple trick:
powershell_script 'script_name' do
code <<-EOH
copy $MyInvocation.ScriptName c:/chef_powershell_staging_file.ps1 EOH
end
Passing array node attributes to powershell_script:
Seems that in defining a generic array, ruby inserts square brackets [ ] which actually become part of the string when consumed by powershell_script, and powershell chokes on it.default['test_cookbook']['array'] = 'string1','string2'
default['test_cookbook']['array'] = %w(string1,string2)In both of the above, Powershell will either throw an error or generally not work as expected
Missing type name after '['What actually happens, is during resource declaration phase, the square brackets get escaped (you can see it via chef-shell by creating a simple bash or powershell_script resource)
chef:attributes (12.8.1)> default['test_cookbook']['array'] = 'string1','string2'=> ["string1", "string2"]
for example bash:
chef:recipe >bash 'some-bash' do
chef:recipe > code <<-EOH
chef:recipe"> $Array = #{node['test_cookbook']['array']}
chef:recipe"> EOH
chef:recipe ?> end
=> <bash[Set-VariableArray] .... @code: " $Array = [\"string1\", \"string2\"] \n" ...
using native ruby:
attribute:
default['a']['b'] = %w(a,b,c)
keeping the recipe the same, the resulting code will be:
... @code: " $Array = [\"a,b,c\"] \n" ...
Solution - simple in retrospect - double quotes:
node.default['a'] = "'value1', 'value2', 'value3'"In your recipe, you'll get an actual powershell array:
powershell_script 'script_name' do
code <<-EOH
Out-File -InputObject "#{node['a']}".GetType() c:/out.txt
EOH
end