在过去一小时内检入厨师服务器的节点列表

时间:2015-12-08 22:39:23

标签: chef

如何列出"节点名称"节点,在过去一小时内成功登录我的厨师服务器?

目前我正在使用以下命令,但如何对其进行优化以满足上述条件:

/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 个答案:

答案 0 :(得分:2)

您必须搜索所有节点(*:*),然后在您旁边过滤它们。您可以非常轻松地使用knife exec执行此操作。

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

或类似的东西。

答案 1 :(得分: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答案最容易适应从节点打印其他信息。