当前位置: 首页 > news >正文

Ansible生产调优与故障排查全攻略

 一、Ansible 生产调优(Performance & Reliability)

1.1 控制并发与连接池(关键!)

默认 Ansible 是 串行执行,效率极低。生产环境必须调优:

# ansible.cfg
[defaults]
# 最大并发主机数(根据控制机资源调整,建议 10~50)
forks = 30# SSH 连接复用(大幅提升速度)
[ssh_connection]
# 启用 ControlPersist(保持 SSH 连接复用)
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
# 禁用 SSH 策略检查(避免首次连接卡住)
control_path = /tmp/ansible-%%r@%%h:%%p
pipelining = True  # 减少 SSH 调用次数(需关闭 requiretty)

 前提:目标机 /etc/sudoers禁用 requiretty

# 在目标机执行
sed -i 's/^Defaults.*requiretty/#Defaults requiretty/' /etc/sudoers

1.2 使用 async + poll 处理长任务

避免任务超时(如大文件下载、编译):

- name: 异步下载大文件(不阻塞)command: wget -O /tmp/bigfile.tar.gz https://example.com/bigfile.tar.gzasync: 3600    # 最大运行时间(秒)poll: 0        # 立即返回,不等待register: download_job- name: 等待下载完成async_status:jid: "{{ download_job.ansible_job_id }}"register: job_resultuntil: job_result.finishedretries: 300delay: 10

1.3 启用事实缓存(Fact Caching)

避免重复收集 ansible_facts(耗时操作):

# ansible.cfg
[defaults]
# 启用事实缓存(使用 JSON 文件)
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_fact_cache
fact_caching_timeout = 86400  # 缓存 24 小时

 适用于大规模集群,首次执行后后续 playbook 速度提升 30%+


1.4 限制资源消耗(避免控制机 OOM)

# ansible.cfg
[defaults]
# 限制内存使用(通过环境变量)
# 在执行前设置:export ANSIBLE_FORKS=20
# 或使用 systemd 限制控制机资源

 建议:Ansible 控制机单独部署,不要与业务混用


 二、生产级日志与审计

2.1 完整日志记录

# ansible.cfg
[defaults]
log_path = ./logs/ansible-{{ lookup('pipe', 'date +%Y%m%d-%H%M') }}.log

日志包含:时间、主机、任务、状态、变更内容

2.2 启用回调插件(Callback Plugins)

# ansible.cfg
[defaults]
# 显示任务耗时(定位慢任务)
callback_whitelist = profile_tasks, timer, mail# 可选:发送失败邮件(需配置 SMTP)
# [callback_mail]
# smtp_server = smtp.example.com
# ...

2.3 使用 --diff 查看配置变更

ansible-playbook site.yml --diff

 输出文件内容差异(如配置文件修改),便于审计。


三、常见生产故障 & 排查方法(真实案例)

 故障 1:UNREACHABLE! "Failed to connect to the host via ssh"

排查步骤:
# 1. 手动测试 SSH
ssh deploy@192.168.1.101# 2. 检查 SSH 密钥权限
ls -l ~/.ssh/id_rsa        # 应为 600
ls -l ~/.ssh/authorized_keys # 目标机应为 600# 3. 检查 SELinux(CentOS)
getenforce  # 若为 Enforcing,临时关闭测试
setenforce 0# 4. 检查防火墙
ansible all -m shell -a "systemctl status firewalld"
修复:
  • 确保 ~/.ssh/config 无冲突配置
  • 控制机与目标机时间同步(NTP)
  • 使用 ansible_ssh_common_args 指定跳板机(如有)

 故障 2:MODULE FAILURE: /usr/bin/python: not found

原因:
  • 目标机无 Python 2/3
  • ansible_python_interpreter 路径错误
修复:
# hosts.ini
[all:vars]
ansible_python_interpreter=/usr/bin/python3  # Ubuntu 20.04+
# 或
ansible_python_interpreter=/usr/libexec/platform-python  # RHEL 8+

 CentOS 8+ 默认无 /usr/bin/python,必须显式指定。


 故障 3:sudo: a password is required

原因:
  • deploy 用户无 NOPASSWD 权限
  • /etc/sudoers.d/deploy 权限非 440
排查:
# 在目标机执行
sudo -l -U deploy  # 查看 deploy 的 sudo 权限
ls -l /etc/sudoers.d/deploy  # 必须是 -r--r-----
修复:
echo "deploy ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/deploy
sudo chmod 440 /etc/sudoers.d/deploy

 故障 4:Handler 未触发

常见原因:
  • 任务状态为 ok(未变更),Handler 不触发
  • Playbook 中未定义 handlers 区域
修复:
  • 确保任务使用 template/copy 等可能变更的模块
  • 使用 --force-handlers 强制执行(调试用)

 故障 5:幂等性失效(每次执行都 changed)

典型场景:
  • 使用 shell/command 模块执行非幂等命令
  • 未使用 creates/removes 参数
修复示例:
- name: 启动脚本(幂等)command: /opt/app/start.shargs:creates: /var/run/app.pid  # 文件存在则跳过

 原则:优先使用 Ansible 内置模块(如 systemdpackage),避免 shell


 四、安全加固(生产必备)

4.1 禁用 root 远程登录(已做)

4.2 使用 Ansible Vault 加密敏感变量

# 创建加密变量文件
ansible-vault create group_vars/all/vault.yml# 内容示例:
db_password: "s3cr3t!"# 执行时解密
ansible-playbook site.yml --ask-vault-pass

建议:Vault 密码由团队共享(如 HashiCorp Vault 或 1Password)

4.3 限制 playbook 权限

# 在 playbook 开头限制
- hosts: webbecome: yesbecome_user: root  # 明确提权目标vars:ansible_ssh_user: deploy

 五、监控与告警集成

5.1 失败自动告警(邮件/钉钉/企业微信)

使用 callback 插件或在 CI/CD 中判断退出码:

ansible-playbook site.yml
if [ $? -ne 0 ]; thencurl -X POST https://oapi.dingtalk.com/robot/send?access_token=xxx \-H 'Content-Type: application/json' \-d '{"msgtype": "text", "text": {"content": "Ansible 部署失败!"}}'
fi

5.2 与 Prometheus 集成

  • 使用 ansible-exporter 暴露指标
  • 或在 playbook 结尾上报状态到 Pushgateway

 六、测试与验证(CI/CD 流程)

6.1 使用 Molecule 测试 Role

pip install molecule[docker]
molecule init role nginx
molecule test

6.2 预演模式(Dry Run)

ansible-playbook site.yml --check --diff

注意:--checkshell/command 无效,仅模拟。


 七、生产 Checklist

项目是否完成
使用普通用户 + sudo NOPASSWD
 SSH 密钥认证 + 禁用密码登录
 forks 并发调优
 启用 pipelining 和 ControlPersist
 日志记录 + 回调插件
 敏感信息使用 Vault 加密
 所有任务幂等
 Handler 正确触发
多环境变量分离(dev/staging/prod)
 故障自动告警

 推荐工具链

  • 日志分析:ELK 收集 ansible.log
  • 版本管理:Git + Tag(如 v1.2.0-prod
  • CI/CD:GitLab CI / Jenkins 执行 playbook
  • 配置备份:定期备份 /etc 到 S3(使用 Ansible 自动化)

建议
永远不要在生产环境直接运行未经测试的 playbook
先在 staging 环境验证,再通过 CI/CD 流水线发布。

http://www.dtcms.com/a/540110.html

相关文章:

  • 【笔记】Podman Desktop 部署 开源数字人 HeyGem.ai
  • vue-day02
  • 青岛有哪些做网站的公司公司网页制作需要什么哪些材料
  • 建站公司用wordpress如何查看网站的建设方式
  • Leetcode 3727. Maximum Alternating Sum of Squares
  • rtp组播乱序三种策略模式选择(AI)
  • Docker基础 - 入门基础和Helloworld
  • 集群——GitLabJenkins部署
  • deepin 终端,但是版本是 deepin 15 的
  • 简单的分布式锁 SpringBoot Redisson‌
  • 如何建立一个视频网站网站域名权
  • 如何修改wordpress站名泰安网站建设哪家不错
  • 【Swift】LeetCode 73. 矩阵置零
  • 益和热力性能优化实践:从 SQL Server 到 TDengine 时序数据库,写入快 20 秒、查询提速 5 倍
  • 蚂蚁集团已在香港申请「ANTCOIN」等 Web3 相关商标
  • HarmonyOS实战项目:开发一个分布式新闻阅读客户端
  • “Web3、区块链、稳定币”名词解析
  • 【参赛心得】鸿蒙三方库适配实战:从 Hadoop 生态到鸿蒙生态,企业级项目集成的 6 个最佳实践
  • 【SpringBoot】29 核心功能 - 数据访问 - Spring Boot 2 操作 Redis 实践指南:本地安装与阿里云 Redis 对比应用
  • B.40.3.1-Spring Boot与Spring Cloud核心技术详解
  • HarmonyOS RemoteWindow远程窗口组件的分布式能力深度解析
  • HarmonyOS自动化测试与持续集成实战指南
  • 智慧团建网站入口官网手机前端开发软件工具
  • 中国建设银行金华分行网站微信小程序在哪里找出来
  • Visual Basic 二进制文件
  • WEB前端技术基础(第四章:JavaScript-网页动态交互语言)
  • 房屋租赁合同中协助办证义务分析及租金退还法律意见
  • 广州住房和城乡建设厅网站网站建设 中企动力公司
  • 外贸网站空间哪个好WordPress首页id
  • STM32F407移植FreeRTOS完整教程(HAL库版本)