11、Ansible 高频故障排查 10 条速记口诀+ 可落地的运维巡检剧本
口诀好记、对应故障,面试被问直接答,无需死记复杂流程,每条口诀对应核心故障+关键解决思路,精准踩分。补充:面试延伸话术——所有故障排查,先单主机测试(ansible 单主机 ping),再看详细日志(-vvv),最后定位 SSH/权限/Python 三大核心,高效排障。
·
Ansible 高频故障排查速记口诀 + 生产级运维巡检剧本
一、Ansible 高频故障排查 10 条速记口诀
口诀好记、对应故障,面试被问直接答,无需死记复杂流程,每条口诀对应核心故障+关键解决思路,精准踩分。
- SSH 连不上,并发、密钥、sshd(对应:批量 SSH 失败,查 forks、密钥、被控端 sshd 配置)
- 权限拒访问,tmp、sudo、become(对应:权限报错,查临时目录、sudo 配置、become 权限)
- Python 找不到,解释器来指定(对应:Python 缺失,inventory 配置 ansible_python_interpreter)
- 执行特别慢,Facts、DNS 查(对应:执行超时,关无用 Facts、禁用 DNS 反解)
- sudo 要密码,免密、Vault 加(对应:sudo 密码提示,配置免密或 Vault 加密 become_pass)
- 执行卡不动,交互、超时控(对应:任务卡死,关交互、加 async/poll 超时)
- 日志泄敏感,no_log、Vault 管(对应:敏感信息泄露,加 no_log、用 Vault 加密)
- 负载飙太高,forks、serial 调(对应:被控端负载高,降 forks、用 serial 分批执行)
- 文件乱码错,编码、template 做(对应:文件渲染异常,查编码、用 template 模块)
- Vault 解失败,ID、文件查(对应:Vault 解密失败,查 vault ID、加密文件完整性)
补充:面试延伸话术——所有故障排查,先单主机测试(ansible 单主机 ping),再看详细日志(-vvv),最后定位 SSH/权限/Python 三大核心,高效排障。
二、Ansible 生产级运维巡检剧本(可直接执行)
剧本核心:覆盖 Ansible 运维全场景,巡检被控端基础环境、SSH 安全、权限配置、Python 环境、临时目录等,提前预防故障,输出巡检报告,支持批量执行。
说明:剧本适配 CentOS/Ubuntu 主流系统,无需修改,执行后会在控制节点生成巡检报告,异常项标红提示,可直接用于生产日常巡检。
巡检剧本(inspect_ansible.yml)
- name: Ansible 生产级运维巡检剧本
hosts: all # 可指定具体主机组,如 web、db
gather_facts: true
become: true
vars:
# 巡检基准配置(可根据生产环境调整)
ansible_standard_user: "ansible" # Ansible 专用远程用户
ansible_tmp_dir: "/var/tmp/ansible-{{ ansible_standard_user }}"
ssh_max_startups: "100:30:200"
ssh_max_sessions: "50"
python_min_version: "3.6"
tasks:
- name: 1. 基础环境巡检(系统、磁盘、负载)
block:
- name: 1.1 收集系统信息
ansible.builtin.setup:
filter:
- "ansible_distribution*"
- "ansible_kernel"
- "ansible_memtotal_mb"
- "ansible_processor_vcpus"
register: system_info
- name: 1.2 检查磁盘空间(根目录使用率 < 80%)
ansible.builtin.command: df -h /
register: disk_usage
changed_when: false
- name: 1.3 检查系统负载(1分钟负载 < CPU核心数)
ansible.builtin.command: uptime
register: system_load
changed_when: false
- name: 标记基础环境异常(磁盘/负载)
ansible.builtin.debug:
msg: "【异常】{{ inventory_hostname }} - 根目录使用率过高或系统负载异常"
when:
- "'80%' in disk_usage.stdout or '90%' in disk_usage.stdout"
or (system_load.stdout.split('load average:')[1].split(',')[0] | float) > ansible_processor_vcpus
rescue:
- name: 基础环境巡检失败
ansible.builtin.debug:
msg: "【失败】{{ inventory_hostname }} - 基础环境巡检异常,请手动排查"
- name: 2. SSH 安全与连接巡检
block:
- name: 2.1 检查 SSH 服务运行状态
ansible.builtin.service:
name: sshd
state: started
enabled: true
register: sshd_status
- name: 2.2 检查 SSH 配置(MaxStartups、MaxSessions)
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
line: "{{ item.line }}"
state: present
regexp: "{{ item.regexp }}"
loop:
- { line: "MaxStartups {{ ssh_max_startups }}", regexp: "^MaxStartups" }
- { line: "MaxSessions {{ ssh_max_sessions }}", regexp: "^MaxSessions" }
register: ssh_config_check
changed_when: false
- name: 2.3 检查 SSH 密码登录禁用状态
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
line: "PasswordAuthentication no"
state: present
regexp: "^PasswordAuthentication"
register: ssh_password_check
changed_when: false
- name: 标记 SSH 配置异常
ansible.builtin.debug:
msg: "【异常】{{ inventory_hostname }} - SSH 配置不符合安全规范(密码登录未禁用/连接数配置不足)"
when: ssh_password_check.changed or ssh_config_check.changed
rescue:
- name: SSH 巡检失败
ansible.builtin.debug:
msg: "【失败】{{ inventory_hostname }} - SSH 服务或配置巡检异常"
- name: 3. Ansible 专用用户与权限巡检
block:
- name: 3.1 检查 Ansible 专用用户存在
ansible.builtin.user:
name: "{{ ansible_standard_user }}"
state: present
register: ansible_user_check
- name: 3.2 检查用户 sudo 权限(最小权限,无需密码)
ansible.builtin.command: sudo -l -U {{ ansible_standard_user }}
register: sudo_perm
changed_when: false
- name: 标记 sudo 权限异常
ansible.builtin.debug:
msg: "【异常】{{ inventory_hostname }} - Ansible 专用用户 sudo 权限不符合要求"
when: "'NOPASSWD' not in sudo_perm.stdout"
rescue:
- name: 权限巡检失败
ansible.builtin.debug:
msg: "【失败】{{ inventory_hostname }} - Ansible 专用用户或权限巡检异常"
- name: 4. Python 环境巡检
block:
- name: 4.1 检查 Python 3 存在
ansible.builtin.command: which python3
register: python3_path
changed_when: false
- name: 4.2 检查 Python 版本(不低于基准版本)
ansible.builtin.command: python3 --version
register: python_version
changed_when: false
- name: 标记 Python 环境异常
ansible.builtin.debug:
msg: "【异常】{{ inventory_hostname }} - Python 版本过低(需 ≥ {{ python_min_version }})或未安装"
when:
- python3_path.rc != 0
or (python_version.stdout.split(' ')[1].split('.')[0:2] | join('.') | float) < (python_min_version | float)
rescue:
- name: Python 巡检失败
ansible.builtin.debug:
msg: "【失败】{{ inventory_hostname }} - Python 环境巡检异常"
- name: 5. 临时目录与权限巡检
block:
- name: 5.1 检查 Ansible 临时目录存在且权限正确
ansible.builtin.file:
path: "{{ ansible_tmp_dir }}"
state: directory
owner: "{{ ansible_standard_user }}"
group: "{{ ansible_standard_user }}"
mode: '0700'
register: tmp_dir_check
changed_when: false
- name: 5.2 检查 /tmp 目录权限(禁止 noexec)
ansible.builtin.command: mount | grep /tmp
register: tmp_mount
changed_when: false
ignore_errors: true
- name: 标记临时目录异常
ansible.builtin.debug:
msg: "【异常】{{ inventory_hostname }} - Ansible 临时目录权限错误或 /tmp 挂载 noexec"
when:
- tmp_dir_check.changed
or ('noexec' in tmp_mount.stdout | default(''))
rescue:
- name: 临时目录巡检失败
ansible.builtin.debug:
msg: "【失败】{{ inventory_hostname }} - 临时目录巡检异常"
- name: 6. 生成巡检报告(控制节点)
ansible.builtin.copy:
content: |
===================== {{ inventory_hostname }} Ansible 巡检报告 =====================
巡检时间:{{ ansible_date_time.iso8601 }}
系统信息:{{ system_info | to_nice_json }}
磁盘使用率:{{ disk_usage.stdout_lines | last }}
系统负载:{{ system_load.stdout }}
SSH 服务状态:{{ '正常' if sshd_status.state == 'started' else '异常' }}
Python 版本:{{ python_version.stdout | default('未安装') }}
异常项:{{ ansible_failed_task | default('无异常') }}
================================================================================
dest: "./ansible_inspect_report_{{ inventory_hostname }}.txt"
delegate_to: localhost
changed_when: false
- name: 汇总所有主机巡检结果
hosts: localhost
gather_facts: false
tasks:
- name: 汇总巡检报告
ansible.builtin.shell: cat ./ansible_inspect_report_*.txt > ./ansible_inspect_summary.txt
changed_when: false
- name: 提示巡检完成
ansible.builtin.debug:
msg: "Ansible 生产巡检完成!汇总报告已生成:./ansible_inspect_summary.txt"
三、剧本使用说明(直接落地)
- 保存剧本:将上述内容保存为
inspect_ansible.yml(可放在 Ansible 工作目录)。 - 调整变量(可选):根据生产环境,修改 vars 里的基准配置(如专用用户名、SSH 连接数、Python 最低版本)。
- 执行剧本:
# 批量巡检所有主机(需提前配置 inventory) ``ansible-playbook inspect_ansible.yml --ask-become-pass `` ``# 巡检指定主机组(如 web 组) ``ansible-playbook inspect_ansible.yml -l web --ask-become-pass - 查看报告:执行完成后,控制节点会生成单主机报告(ansible_inspect_report_主机IP.txt)和汇总报告(ansible_inspect_summary.txt),直接查看异常项即可。
四、补充说明
- 剧本幂等性:可重复执行,不会修改正常配置,仅标记异常项,适合日常巡检(如每日/每周执行)。
- 兼容性:适配 CentOS 7/8/9、Ubuntu 18.04/20.04/22.04,其他系统可微调 tasks 中的命令(如 Debian 系统 SSH 服务名是 ssh,非 sshd)。
- 面试加分:若被问“如何保障 Ansible 生产稳定”,可结合口诀 + 巡检剧本,说明“提前巡检预防故障,快速排障解决问题”的思路。
更多推荐
所有评论(0)