我想写一个新脚本,但我绝对是bash脚本中的n00b 例如,我希望该脚本执行kubectl获取cs(检查群集运行状况)和kubectl获取cs的stdout在这里:
administrator@rgv:~$ kubectl get cs
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health": "true"}
scheduler Healthy ok
controller-manager Healthy ok
我如何解析STATUS列?
如果群集中有三个节点且群集正常,我想只打印"cluster healthy."
。如果一个节点是向下打印"cluster is to die."
答案 0 :(得分:0)
您可以使用名为awk
的工具。
kubectl get cs | awk 'NR>1 && $2=="Healthy"{count++}
END{if(count==3){print "All healthy"}
else{
print "Cluster(s) dead"
}
}'
答案 1 :(得分:0)
在您的示例中,STATUS字段的状态为Healthy
。
如果要解析它以找出包含字符串的行,可以使用grep
:
对于您的示例,它将是:kubectl get cs | tr -s ' ' | cut -f2 -d ' ' | grep Healthy
,它会显示第二列中包含healthy
字符串的所有行STATUS
。
要检查群集是否已关闭,您可以使用:kubectl get cs | tr -s ' ' | cut -f2 -d ' ' | grep Down
。
注意:tr -s ' '
挤压空格,然后用管道将其剪切为cut -f2 -d ' '
,这将为您提供整个列。两个单引号之间有空格('')感谢您注意@ilkkachu。
如果要在脚本中使用它,可以使用以下命令创建文件:
vim cluster_check.sh
#!/bin/bash
if kubectl get cs | tr -s ' ' | cut -f2 -d ' ' | grep -q 'Healthy';
then
echo 'cluster healthy!'
else
echo 'cluster is to die!'
fi
然后使用ESC
:wq
退出vim
更改chmod +x cluster_check.sh
的执行标记。
然后你可以通过:./cluster_check.sh
答案 2 :(得分:0)
简单方法:
if kubectl get cs | tail -n +2 | grep -vq Healthy ; then
echo "It's dead, Jim"
else
echo "All is fine in the realm!"
fi
tail -n +2
跳过第一行,grep
查找不包含字符串Healthy
的行。也就是说,即使没有它的一行也会触发警告。
这当然会完全忽略列,所以如果一个死的成员可以在该行的其他地方包含相同的字符串,它将会失败。