跳到主要内容

Ansible

特点

Ansible 是最流行的配置管理工具,Agentless(无需在目标机安装 Agent),通过 SSH 执行任务。

特性说明
Agentless通过 SSH 连接,无需安装客户端
YAMLPlaybook 使用 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_containerDockerdocker_container: name=app image=my-app
uriHTTP 请求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 会跳过而不是重新安装。这保证了反复执行不会造成副作用。但 shellcommand 模块不保证幂等,需要配合 creates / when 条件判断。

Q2: Role 和 Playbook 什么关系?

答案

  • Playbook:定义对哪些主机执行哪些任务
  • Role:一组可复用的任务、模板、变量的标准化封装

类比编程:Playbook 是 main() 函数,Role 是可复用的模块/库。Role 通过标准目录结构组织,可以在不同 Playbook 中复用,也可以通过 Ansible Galaxy 分享。

相关链接