Ansible 生产级故障排查与运维最佳实践
一、Ansible 生产常见故障类型(高频)
- SSH 连接类故障(占 60%)
- sudo/权限类故障
- 网络、端口、防火墙
- Python 环境缺失/版本不兼容
- Fact 采集慢、超时、卡死
- 文件权限、临时目录权限
- 变量、模板、加密 Vault 问题
- 并发过高导致被控端负载飙高
- 第三方模块/角色漏洞或异常
二、典型故障案例 + 根因 + 解决方案
案例1:大量主机执行时随机 SSH 失败
现象
- 部分主机报
Failed to connect to the host via ssh - 单台测试正常,批量执行就炸
根因
forks并发太高,SSH 连接数突增- 被控端
sshd_config限制:MaxStartups、MaxSessions被打满
解决
- 降低并发:
forks = 20或更小 - 调大被控端 sshd:
MaxStartups 100:30:200 MaxSessions 50
- 开启
pipelining = true减少连接数
案例2:执行成功但返回"权限拒绝 / 无法写入临时文件"
现象
Timeout (12s) waiting for privilege escalation prompt- 或
Failed to create temporary directory
根因
/tmp权限异常、noexecbecome切换用户失败- 远程用户家目录无权限
解决
- 在
ansible.cfg指定安全临时目录remote_tmp = /var/tmp/ansible-$USER
- 检查 sudo 是否不需要 tty:
Defaults !requiretty
- 检查磁盘空间、inode
案例3:新装机器 Ansible 无法执行,报 Python 找不到
现象
module_stdout: /usr/bin/python: not found- 尤其 CentOS 8 / Ubuntu 20.04+
根因
- 系统默认只有
python3,没有/usr/bin/python
解决
- Inventory 里指定解释器
ansible_python_interpreter=/usr/bin/python3
- 或软链接:
ln -s /usr/bin/python3 /usr/bin/python
案例4:执行极慢,单台几十秒才返回
现象
- ping 很快,setup 巨慢
- 首次执行尤其明显
根因
- Fact 采集(gather_facts)加载大量硬件/网络信息
- DNS 反向解析失败导致超时
解决
- 关闭不必要 Facts
gather_facts: false
- 禁用被控端 DNS 反解
UseDNS no
- 使用
gathering = smart缓存 Facts
案例5:Sudo 需要密码,但未配置或配置错误
现象
Missing sudo password- 交互式执行正常,批量失败
根因
- 未配置 NOPASSWD
- Vault 密码错误/未传入
- become 配置错误
解决
- 安全方式:sudo 免密但限制命令
- 或在变量中配置
ansible_become_pass(必须 Vault 加密) - 执行时加
--ask-become-pass
案例6:Playbook 在测试环境正常,生产执行一半卡死
现象
- 执行到
shell/command/yum等任务卡住 - 无报错、无退出
根因
- 命令等待交互式输入(yum 交互、确认、密钥提示)
- 管道卡死、输出缓冲区满
解决
- 模块加
warn: false、creates/removes做幂等 - yum/dnf 用官方模块,不要 shell 执行
- 加
timeout限制async: 300 poll: 10
案例7:敏感信息泄露到日志/控制台
现象
- 密码、密钥打印在屏幕
- 日志文件包含明文密钥
根因
- 未使用
no_log: true - 未用 Vault 加密
- 调试模式
-vvv泄露变量
解决
- 敏感任务强制不日志
- name: set password command: echo "{``{ pass }}" no_log: true
- 所有密钥使用 Ansible Vault
- 生产关闭
-vvv
案例8:并发过高导致被控端 Load 飙高、业务抖动
现象
- Ansible 一跑,业务机器 CPU/IO 飙升
- 部分服务超时
根因
- forks 太大,同时执行复制、解压、yum 等 heavy 任务
解决
- 降低
forks - 使用
serial分批执行serial: 2
- 避开业务高峰,使用
throttle
案例9:Ansible 执行成功,但文件内容不一致/乱码
现象
- template 渲染后配置异常
- 中文/特殊字符乱码
- 换行符异常
根因
- 编码问题
- 变量未正确转义
- Windows 编辑导致
\r\n
解决
- 使用
ansible.builtin.template而非 copy - 文件 UTF-8 编码
- 控制节点与被控端 locale 一致
案例10:Vault 加密后无法执行,提示解密失败
现象
Decryption failed (no vault secrets would work)- 密码正确但依然报错
根因
- 多个 vault ID 混用
- 文件被篡改
- 换行/空格破坏加密文件
解决
- 统一使用一个 vault 文件
- 用
ansible-vault view测试 - 不要手动编辑加密文件
三、生产级 Ansible 故障排查标准流程
- 单主机测试:
ansible all -m ping -i hosts - 看详细日志:
-vvv - 检查 SSH:手动
ssh user@host - 检查 sudo:
sudo -l - 检查 Python:
which python3 - 检查磁盘、tmp 目录、权限
- 检查防火墙、SELinux
- 关闭 gather_facts 再试
- 降低 forks 再试
- 查看系统日志
/var/log/secure、messages
四、生产运维最佳实践(防故障)
- 一律使用 SSH 密钥,禁止密码
- 敏感信息 Ansible Vault 加密
- 远程用户专用,sudo 最小权限
pipelining = true- 关闭不必要 Facts
- 分批执行
serial - 重要任务
no_log: true - 日志独立存放,权限 600
- 上线前在 staging 验证
- 定期更新 Ansible 版本