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 版本
相关推荐
一直会游泳的小猫43 分钟前
homebrew
linux·mac·工具·包管理
Agent产品评测局1 小时前
制造业生产调度自动化落地,完整步骤与避坑指南:2026企业级智能体选型与实战全景
运维·人工智能·ai·chatgpt·自动化
寒秋花开曾相惜1 小时前
(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.1 逻辑门&4.2.2 组合电路和HCL布尔表达式)
linux·网络·数据结构·笔记·学习·fpga开发
狂奔的sherry1 小时前
一次由 mount 引发的 Linux 文件系统“错觉”
linux·运维·服务器
志栋智能1 小时前
超自动化巡检:让合规与审计变得轻松简单
运维·网络·人工智能·自动化
小黑要努力1 小时前
智能音箱遇到的问题(一)
linux·运维·git
好度1 小时前
自动化教程-封装浏览器驱动
运维·自动化
ch3nyuyu2 小时前
静态库和动态库的制作
linux·运维·开发语言
程序员老邢2 小时前
【产品底稿 07】商助慧 Admin 运维模块落地:从 “能跑” 到 “能运维”,3 个页面搞定日常排障
java·运维·经验分享·spring boot·后端
一口Linux2 小时前
Linux C编程 | 从0实现telnet获取程序终端控制权
linux·运维·c语言