所以,我们正在从斯拉克过渡到MSTeams。我的任务是更新我们的Sensu配置,以便将警报发送到MSTeams通道,而不是Slack通道。
在/etc/sensu/conf.d/handlers.json中,Slack通知配置如下:
...
"slack" : {
"type": "pipe",
"command": "handler-slack.rb -j slack",
"filters": [
"occurrences"
]
},
....该-j slack告诉处理程序加载位于/etc/sensu/conf.d/slack.d/slack.json的JSON文件。
团队处理程序的配置类似于:
...
"microsoft-teams" : {
"type": "pipe",
"command": "handler-microsoft-teams.rb -j microsoft-teams",
"filters": [
"occurrences"
]
},
...但是,当Sensu试图将通知传递给团队处理程序时,我会得到一个错误,导致我相信JSON配置没有加载:
/opt/sensu/embedded/lib/ruby/gems/2.4.0/gems/sensu-plugins-microsoft-teams-2.0.0/bin/handler-microsoft-teams.rb:104:in `get_setting': undefined method `[]' for nil:NilClass (NoMethodError)
from /opt/sensu/embedded/lib/ruby/gems/2.4.0/gems/sensu-plugins-microsoft-teams-2.0.0/bin/handler-microsoft-teams.rb:28:in `payload_template'
from /opt/sensu/embedded/lib/ruby/gems/2.4.0/gems/sensu-plugins-microsoft-teams-2.0.0/bin/handler-microsoft-teams.rb:108:in `handle'
from /opt/sensu/embedded/lib/ruby/gems/2.4.0/gems/sensu-plugin-2.7.1/lib/sensu-handler.rb:89:in `block in <class:Handler>'payload_template是第一个尝试加载处理程序的设置-Microsoft-Teams.rb。它没有在我的JSON中指定,代码是作为可选的来编写的。
因此,我的问题是: Slack如何从传递给-j参数(slack)的字符串传递到路径/etc/sensu/conf.d/slack.d/slack.json?如何确定团队插件的等效路径魔法?我不知道这种魔力是否是Ruby (我不是专家)、Sensu、感觉插件或其他东西所固有的。我已经挖了很长一段时间了,现在我要空出来了。
(是的,我知道Sensu Go并希望升级;这在我目前的时间表上不是一个选项。)
发布于 2019-09-25 18:32:26
好吧,原来这不是我的问题,但我知道我问的问题的答案:
文件/opt/sensu/embedded/lib/ruby/gems/2.4.0/gems/sensu-plugins-microsoft-teams-2.0.0/bin/handler-microsoft-teams.rb定义了一个函数get_setting,如下所示:
def get_setting(name)
settings[config[:json_config]][name]
endconfig[:json_config]是与-j交换机一起传递的字符串。
转到config:/opt/sensu/embedded/lib/ruby/gems/2.4.0/gems/sensu-plugin-2.7.1/lib/sensu-handler.rb文件需要sensu-plugin/utils,它定义了以下内容:
module Sensu
module Plugin
module Utils # rubocop:disable Metrics/ModuleLength
def config_files
if ENV['SENSU_LOADED_TEMPFILE'] && File.file?(ENV['SENSU_LOADED_TEMPFILE'])
IO.read(ENV['SENSU_LOADED_TEMPFILE']).split(':')
elsif ENV['SENSU_CONFIG_FILES']
ENV['SENSU_CONFIG_FILES'].split(':')
else
['/etc/sensu/config.json'] + Dir['/etc/sensu/conf.d/**/*.json']
end
end
def load_config(filename)
JSON.parse(File.open(filename, 'r').read)
rescue
{}
end
def settings
@settings ||= config_files.map { |f| load_config(f) }.reduce { |a, b| deep_merge(a, b) }
end
...因此,settings将加载/etc/sensu/conf.d/下任何地方嵌套的所有JSON文件,并对它们进行深度合并。除此之外,路径与Sensu使用字符串slack加载它的能力无关;这是JSON有效负载中条目的名称。这种机制对于所有的Sensu配置来说都是通用的,而不仅仅是处理程序插件。文档在这里:https://docs.sensu.io/sensu-core/1.8/reference/configuration/。
我查看了我的日志文件,它似乎确实找到并加载了我乐观地放置在/etc/sensu/conf.d/teams.d/下的文件,但它不起作用。
在找到这里记录的答案之前,我尝试将目录从teams.d重命名为microsoft-teams.d,并将从teams到microsoft-teams定义的配置对象重新命名。我不知道为什么会有任何效果,但现在起作用了。也许我在添加microsoft前缀的过程中无意中解决了一些胖手指或复制的问题。
https://devops.stackexchange.com/questions/9279
复制相似问题