A cookbook for configures a Chef handler that sends reports and exceptions to Slack. There are two options for use:
- Providing a team name and api_key (Uses the slackr gem)
- Providing a hash containing incoming webhook url(s)
NOTE: If both methods are configured, webhooks will take precedence.
- v1.0.0 of this cookbook requires chef-client 14+, users of older chef clients should pin to previous version ~>0.9.2
This cookbook was originally a fork of dcm-ops/chef-slack_handler by Dan Ryan. We have taken over maintenance of this cookbook and released it to Supermarket.
- An existing Slack incoming webhook(s)
- Create a new Slack webhook (https://slack.com/services/new/incoming-webhook)
- Set the
team
andapi_key
attributes above on the node/environment/etc. - Include this
slack_handler
recipe.
node['chef_client']['handler']['slack']['team']
- Your Slack team name (.slack.com)node['chef_client']['handler']['slack']['api_key']
- The API key of your Slack incoming webhooknode['chef_client']['handler']['slack']['channel']
- The #channel to send the results, should include the hash
node['chef_client']['handler']['slack']['username']
- The username of the Slack message, defaults to the node namenode['chef_client']['handler']['slack']['icon_url']
- The Slack message icon, defaults to nilnode['chef_client']['handler']['slack']['icon_emoji']
- The Slack message icon defined by available:emoji:
, defaults to nilnode['chef_client']['handler']['slack']['timeout']
- Timeout in seconds for the Slack API call, defaults to 15node['chef_client']['handler']['slack']['fail_only']
- Only report when runs fail as opposed to every single occurrence, defaults to falsenode['chef_client']['handler']['slack']['send_start_message']
- Send a message when the run starts, defaults to falsenode['chef_client']['handler']['slack']['message_detail_level']
- The level of detail in the message. Valid options arebasic
,elapsed
andresources
, defaults tobasic
node['chef_client']['handler']['slack']['cookbook_detail_level']
- The level of detail about the cookbook used in the message. Valid options areoff
andall
, defaults tooff
node['chef_client']['handler']['slack']['send_environment']
- Send thenode.chef_environment
, defaults to falsenode['chef_client']['handler']['slack']['send_organization']
- Send theorganization from /etc/chef/client.rb
, defaults to false
NOTE: If both icon_url
and icon_emoji
are set, icon_url
will take precedence.
- Create a new Slack webhook (https://slack.com/services/new/incoming-webhook)
- Set the attributes as specified below
- Include this
slack_handler
recipe.
Push as many webhooks as you wish onto the node config:
# Add `webhook1` URL
node['chef_client']['handler']['slack']['webhooks']['name'].push('webhook1')
node['chef_client']['handler']['slack']['webhooks']['webhook1']['url'] = 'https://hooks.slack.com/1/2/3'
# Add `webhook2` URL
node['chef_client']['handler']['slack']['webhooks']['name'].push('webhook2')
node['chef_client']['handler']['slack']['webhooks']['webhook2']['url'] = 'https://hooks.slack.com/1/2/4'
Global to all webhooks:
# Timeout in seconds for the Slack API call, defaults to 15
node['chef_client']['handler']['slack']['timeout'] = 30
## Customizations for Slack WebHook config
## See https://api.slack.com/incoming-webhooks#customizations_for_custom_integrations
# The username of the Slack message, defaults to Slack WebHook config (i.e. nil)
node['chef_client']['handler']['slack']['username'] = 'Chef Bot'
# Icon URL, defaults to Slack WebHook config (i.e. nil)
node['chef_client']['handler']['slack']['icon_url'] = 'https://avatars1.githubusercontent.com/u/29740'
# Emoji for the Slack call, defaults to Slack WebHook config (i.e. nil)
node['chef_client']['handler']['slack']['icon_emoji'] = ':fork_and_knife:'
# Only report when runs fail as opposed to every single occurrence, defaults to false
node['chef_client']['handler']['slack']['fail_only'] = true
# Only report when resources have messages
node['chef_client']['handler']['slack']['only_if_messages'] = false
# Send a message when the run starts, defaults to false
node['chef_client']['handler']['slack']['send_start_message'] = true
# The level of detail in the message. Valid options are 'basic', 'elapsed' and 'resources', defaults to 'basic'
node['chef_client']['handler']['slack']['message_detail_level'] = 'resources'
# The level of detail about the cookbook used in the message. Valid options are 'off' and 'all', defaults to 'off'
node['chef_client']['handler']['slack']['cookbook_detail_level'] = 'all'
# Send the node.chef_environment, defaults to false
node['chef_client']['handler']['slack']['send_environment'] = true
# Send the organization from /etc/chef/client.rb, defaults to false
node['chef_client']['handler']['slack']['send_organization'] = true
NOTE: If both icon_url
and icon_emoji
are set, icon_url
will take precedence.
Each webhook may also override the fail_only
, message_detail_level
and cookbook_detail_level
global optional attributes:
# Optional attributes for `webhook1`
node['chef_client']['handler']['slack']['webhooks']['webhook1']['fail_only'] = true
node['chef_client']['handler']['slack']['webhooks']['webhook1']['send_start_message'] = true
node['chef_client']['handler']['slack']['webhooks']['webhook1']['message_detail_level'] = 'elapsed'
node['chef_client']['handler']['slack']['webhooks']['webhook1']['cookbook_detail_level'] = 'all'
node['chef_client']['handler']['slack']['webhooks']['webhook1']['send_environment'] = true
node['chef_client']['handler']['slack']['webhooks']['webhook1']['send_organization'] = true
Extending beyond the original, chef-slack_handler
can also publish custom messages from your recipe's resources to chef.
Simply extend any resource and define a message
method on the resource instance, and if the resource runs the message
will be posted to Slack. Usage example:
template '/etc/cron.d/some_job' do
source 'something.erb'
@message = " - *enabled* some cron job on `#{node.name}`"
singleton_class.class_eval { attr_reader 'message' }
end
# Check if updates are needed and update Node attributes
ruby_block 'report on something' do
block do
@data = gather_some_data_or_whatever
def self.message
@data
end
end
end
The Slack message would then contain
" - enabled some cron job on
#{node.name}
"
As well as whatever string gather_some_data_or_whatever
method returned. (Implementation of that method left up to the reader)
The ['chef_client']['handler']['slack']['only_if_messages']
attribute controls if a slack message should only
be sent if any resources have a non-nil value for their message
method, useful to reduce spam.
Borrowed everything from the logstash_handler
cookbook here, who in turn borrowed quite a bit from the graphite_handler
cookbook here.
Forked from Rackspace Hosting's version to add some new features
slack_handler
is provided under the Apache License 2.0. See LICENSE
for details.