DevOps 面试题大全(五·上):Ansible 自动化运维 25 题详解
前言
Ansible 是自动化运维工具,采用无代理架构,使用 YAML 编写 Playbook。本文整理 50 道 Ansible 面试题,分上下两篇。
一、基础概念题(1-15 题)
1. 什么是 Ansible?
开源自动化工具,用于配置管理、应用部署、任务编排。特点:无代理、幂等性、简单易用。
2. Ansible 架构组成
- 控制节点 - 运行 Ansible 的机器
- 受管节点 - 被管理的服务器
- Inventory - 主机清单
- Playbook - 任务剧本
- Module - 执行模块
- Plugin - 插件系统
3. Ansible 工作原理
- 读取 Inventory 获取主机列表
- 加载 Playbook 定义任务
- 通过 SSH 连接目标主机
- 推送模块并执行
- 返回执行结果
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. 变量定义方式
- Playbook 内定义(vars)
- Inventory 变量
- 主机变量(host_vars)
- 组变量(group_vars)
- 命令行传入(-e)
- 注册变量(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 题,涵盖高级用法、故障排查、最佳实践等
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。




