Bash环境下AWS EKS集群kubectl连通性检测脚本异常求解
问题根因
你当前的脚本存在两个核心问题导致表现不符合预期:
- kubectl执行产生的错误信息默认输出到标准错误流(stderr),没有被你拦截,因此会直接打印到控制台,出现你看到的凭证缺失报错
- 单独判断
$?的写法鲁棒性不足,如果后续在kubectl执行和if判断之间新增其他命令,会覆盖$?的值导致判断失效
基础修复方案
直接使用如下修改后的函数即可实现你要的效果:
_validate_kube_connectivity() { echo -n "kubernetes connectivity using kubectl..." # 丢弃所有标准输出、错误输出,仅保留执行退出码 if ! kubectl get ns default > /dev/null 2>&1; then notok "failed (pls activate via AWS creds)" exit 1 fi ok "yes" }
改动说明
> /dev/null 2>&1:将kubectl的正常输出、错误输出全部重定向到空设备丢弃,不会再出现原生的报错信息- 直接在if中判断命令执行结果:不需要单独读取
$?,逻辑更简洁且不易出错 exit 1:明确返回异常退出码,方便上层脚本感知执行状态
可选优化:精准错误提示
如果你需要针对不同错误类型返回不同的提示,可以捕获kubectl的错误输出做判断:
_validate_kube_connectivity() { echo -n "kubernetes connectivity using kubectl..." # 仅保留错误输出到变量,丢弃正常输出 err_msg=$(kubectl get ns default 2>&1 >/dev/null) if [[ $? -ne 0 ]]; then if [[ $err_msg == *"exec: executable aws failed"* ]]; then notok "failed (missing or invalid AWS credentials, please authenticate first)" else notok "failed: ${err_msg}" fi exit 1 fi ok "yes" }
内容的提问来源于stack exchange,提问作者DmitrySemenov
相关产品推荐
相关产品推荐

