Ansible是服务器运维中广泛使用的自动化配置管理工具,基于SSH协议无需在目标主机安装Agent,通过YAML语法的Playbook描述系统配置状态,适合批量服务器初始化、应用部署和配置变更。本文从安装配置到Playbook编写给出完整实践方案。
Ansible架构与工作原理
Ansible采用无Agent架构,控制节点通过SSH连接被管理主机,执行模块化任务。核心组件包括:Inventory(主机清单)、Module(执行模块)、Playbook(任务编排)、Role(角色复用)。与Puppet、Chef等工具相比,Ansible的”推送”模式不依赖目标主机常驻进程,降低了部署复杂度。
Ansible的工作流程是:读取Inventory获取目标主机 → 加载Playbook解析任务 → 通过SSH连接目标主机执行对应模块 → 收集执行结果并输出。
安装Ansible与Inventory配置
控制节点安装Ansible,推荐使用pip方式以保证版本可控:
# 安装Ansible
pip install ansible-core==2.16.0
# 验证安装
ansible --version
# 配置SSH免密登录到目标主机
ssh-keygen -t ed25519
ssh-copy-id root@192.168.1.101
ssh-copy-id root@192.168.1.102
Inventory文件定义被管理主机分组,支持按功能、环境、机房等维度组织:
# /etc/ansible/hosts
[web_servers]
web01 ansible_host=192.168.1.101 ansible_user=root
web02 ansible_host=192.168.1.102 ansible_user=root
[db_servers]
db01 ansible_host=192.168.1.201 ansible_user=postgres
[prod:children]
web_servers
db_servers
[web_servers:vars]
nginx_version=1.25.3
max_connections=1024
使用ansible_host指定实际IP,ansible_user指定SSH用户。组变量通过:vars后缀定义,子组通过:children继承父组配置。
Ad-hoc命令与常用模块
Ad-hoc命令适合一次性操作,无需编写Playbook。常用模块包括yum/apt(包管理)、copy(文件传输)、template(模板渲染)、service(服务管理)、user(用户管理)。
# 检查所有主机连通性
ansible all -m ping
# 批量安装Nginx
ansible web_servers -m yum -a "name=nginx state=present"
# 批量启动Nginx并设置开机自启
ansible web_servers -m service -a "name=nginx state=started enabled=yes"
# 批量创建用户
ansible all -m user -a "name=deploy shell=/bin/bash groups=wheel"
# 拷贝配置文件并备份原文件
ansible web_servers -m copy -a "src=/local/nginx.conf dest=/etc/nginx/nginx.conf backup=yes"
# 执行Shell命令查看磁盘使用
ansible all -m shell -a "df -h | grep -v tmpfs"
Playbook任务编排与变量管理
Playbook是Ansible的核心,以YAML格式描述任务序列。以下是一个Web服务器初始化的完整Playbook:
# web_init.yml
---
- name: Web服务器初始化配置
hosts: web_servers
become: yes
vars:
nginx_worker_processes: auto
nginx_worker_connections: 10240
tasks:
- name: 安装EPEL仓库
yum:
name: epel-release
state: present
- name: 安装Nginx
yum:
name: nginx
state: latest
- name: 渲染Nginx配置文件
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
notify: restart nginx
- name: 创建网站根目录
file:
path: /var/www/html
state: directory
owner: nginx
group: nginx
mode: '0755'
- name: 部署默认页面
copy:
content: "{{ ansible_hostname }} - Service Online\n"
dest: /var/www/html/index.html
- name: 启动Nginx并设开机自启
service:
name: nginx
state: started
enabled: yes
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
notify和handlers实现配置变更后自动重启服务。template模块使用Jinja2模板渲染配置文件,变量在运行时动态替换。ansible_hostname是Ansible内置的Fact变量,运行时自动采集。
Nginx配置模板Jinja2语法
模板文件nginx.conf.j2中通过Jinja2语法引用变量:
# nginx.conf.j2
worker_processes {{ nginx_worker_processes }};
events {
worker_connections {{ nginx_worker_connections }};
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
{% for server in web_servers %}
upstream {{ server.name }} {
server {{ server.ip }}:{{ server.port }};
}
{% endfor %}
server {
listen 80;
server_name {{ ansible_hostname }};
location / {
proxy_pass http://{{ web_servers[0].name }};
}
}
}
{% for %}循环语法用于批量生成upstream配置,配合变量列表实现动态配置渲染。
Roles角色复用与目录结构
当Playbook规模增长,用Roles将任务按功能模块拆分,提高复用性。Role的标准目录结构:
roles/
└── nginx/
├── tasks/
│ └── main.yml # 主任务
├── handlers/
│ └── main.yml # 处理器
├── templates/
│ └── nginx.conf.j2 # 模板文件
├── vars/
│ └── main.yml # 角色变量
├── defaults/
│ └── main.yml # 默认变量
└── meta/
└── main.yml # 角色元数据
在Playbook中引用Role:
- name: 部署Web集群
hosts: web_servers
become: yes
roles:
- role: nginx
vars:
nginx_worker_connections: 20480
- role: firewall
- role: monitoring
变量优先级从低到高为:defaults/main.yml → inventory组变量 → Playbook中vars → Role调用时传入的vars。通过分层变量管理,同一Role可以适配不同环境的配置需求。
Ansible Vault加密敏感信息
数据库密码、API密钥等敏感信息不应明文存放在Playbook中。Ansible Vault提供加密功能:
# 创建加密变量文件
ansible-vault create secrets.yml
# 输入Vault密码后编辑文件内容
# db_password: "S3cr3tP@ss"
# 在Playbook中引用加密文件
- name: 数据库配置
hosts: db_servers
vars_files:
- secrets.yml
tasks:
- name: 配置数据库
template:
src: postgresql.conf.j2
dest: /etc/postgresql/postgresql.conf
vars:
db_password: "{{ db_password }}"
# 执行Playbook时提供Vault密码
ansible-playbook db_init.yml --ask-vault-pass
Ansible的批量配置管理能力在服务器规模超过10台时价值凸显。配合CI/CD流水线,可以实现配置变更的自动化审计和回滚,是运维标准化的重要基础设施。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/ansible-zi-dong-hua-yun-wei-shi-zhan-pi-liang-fu-wu-qi-pei/