Ansible
特点
Ansible 是最流行的配置管理工具,Agentless(无需在目标机安装 Agent),通过 SSH 执行任务。
| 特性 | 说明 |
|---|---|
| Agentless | 通过 SSH 连接,无需安装客户端 |
| YAML | Playbook 使用 YAML 编写,学习成本低 |
| 幂等性 | 大部分模块支持幂等,重复执行安全 |
| 模块丰富 | 3000+ 内置模块,覆盖几乎所有运维场景 |
核心概念
Ansible
├── Inventory # 管理的主机列表
├── Playbook # 任务剧本(YAML)
│ ├── Play # 一组任务(针对哪些主机)
│ │ └── Task # 单个任务(调用模块)
│ └── Handler # 被通知时执行的任务
├── Role # 可复用的任务单元
├── Variable # 变量(host_vars / group_vars)
└── Vault # 加密敏感数据
Inventory
inventory/production.ini
[webservers]
web-01 ansible_host=10.0.1.10
web-02 ansible_host=10.0.1.11
[dbservers]
db-01 ansible_host=10.0.2.10 ansible_user=dba
[all:vars]
ansible_user=ops
ansible_python_interpreter=/usr/bin/python3
Playbook
playbooks/deploy-nginx.yml
---
- name: 部署 Nginx
hosts: webservers
become: true # sudo 执行
vars:
nginx_port: 80
worker_processes: auto
tasks:
- name: 安装 Nginx
apt:
name: nginx
state: present
update_cache: true
- name: 配置 Nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
validate: nginx -t -c %s # 部署前验证配置
notify: reload nginx # 配置变更时通知 handler
- name: 部署站点配置
template:
src: templates/site.conf.j2
dest: /etc/nginx/conf.d/default.conf
notify: reload nginx
- name: 确保 Nginx 运行
service:
name: nginx
state: started
enabled: true
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded
Jinja2 模板
templates/nginx.conf.j2
worker_processes {{ worker_processes }};
events {
worker_connections 1024;
}
http {
server {
listen {{ nginx_port }};
server_name {{ ansible_hostname }};
location / {
proxy_pass http://{{ backend_host }}:{{ backend_port }};
}
}
}
Role
Ansible Role 是组织 Playbook 的最佳方式,按标准目录结构复用。
roles/nginx/
├── tasks/main.yml # 任务列表
├── handlers/main.yml # Handler
├── templates/ # Jinja2 模板
├── files/ # 静态文件
├── vars/main.yml # 角色变量
├── defaults/main.yml # 默认变量(可覆盖)
└── meta/main.yml # 依赖声明
playbooks/site.yml
---
- hosts: webservers
become: true
roles:
- role: common # 基础配置
- role: nginx # Nginx 部署
vars:
nginx_port: 8080
- role: certbot # SSL 证书
常用模块
| 模块 | 用途 | 示例 |
|---|---|---|
apt / yum | 包管理 | apt: name=nginx state=present |
service | 服务管理 | service: name=nginx state=started |
template | 模板渲染 | template: src=x.j2 dest=/etc/x |
copy | 复制文件 | copy: src=x dest=/etc/x |
file | 文件/目录 | file: path=/data state=directory |
user | 用户管理 | user: name=deploy shell=/bin/bash |
cron | 定时任务 | cron: name=backup minute=0 hour=2 |
docker_container | Docker | docker_container: name=app image=my-app |
uri | HTTP 请求 | uri: url=http://localhost/health |
Ansible Vault(加密敏感数据)
# 创建加密文件
ansible-vault create secrets.yml
# 编辑加密文件
ansible-vault edit secrets.yml
# 运行时解密
ansible-playbook site.yml --ask-vault-pass
常见面试问题
Q1: Ansible 的幂等性是什么意思?
答案:
同一个 Playbook 执行一次和执行多次结果一致。例如 apt: name=nginx state=present,如果 Nginx 已安装,Ansible 会跳过而不是重新安装。这保证了反复执行不会造成副作用。但 shell 和 command 模块不保证幂等,需要配合 creates / when 条件判断。
Q2: Role 和 Playbook 什么关系?
答案:
- Playbook:定义对哪些主机执行哪些任务
- Role:一组可复用的任务、模板、变量的标准化封装
类比编程:Playbook 是 main() 函数,Role 是可复用的模块/库。Role 通过标准目录结构组织,可以在不同 Playbook 中复用,也可以通过 Ansible Galaxy 分享。