DevOps 面试题大全(五·上):Ansible 自动化运维 25 题详解

前言

Ansible 是自动化运维工具,采用无代理架构,使用 YAML 编写 Playbook。本文整理 50 道 Ansible 面试题,分上下两篇。

一、基础概念题(1-15 题)

1. 什么是 Ansible?

开源自动化工具,用于配置管理、应用部署、任务编排。特点:无代理、幂等性、简单易用。

2. Ansible 架构组成

  • 控制节点 - 运行 Ansible 的机器
  • 受管节点 - 被管理的服务器
  • Inventory - 主机清单
  • Playbook - 任务剧本
  • Module - 执行模块
  • Plugin - 插件系统

3. Ansible 工作原理

  1. 读取 Inventory 获取主机列表
  2. 加载 Playbook 定义任务
  3. 通过 SSH 连接目标主机
  4. 推送模块并执行
  5. 返回执行结果

4. Inventory 文件格式

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com
db2.example.com

[all:vars]
ansible_user=admin
ansible_ssh_private_key_file=~/.ssh/id_rsa

5. Ad-Hoc 命令示例

# 检查连通性
ansible all -m ping

# 查看磁盘空间
ansible all -m shell -a "df -h"

# 安装软件包
ansible webservers -m yum -a "name=httpd state=present"

6. Playbook 基本结构

---
- name: 部署 Web 服务器
  hosts: webservers
  become: yes
  tasks:
    - name: 安装 Apache
      yum:
        name: httpd
        state: present
    
    - name: 启动服务
      service:
        name: httpd
        state: started

7. Ansible 模块分类

  • 系统模块:yum, apt, service, user
  • 文件模块:copy, file, lineinfile
  • 命令模块:command, shell, script
  • 云模块:ec2, azure, gcp
  • 数据库模块:mysql, postgresql

8. 变量定义方式

  1. Playbook 内定义(vars)
  2. Inventory 变量
  3. 主机变量(host_vars)
  4. 组变量(group_vars)
  5. 命令行传入(-e)
  6. 注册变量(register)

9. 条件判断语法

tasks:
  - name: 仅在 CentOS 安装
    yum:
      name: httpd
      state: present
    when: ansible_os_family == "RedHat"
  
  - name: 内存大于 2G 时执行
    command: /opt/heavy_task.sh
    when: ansible_memtotal_mb > 2048

10. 循环语法

tasks:
  - name: 创建多个用户
    user:
      name: "{{ item }}"
      state: present
    loop:
      - user1
      - user2
      - user3
  
  - name: 安装多个包
    yum:
      name: "{{ item }}"
      state: present
    loop: ["nginx", "mysql", "php"]

11-15. 更多基础题

题号 题目 要点
11 什么是幂等性? 多次执行结果一致
12 Ansible 默认端口? SSH 22 端口
13 如何处理敏感数据? Ansible Vault 加密
14 Role 的作用? 代码复用,结构化
15 Handler 触发时机? 任务状态改变时

二、进阶实战题(16-25 题)

16. Role 目录结构

role_name/
├── defaults/      # 默认变量
├── vars/          # 角色变量
├── tasks/         # 任务列表
├── handlers/      # 处理器
├── templates/     # Jinja2 模板
├── files/         # 静态文件
├── meta/          # 角色元数据
└── tests/         # 测试用例

17. Template 模板使用

# 模板文件 (nginx.conf.j2)
server {
    listen {{ http_port }};
    server_name {{ server_name }};
    root {{ web_root }};
}

# Playbook 调用
- name: 部署配置
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
  notify: restart nginx

18. Handler 定义

tasks:
  - name: 更新配置
    copy:
      src: app.conf
      dest: /etc/app/
    notify: restart app

handlers:
  - name: restart app
    service:
      name: app
      state: restarted

19. Ansible Vault 使用

# 创建加密文件
ansible-vault create secrets.yml

# 编辑加密文件
ansible-vault edit secrets.yml

# 查看加密文件
ansible-vault view secrets.yml

# 运行 Playbook
ansible-playbook site.yml --ask-vault-pass

20. 动态 Inventory

从云 API 动态获取主机列表,支持 AWS、Azure、GCP 等。

21. 异步任务配置

- name: 长时间运行任务
  command: /opt/long_task.sh
  async: 3600
  poll: 0
  
- name: 检查任务状态
  async_status:
    jid: "{{ ansible_job_id }}"
  register: result
  until: result.finished
  retries: 30

22. 块和错误处理

- block:
    - name: 主要任务
      command: /opt/main.sh
    
    - name: 次要任务
      command: /opt/secondary.sh
  rescue:
    - name: 失败时执行
      debug:
        msg: "任务失败,执行回滚"
  always:
    - name: 总是执行
      debug:
        msg: "清理工作"

23. 自定义模块

Python 编写,返回 JSON 格式,支持 check_mode。

24. 策略插件

linear(默认)、free、host_pinned 等,控制执行顺序。

25. 性能优化

  • 启用 SSH 管道
  • 调整 fork 数量
  • 使用 fact 缓存
  • 减少 gather_facts

下篇预告:26-50 题,涵盖高级用法、故障排查、最佳实践等

发表回复

后才能评论