条件判断与循环
运维脚本的核心逻辑无非是:读数据 → 判断状态 → 执行动作。条件分支负责告警分级与异常处理,循环负责批量主机、多端口、多日志行的重复操作。
条件判断
cpu = 88
mem = 72
disk = 91
# 多条件组合
if disk >= 90:
level = "CRITICAL"
elif cpu >= 85 or mem >= 85:
level = "WARNING"
else:
level = "OK"
print(f"告警级别: {level}")
成员测试与空值判断:
role = "web"
allowed_roles = {"web", "api", "worker"}
if role in allowed_roles:
print(f"{role} 节点允许发布")
# 运维常见:空列表/None 表示无数据
failed_hosts = []
if not failed_hosts:
print("全部主机巡检通过")
三元表达式(简单赋值):
status = "up" if cpu < 80 else "degraded"
for 循环
hosts = [
{"name": "web-01", "cpu": 45},
{"name": "web-02", "cpu": 92},
{"name": "db-01", "cpu": 60},
]
alerts = []
for h in hosts:
if h["cpu"] >= 85:
alerts.append(f"{h['name']} CPU={h['cpu']}%")
if alerts:
print("告警列表:")
for msg in alerts:
print(f" - {msg}")
else:
print("无 CPU 告警")
range 用于重试次数:
MAX_RETRY = 3
for attempt in range(1, MAX_RETRY + 1):
print(f"第 {attempt} 次连接尝试...")
# 模拟:第 3 次成功
if attempt == 3:
print("连接成功")
break
else:
# 循环未被 break 打断时执行
print("重试耗尽,连接失败")
while 循环
适合「直到条件满足才停止」的场景,务必避免死循环:
import time
wait_seconds = 0
timeout = 30
interval = 5
while wait_seconds < timeout:
# 模拟:检查服务是否就绪
service_ready = wait_seconds >= 10
if service_ready:
print(f"服务就绪,等待 {wait_seconds}s")
break
print(f"未就绪,{interval}s 后重试...")
time.sleep(interval) # 文档示例;实际脚本可用
wait_seconds += interval
else:
print(f"超时 {timeout}s,部署失败")
实战:端口探测逻辑
def check_ports(host: str, ports: list[int]) -> dict[int, str]:
"""模拟端口检测,返回 port -> 状态。"""
# 假装 80/443 开放,其余关闭
open_ports = {80, 443}
result = {}
for port in ports:
if port in open_ports:
result[port] = "open"
else:
result[port] = "closed"
return result
target = "10.0.1.10"
ports = [22, 80, 443, 8080]
status_map = check_ports(target, ports)
for port, state in status_map.items():
action = "记录" if state == "open" else "防火墙排查"
print(f"{target}:{port} {state} -> {action}")
控制流速查
| 语句 | 用途 |
|---|---|
if / elif / else | 告警分级、环境分支 |
for ... in ... | 批量主机、遍历日志行 |
while | 等待就绪、轮询状态 |
break | 重试成功则退出 |
continue | 跳过单台失败主机,继续下一台 |
小结
- 复杂条件拆成有意义的变量(如
level),避免嵌套过深 - 批量操作优先
for,轮询用while并设超时 for/else可表达「全部重试失败」的语义
下一章学习 函数,把巡检、告警、重试封装成可复用模块。