如何列出"节点名称"节点,在过去一小时内成功登录我的厨师服务器?
目前我正在使用以下命令,但如何对其进行优化以满足上述条件:
/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>'
答案 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答案最容易适应从节点打印其他信息。