From 0e26ca4e877570b5ba02370768fcd758c4b03cc8 Mon Sep 17 00:00:00 2001 From: Nat Morris Date: Sun, 4 Dec 2016 17:06:07 +0000 Subject: New hook: awssns - Publish messages to AWS SNS topics --- README.md | 35 ++++++++++++++++++++++++++++++++--- lib/oxidized/hook/awssns.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 lib/oxidized/hook/awssns.rb diff --git a/README.md b/README.md index ea70c47..82c33a5 100644 --- a/README.md +++ b/README.md @@ -307,17 +307,17 @@ this will bind port 8888 to all interfaces then expose port out. (Issue #445) You can also use docker-compose to launch oxidized container: ``` -# docker-compose.yml +# docker-compose.yml # docker-compose file example for oxidized that will start along with docker daemon oxidized: restart: always - image: oxidized/oxidized:latest + image: oxidized/oxidized:latest ports: - 8888:8888/tcp environment: CONFIG_RELOAD_INTERVAL: 600 volumes: - - /etc/oxidized:/root/.config/oxidized + - /etc/oxidized:/root/.config/oxidized ``` create the `/etc/oxidized/router.db` @@ -815,6 +815,35 @@ hooks: password: pass ``` +## Hook type: awssns + +The `awssns` hook publishes messages to AWS SNS topics. This allows you to notify other systems of device configuration changes, for example a config orchestration pipeline. Multiple services can subscribe to the same AWS topic. + +Fields sent in the message: + + * `event`: Event type (e.g. `node_success`) + * `group`: Group name + * `model`: Model name (e.g. `eos`) + * `node`: Device hostname + +Configuration example: + +``` yaml +hooks: + hook_script: + type: awssns + events: [node_fail,node_success,post_store] + region: us-east-1 + topic_arn: arn:aws:sns:us-east-1:1234567:oxidized-test-backup_events +``` + +AWS SNS hook requires the following configuration keys: + + * `region`: AWS Region name + * `topic_arn`: ASN Topic reference + +Your AWS credentials should be stored in `~/.aws/credentials`. + # Ruby API The following objects exist in Oxidized. diff --git a/lib/oxidized/hook/awssns.rb b/lib/oxidized/hook/awssns.rb new file mode 100644 index 0000000..dbc2d47 --- /dev/null +++ b/lib/oxidized/hook/awssns.rb @@ -0,0 +1,27 @@ +require 'aws-sdk' + +class AwsSns < Oxidized::Hook + def validate_cfg! + raise KeyError, 'hook.region is required' unless cfg.has_key?('region') + raise KeyError, 'hook.topic_arn is required' unless cfg.has_key?('topic_arn') + end + + def run_hook(ctx) + sns = Aws::SNS::Resource.new(region: cfg.region) + topic = sns.topic(cfg.topic_arn) + message = { + :event => ctx.event.to_s + } + if ctx.node + message.merge!( + :group => ctx.node.group.to_s, + :model => ctx.node.model.class.name.to_s.downcase, + :node => ctx.node.name.to_s + ) + end + topic.publish({ + message: message.to_json + }) + end + +end -- cgit v1.2.1