10、Ansible 生产级故障排查与运维最佳实践

Ansible 生产级故障排查与运维最佳实践

一、Ansible 生产常见故障类型(高频)

  1. SSH 连接类故障(占 60%)
  2. sudo/权限类故障
  3. 网络、端口、防火墙
  4. Python 环境缺失/版本不兼容
  5. Fact 采集慢、超时、卡死
  6. 文件权限、临时目录权限
  7. 变量、模板、加密 Vault 问题
  8. 并发过高导致被控端负载飙高
  9. 第三方模块/角色漏洞或异常

二、典型故障案例 + 根因 + 解决方案

案例1:大量主机执行时随机 SSH 失败

现象

  • 部分主机报 Failed to connect to the host via ssh
  • 单台测试正常,批量执行就炸

根因

  • forks 并发太高,SSH 连接数突增
  • 被控端 sshd_config 限制:MaxStartupsMaxSessions 被打满

解决

  1. 降低并发:forks = 20 或更小
  2. 调大被控端 sshd:
    1. MaxStartups 100:30:200 MaxSessions 50
  3. 开启 pipelining = true 减少连接数

案例2:执行成功但返回"权限拒绝 / 无法写入临时文件"

现象

  • Timeout (12s) waiting for privilege escalation prompt
  • Failed to create temporary directory

根因

  1. /tmp 权限异常、noexec
  2. become 切换用户失败
  3. 远程用户家目录无权限

解决

  1. ansible.cfg 指定安全临时目录
    1. remote_tmp = /var/tmp/ansible-$USER
  2. 检查 sudo 是否不需要 tty:
    1. Defaults !requiretty
  3. 检查磁盘空间、inode

案例3:新装机器 Ansible 无法执行,报 Python 找不到

现象

  • module_stdout: /usr/bin/python: not found
  • 尤其 CentOS 8 / Ubuntu 20.04+

根因

  • 系统默认只有 python3,没有 /usr/bin/python

解决

  1. Inventory 里指定解释器
    1. ansible_python_interpreter=/usr/bin/python3
  2. 或软链接:
    1. ln -s /usr/bin/python3 /usr/bin/python

案例4:执行极慢,单台几十秒才返回

现象

  • ping 很快,setup 巨慢
  • 首次执行尤其明显

根因

  • Fact 采集(gather_facts)加载大量硬件/网络信息
  • DNS 反向解析失败导致超时

解决

  1. 关闭不必要 Facts
    1. gather_facts: false
  2. 禁用被控端 DNS 反解
    1. UseDNS no
  3. 使用 gathering = smart 缓存 Facts

案例5:Sudo 需要密码,但未配置或配置错误

现象

  • Missing sudo password
  • 交互式执行正常,批量失败

根因

  • 未配置 NOPASSWD
  • Vault 密码错误/未传入
  • become 配置错误

解决

  1. 安全方式:sudo 免密但限制命令
  2. 或在变量中配置 ansible_become_pass(必须 Vault 加密)
  3. 执行时加 --ask-become-pass

案例6:Playbook 在测试环境正常,生产执行一半卡死

现象

  • 执行到 shell/command/yum 等任务卡住
  • 无报错、无退出

根因

  • 命令等待交互式输入(yum 交互、确认、密钥提示)
  • 管道卡死、输出缓冲区满

解决

  1. 模块加 warn: falsecreates/removes 做幂等
  2. yum/dnf 用官方模块,不要 shell 执行
  3. timeout 限制
    1. async: 300 poll: 10

案例7:敏感信息泄露到日志/控制台

现象

  • 密码、密钥打印在屏幕
  • 日志文件包含明文密钥

根因

  • 未使用 no_log: true
  • 未用 Vault 加密
  • 调试模式 -vvv 泄露变量

解决

  1. 敏感任务强制不日志
    1. - name: set password command: echo "{``{ pass }}" no_log: true
  2. 所有密钥使用 Ansible Vault
  3. 生产关闭 -vvv

案例8:并发过高导致被控端 Load 飙高、业务抖动

现象

  • Ansible 一跑,业务机器 CPU/IO 飙升
  • 部分服务超时

根因

  • forks 太大,同时执行复制、解压、yum 等 heavy 任务

解决

  1. 降低 forks
  2. 使用 serial 分批执行
    1. serial: 2
  3. 避开业务高峰,使用 throttle

案例9:Ansible 执行成功,但文件内容不一致/乱码

现象

  • template 渲染后配置异常
  • 中文/特殊字符乱码
  • 换行符异常

根因

  • 编码问题
  • 变量未正确转义
  • Windows 编辑导致 \r\n

解决

  1. 使用 ansible.builtin.template 而非 copy
  2. 文件 UTF-8 编码
  3. 控制节点与被控端 locale 一致

案例10:Vault 加密后无法执行,提示解密失败

现象

  • Decryption failed (no vault secrets would work)
  • 密码正确但依然报错

根因

  • 多个 vault ID 混用
  • 文件被篡改
  • 换行/空格破坏加密文件

解决

  1. 统一使用一个 vault 文件
  2. ansible-vault view 测试
  3. 不要手动编辑加密文件

三、生产级 Ansible 故障排查标准流程

  1. 单主机测试:ansible all -m ping -i hosts
  2. 看详细日志:-vvv
  3. 检查 SSH:手动 ssh user@host
  4. 检查 sudo:sudo -l
  5. 检查 Python:which python3
  6. 检查磁盘、tmp 目录、权限
  7. 检查防火墙、SELinux
  8. 关闭 gather_facts 再试
  9. 降低 forks 再试
  10. 查看系统日志 /var/log/secure、messages

四、生产运维最佳实践(防故障)

  • 一律使用 SSH 密钥,禁止密码
  • 敏感信息 Ansible Vault 加密
  • 远程用户专用,sudo 最小权限
  • pipelining = true
  • 关闭不必要 Facts
  • 分批执行 serial
  • 重要任务 no_log: true
  • 日志独立存放,权限 600
  • 上线前在 staging 验证
  • 定期更新 Ansible 版本
相关推荐
aP8PfmxS22 小时前
Lab3-page tables && MIT6.1810操作系统工程【持续更新】
java·linux·jvm
Jp7gnUWcI2 小时前
.NET Win32磁盘动态卷触发“函数不正确”问题排查
运维·服务器·.net
林姜泽樾2 小时前
linux入门第十八章,IP、主机名、域名解析
linux·服务器·tcp/ip
深念Y2 小时前
从CH341A编程器、SPI Flash到Linux+STM32理解
linux·stm32·flash·bios·固件·编程器·闪存
RisunJan2 小时前
Linux命令-ncftp(增强的的FTP工具)
linux·运维
Shingmc34 小时前
【Linux】线程互斥与同步
linux
Vect__10 小时前
深刻理解进程、线程、程序
linux
w61001046611 小时前
CKAD-2026-Ingress
运维·k8s·ckad
末日汐12 小时前
传输层协议UDP
linux·网络·udp