Ansible 高频故障排查速记口诀 + 生产级运维巡检剧本

一、Ansible 高频故障排查 10 条速记口诀

口诀好记、对应故障,面试被问直接答,无需死记复杂流程,每条口诀对应核心故障+关键解决思路,精准踩分。

  1. SSH 连不上,并发、密钥、sshd(对应:批量 SSH 失败,查 forks、密钥、被控端 sshd 配置)
  2. 权限拒访问,tmp、sudo、become(对应:权限报错,查临时目录、sudo 配置、become 权限)
  3. Python 找不到,解释器来指定(对应:Python 缺失,inventory 配置 ansible_python_interpreter)
  4. 执行特别慢,Facts、DNS 查(对应:执行超时,关无用 Facts、禁用 DNS 反解)
  5. sudo 要密码,免密、Vault 加(对应:sudo 密码提示,配置免密或 Vault 加密 become_pass)
  6. 执行卡不动,交互、超时控(对应:任务卡死,关交互、加 async/poll 超时)
  7. 日志泄敏感,no_log、Vault 管(对应:敏感信息泄露,加 no_log、用 Vault 加密)
  8. 负载飙太高,forks、serial 调(对应:被控端负载高,降 forks、用 serial 分批执行)
  9. 文件乱码错,编码、template 做(对应:文件渲染异常,查编码、用 template 模块)
  10. 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"

三、剧本使用说明(直接落地)

  1. 保存剧本:将上述内容保存为 inspect_ansible.yml(可放在 Ansible 工作目录)。
  2. 调整变量(可选):根据生产环境,修改 vars 里的基准配置(如专用用户名、SSH 连接数、Python 最低版本)。
  3. 执行剧本: # 批量巡检所有主机(需提前配置 inventory) ``ansible-playbook inspect_ansible.yml --ask-become-pass `` ``# 巡检指定主机组(如 web 组) ``ansible-playbook inspect_ansible.yml -l web --ask-become-pass
  4. 查看报告:执行完成后,控制节点会生成单主机报告(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 生产稳定”,可结合口诀 + 巡检剧本,说明“提前巡检预防故障,快速排障解决问题”的思路。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐