2015-12-08 82 views
0

如何列出節點的「節點名稱」,並在過去一小時內成功檢入廚師服務器?在過去一小時內檢入廚師服務器的節點列表

目前我使用下面的命令,但我怎麼完善它,以達到上述標準:

/opt/chef/bin/knife search node 

EDIT1 我也嘗試使用以下命令:

knife exec -E 'node.all.filter{|n| Time.now - n["ohai_time"].to_i <= 3600}.map{|n| puts n.name}' -c /opt/cap1/developer12/developer/knife.rb -VV 

但它是失敗的:

INFO: Using configuration from /opt/cap1/developer12/developer/knife.rb 
/opt/chefdk/embedded/apps/chef/lib/chef/shell/ext.rb:294:in `node': undefined method `session' for Shell:Module (NoMethodError) 
from -E Argument:in `run' 
from /opt/chefdk/embedded/apps/chef/lib/chef/knife/exec.rb:51:in `instance_eval' 
from /opt/chefdk/embedded/apps/chef/lib/chef/knife/exec.rb:51:in `run' 
from /opt/chefdk/embedded/apps/chef/lib/chef/knife.rb:417:in `block in run_with_pretty_exceptions' 
from /opt/chefdk/embedded/apps/chef/lib/chef/local_mode.rb:38:in `with_server_connectivity' 
from /opt/chefdk/embedded/apps/chef/lib/chef/knife.rb:416:in `run_with_pretty_exceptions' 
from /opt/chefdk/embedded/apps/chef/lib/chef/knife.rb:213:in `run' 
from /opt/chefdk/embedded/apps/chef/lib/chef/application/knife.rb:139:in `run' 
from /opt/chefdk/embedded/apps/chef/bin/knife:25:in `<top (required)>' 
from /usr/bin/knife:40:in `load' 
from /usr/bin/knife:40:in `<main>' 

回答

2

您必須搜索所有節點(*:*),然後在您身邊對其進行過濾。你可以很容易地用knife exec來做到這一點。

knife exec -E 'nodes.all.filter{|n| Time.now - n["ohai_time"].to_i <= 3600}.map{|n| puts n.name}' 

或類似的東西。

+0

謝謝,我收到以下錯誤: '信息:使用/opt/cap1/developer12/developer/knife.rb中的配置 /opt/chefdk/embedded/apps/chef/lib/chef/shell/ext .rb:294:在'node'中:未定義的方法'session'用於Shell:Module(NoMethodError) \t from -E參數:在'run'中 \t from/opt/chefdk/embedded/apps/chef/lib/chef /knife/exec.rb:51:in'instance_eval'' –

+0

將它添加到帖子中,我無法在一行上閱讀它。 – coderanger

+0

更新了帖子。 –

1

替代解決方案是使用knife status,它將列出具有上次運行更新時間的節點。

不幸的是,刀狀況有一個選項,所以你要輸出的東西濾波器,用於過濾健康的節點(最後一個小時內簽入),但不過濾不健康的:

knife status | awk -F',' 'BEGIN {cmd="date +\"%s\""; cmd | getline sdate; close(cmd)} {cmd="date -d \""$1"\" +\"%s\"";cmd | getline rdate; close(cmd); if ((sdate - rdate) <= 3600) print $2}' 

awk腳本的相關詳細:

  • BEGIN {cmd="date +\"%s\""; cmd | getline sdate; close(cmd)}店的實際日期sdate可變
  • {cmd="date -d \""$1"\" +\"%s\"";cmd | getline rdate; close(cmd);店運行日期rdate
  • if ((sdate - rdate) <= 3600) print $2}如果在1小時以內不同,打印節點名稱。

說@coderanger答案是最容易適應從節點打印其他信息。

+0

它的工作方式如下:/ opt/chefdk/bin/knife search node「ohai_time:[* TO $(date +%s -d'1 hour ago')]」-i | grep -v grep | grep -v「找到項目」| grep -v'^ \ s * $' –

+0

@IshuGupta你爲什麼在那裏使用'grep -v grep'?除非你希望避免名爲grep的節點。也就是說,你可以添加自己的答案,這也許是更好的解決方案,利用索引索引來過濾搜索。(但是我敢肯定,你可以只用'grep -v'(^ \ s * $ |找到物品)''而不是那3個管道greps。 – Tensibai

+0

你是對的,我正在測試一些東西,它在粘貼的時候仍然在那裏。謝謝 –

相關問題