Hello,
I'm not sure if it's possible (I haven't seen it) to provide Puppet-like logging of changed / error resources in apply blocks without any additional code. Puppet Agent gives great visibility with default logging level about what has changed and what has failed. Unfortunately, the Bolt apply logs nothing except the failure.
Example:
apply($workers) {
exec { '/usr/bin/uptime': }
exec { '/usr/bin/missing': }
file { '/tmp/hey': content => 'hey', }
}
Result:
Starting: apply catalog on 147.251.255.50, 147.251.255.51, 147.251.255.56
Finished: apply catalog with 3 failures in 12.41 sec
Finished: plan profiles::test in 24.21 sec
Resources failed to apply for 147.251.255.50
Exec[/usr/bin/missing]: change from 'notrun' to ['0'] failed: Could not find command '/usr/bin/missing'
Resources failed to apply for 147.251.255.51
Exec[/usr/bin/missing]: change from 'notrun' to ['0'] failed: Could not find command '/usr/bin/missing'
Resources failed to apply for 147.251.255.56
Exec[/usr/bin/missing]: change from 'notrun' to ['0'] failed: Could not find command '/usr/bin/missing'
For the user who is writing the plan, debugging the Puppet modules / classes, running it several times... he doesn't see that uptime is running every time or when the file has changed.
Yes, the workaround is to catch the result of apply call... but you would have to do it for the very apply block.
Example:
$results = apply($workers, _catch_errors => true) {
exec { '/usr/bin/uptime': }
exec { '/usr/bin/missing': }
file { '/tmp/hey': content => 'hey', }
}
$results.each |$result| {
$result.report['logs'].each |$log| {
$_level = $log['level'] ? {
'notice' => 'Notice',
'err' => 'Error',
default => 'Unknown',
}
$_msg = sprintf(
'%s: %s: %s: %s',
$_level,
$log['source'],
$log['message']
)
case $log['level'] {
err: { err($_msg) }
default: { notice($_msg) }
}
}
}
Result:
Starting: apply catalog on 147.251.255.50, 147.251.255.51, 147.251.255.56
Finished: apply catalog with 3 failures in 12.26 sec
147.251.255.50: Notice: /Stage[main]/Main/Exec[/usr/bin/uptime]/returns: executed successfully 147.251.255.50: Error: Puppet: Could not find command '/usr/bin/missing' 147.251.255.50: Error: /Stage[main]/Main/Exec[/usr/bin/missing]/returns: change from 'notrun' to ['0'] failed: Could not find command '/usr/bin/missing' 147.251.255.50: Notice: /Stage[main]/Main/File[/tmp/hey]/content: content changed '{md5}79c2b46ce2594ecbcb5b73e928345492' to '{md5}6057f13c496ecf7fd777ceb9e79ae285' 147.251.255.51: Notice: /Stage[main]/Main/Exec[/usr/bin/uptime]/returns: executed successfully 147.251.255.51: Error: Puppet: Could not find command '/usr/bin/missing' 147.251.255.51: Error: /Stage[main]/Main/Exec[/usr/bin/missing]/returns: change from 'notrun' to ['0'] failed: Could not find command '/usr/bin/missing' 147.251.255.51: Notice: /Stage[main]/Main/File[/tmp/hey]/content: content changed '{md5}79c2b46ce2594ecbcb5b73e928345492' to '{md5}6057f13c496ecf7fd777ceb9e79ae285' 147.251.255.56: Notice: /Stage[main]/Main/Exec[/usr/bin/uptime]/returns: executed successfully 147.251.255.56: Error: Puppet: Could not find command '/usr/bin/missing' 147.251.255.56: Error: /Stage[main]/Main/Exec[/usr/bin/missing]/returns: change from 'notrun' to ['0'] failed: Could not find command '/usr/bin/missing' 147.251.255.56: Notice: /Stage[main]/Main/File[/tmp/hey]/content: content changed '{md5}79c2b46ce2594ecbcb5b73e928345492' to '{md5}6057f13c496ecf7fd777ceb9e79ae285' Finished: plan profiles::test in 24.7 sec
I would love to see the above logging style for apply blocks integrated into the Bolt so that it's not necessary to always catch the results to get reasonable logs. It provides the helpful (I would more say necessary) visibility into what's happening on the targets.
Thanks for any comments.
Best regards,
Vlastimil Holer