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 限制:MaxStartups、MaxSessions 被打满

解决

  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: false、creates/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 版本
相关推荐
志栋智能7 小时前
运维超自动化的版本控制与回滚机制
运维·自动化
中云DDoS CC防护蔡蔡7 小时前
DDOS和CC攻击谁更可怕
运维·服务器·经验分享·网络安全·ddos
Ruiery7 小时前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
ClickHouseDB7 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
欧米欧8 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery8 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
todoitbo8 小时前
群晖NAS部署JmalCloud:Docker安装、文件管理、博客与公网访问完整教程
运维·docker·容器
时间售卖铺9 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw9 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
前端精髓9 小时前
调用大模型API
运维·服务器·microsoft