2017-08-09 54 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 } } ], ...