Linux自动化运维实战及脚本解析(一)检测特定主机集群是否为活跃状态

179 阅读1分钟

前言

这是Linux自动化运维系列的第一篇文章,主要记录相关运维项目的代码以及脚本内容分析。

温馨提示:早期关注我的朋友应该知道,我目前是在教别人计算机,所以整体文章风格会偏校园,和企业实操会有一定差距。在掘金写文某种程度上说也是在备课。

如何理解自动化运维?

  • 运维:运维可以理解为是通过服务器上执行命令来判断系统是否处于异常状态,并执行相应命令对策去排查和解决问题。
  • 自动化:解放双手,让系统定时、定期、在特定情境下执行预先写好的命令或流程。

因此:

  • 自动化运维:在服务器上写脚本,并设置脚本激活时机。

入门练手项目:检测特定主机集群是否为活跃状态

指定主机集群
ip_list="xx.xx.xx.xx xx.xx.xx.xx xx.xx.xx.xx"

其中xx.xx.xx.xx均为ip地址

遍历ip列表并执行ping操作
for ip in $ip_list
do
    for count in {1..3}
    do
        ping -c1 -w1 $ip &>/dev/null
        if [ $? -eq 0 ];then
            echo "$ip ping is ok."
            break
        else
            echo $$ip ping failed:$count"
            fail_count[$count]=$ip
        fi
    done
 ...
 done

其中:

  • for count in {1..3}表示对单个ip ping 三次

  • ping -c1 -w1参数解析如下:

    • -c(在某些系统中可能是-n)选项用于指定发送的回显请求(ICMP 数据包)的数量。当使用-c1时,表示只发送 1 个 ICMP 回显请求数据包。这在只想快速测试主机是否可达,或者获取一次往返时间(RTT)的情况下很有用。
    • -w选项用于设置超时时间,单位是秒。当使用-w1时,意味着ping命令在发送数据包后,只会等待 1 秒来接收响应。如果在 1 秒内没有收到目标主机的响应,ping命令就会停止并返回结果,并返回提示。这样可以避免ping命令在网络状况不佳或者目标主机无响应的情况下长时间等待,提高测试的效率。

    为什么要写成两层for循环,而不写成ping -c3 -w1?

    因为虽然使用ping -c3 -w1理论上是尝试向目标 IP 地址或主机名发送 3 个 ICMP 回显请求数据包,但实际上该命令可能不会如期望那样工作。

    因为-w1参数是针对整个ping操作的,而不是针对每个数据包。 例如,如果第一个数据包发送后没有在 1 秒内收到响应,ping命令可能会提前结束,而不会发送全部 3 个数据包。这可能会导致测试结果不准确(其是在网络延迟较高或者目标主机响应较慢的情况下)。

  • >/dev/null:表示重定向到空,即丢弃ping命令执行过程中产生的输出信息,其在屏幕上显示

  • $? -eq 0:

    • $?是一个特殊的变量,用于存储上一个命令执行后的退出状态码(也称为返回码)。
    • 通常情况下,退出状态码为 0 表示命令成功执行;非 0 的退出状态码表示命令执行出现了某种错误,不同的非 0 值可能对应不同类型的错误。
    • -eq是一个比较运算符,此处用来比较是否等于0。
    • 因此,对应的if语句的意思是判断ping是否成功执行
通过ping数量确认ip不通

注:该代码同在第一个for循环下

    if [ ${fail_count[*]} -eq 3 ];then
        echo "${fail_count[1]} ping failed"
        unset fail_count[*]
    fi

总结

本文通过一个简单而具体的脚本案例,引入了Linux自动化运维的概念思想,并穿插讲解了Linux Shell的基本用法,希望能让读者们也有所收获!