2017-08-09 24 views
0

我正在根据特定主机的角色配置Splunk forwarder /opt/splunkforwarder/etc/apps/search/local/inputs.conf文件。我已经定义了监视器,索引和源类型特定的值,这些值明显地被存储为JSON。厨师:使用角色json而不是default.rb模板

大多数示例显示如何使用配方中的模板资源创建文件,其中传递给模板资源的参数作为条目存储在attributes/default.rb文件中。

现在我发现了一个与我试图做的here接近的问题,但它假设属性是散列而不是JSON。

我对使用这种方法的犹豫不仅仅是格式是哈希而不是JSON,而且还有一个事实,即对于我们需要在该主机上运行的每个应用程序,监视器,索引和源类型都有多个条目发送给Splunk索引器。所以template.erg需要遍历JSON并为每个应用程序日志添加新条目。下面是JSON角色的一个小例子。

{ 
    "chef_type": "role", 
    "default_attributes": { 
    "gateway_common_input": { 
     "monitor": "/home/app/logs/common", 
     "index": "gateway_common", 
     "sourcetype": "common" }, 
    "gateway_recv_counter_input": { 
     "monitor": "/home/app/logs/recv_counter", 
     "index": "gateway_recv_counter", 
     "sourcetype": "recv_counter" }, 
    "gateway_send_counter_input": { 
     "monitor": "/home/app/logs/send_counter", 
     "index": "gateway_send_counter", 
     "sourcetype": "send_counter" } 

    }, 
    "description": "Role for Gateway hosts", 
    "env_run_lists": {}, 
    "json_class": "Chef::Role", 
    "name": "rgateway", 
    "override_attributes": {}, 
    "run_list": [ 
    "role[gateway]", 
    "recipe[gateway_dimensions]" 
    ] 
} 

编辑: ,来说明在上述JSON定义了“rgateway”角色有需要被添加到Splunk的转发inputs.conf文件中的三个应用程序日志事项; gateway_common_input,gateway_recv_counter_input和gateway_send_counter_input,每个都有它们自己的“monitor”,“index”和“sourcetype”设置。

的inputs.conf文件将不得不三个条目是这样的:

[monitor:///home/app/logs/common/] 
disabled = false 
index = gateway_common 
sourcetype = common 

[monitor:///home/app/logs/recv_counter/] 
disabled = false 
index = gateway_recv_counter 
sourcetype = recv_counter 

[monitor:///home/app/logs/send_counter] 
disabled = false 
index = gateway_send_counter 
sourcetype = send_counter 

其他角色可以有5条记录或只有一个。

回答

0

通常当从厨师输出JSON时,您将在Ruby代码中构建数据结构,然后在其上调用.to_json以获取字符串。

+0

我不输出JSON,而是在使用模板资源构建文件时读取角色属性。我还没有找到任何使用具有角色属性的模板资源创建文件的明确示例,这些角色属性在Chef服务器上以JSON形式存储。那不幸的是我的问题。 – user3481957

+0

您不直接使用“角色属性”,它们会在Chef运行开始时合并到节点属性中,并像所有其他节点属性一样通过普通的“节点”对象访问它们。 – coderanger

+0

好吧,这仍然留下两个问题: 1.这意味着节点必须先收敛,然后才能读取角色属性。 2。配方必须知道每个角色的所有属性,或者有办法在运行时发现属性(关于迭代OP中提到的JSON的问题)。 – user3481957

0

我找到了我要找的东西here。你是正确的coderanger,因为我不太清楚角色属性的功能。所以我不太明白如何解析我角色JSON中的嵌套属性。答案在于正确配置我的模板ERB。在食谱中,我链接到节点角色属性作为散列传入,然后ERB迭代散列。下面是从食谱模板ERB说明

<% @splunk_monitors.each_with_index do |parameters, index| -%> 
# Begin new monitor stanza 
# 
<% parameters.each_key do |monitor_name| -%> 
[monitor://<%= parameters[monitor_name]['location'] %>] 
disabled = false 
<%= "sourcetype = " + parameters[monitor_name]['sourcetype'] if parameters[monitor_name]['sourcetype'] %> 
<%= "index = " + parameters[monitor_name]['index'] if parameters[monitor_name]['index'] %> 
<%= "whitelist = " + parameters[monitor_name]['whitelist'] if parameters[monitor_name]['whitelist'] %> 
<%= "blacklist = " + parameters[monitor_name]['blacklist'] if parameters[monitor_name]['blacklist'] %> 
<%= "host = " + parameters[monitor_name]['host'] if parameters[monitor_name]['host'] %> 
<%= "crcSalt = <SOURCE>" if parameters[monitor_name]['crcSalt'] %> 

<% end -%> 
<% end -%> 

这可以通过以下方式默认秘方叫:

template "#{node['splunk']['forwarder']['home']}/etc/apps/search/local/inputs.conf" do 
    source "inputs.conf.erb" 
    if node["os"] == "linux" 
     owner "root" 
     group "root" 
     mode "0600" 
    end 
    variables ({ 
     :splunk_monitors => node['splunk']['monitors'], 
     :splunk_scripts => node['splunk']['scripts'] 
    }) 
    notifies :restart, resources(:service => servicename) 
end 

正如你所看到的配方要求以通常的方式的模板资源。然后用一个刀子命令设置“monitors”数组(在我的情况下它已经由角色定义)。

"override_attributes": { "splunk": { "monitors": [ { "thisistheshortlogname": { "location": "/var/log/fileordirectory", "index": "couldomitthis", "sourcetype": "", #optional "whitelist": "", #optional "blacklist": "", #optional "crcSalt": "" #optional } } ], ...