Ansible:批量配置服务器与部署应用
Ansible 是一个开源的自动化工具,专为配置管理、应用部署和任务编排而设计。它使用 SSH 协议进行通信,无需在目标服务器上安装代理,从而简化了批量操作。核心优势包括易用性(基于 YAML 语法)、可扩展性和幂等性(确保多次执行结果一致)。下面我将一步步解释如何用 Ansible 实现批量配置服务器和部署应用,确保结构清晰、易于理解。
1. Ansible 基础概念
- Playbook:Ansible 的核心配置文件,用 YAML 编写,定义了任务序列(如安装软件、修改配置)。每个 playbook 包含多个"play",每个 play 针对一组服务器执行特定任务。
- Inventory:列出目标服务器的文件,可以是静态(如文本文件)或动态(如从云平台获取)。格式简单,例如:
[web_servers]
server1 ansible_host=192.168.1.10
server2 ansible_host=192.168.1.11[db_servers]
server3 ansible_host=192.168.1.12 - 模块(Modules):Ansible 的预定义任务单元,例如 apt(用于 Ubuntu 软件安装)、copy(文件传输)或 service(管理服务)。Ansible 提供数百个内置模块,覆盖常见运维需求。
- Ad-hoc 命令:快速执行单行任务,适合简单操作,如 ansible all -m ping 测试所有服务器的连通性。
2. 准备工作
在开始前,确保满足以下条件:
- 控制节点:安装 Ansible(例如在 Ubuntu 上:sudo apt install ansible)。
- 目标服务器:SSH 访问权限(推荐使用 SSH 密钥认证,避免密码输入)。
- Inventory 设置:创建或定义服务器分组,如上所示。
- 测试连通性:运行 ansible all -m ping 确认所有服务器响应正常。
3. 批量配置服务器
Ansible 通过 playbook 实现批量配置,例如安装基础软件、设置防火墙或优化系统参数。以下是典型步骤:
- 步骤 1: 定义配置任务
创建一个 playbook(如 setup_servers.yml),指定任务序列。示例:批量安装 Nginx 并配置防火墙。—
– name: 配置 Web 服务器组
hosts: web_servers # 针对 inventory 中的 web_servers 组
become: yes # 使用 sudo 权限
tasks:
– name: 安装 Nginx
apt:
name: nginx
state: present # 确保安装最新版
– name: 配置防火墙允许 HTTP
ufw:
rule: allow
port: 80
proto: tcp
– name: 启动 Nginx 服务
service:
name: nginx
state: started
enabled: yes # 开机自启 - 步骤 2: 执行 playbook
运行命令:ansible-playbook setup_servers.yml。Ansible 会顺序执行任务,并输出详细日志(如成功/失败统计)。 - 关键优势:
- 幂等性:重复运行不会导致错误(例如,已安装的软件不会重复安装)。
- 批量处理:通过 inventory 分组,一次操作多台服务器。
- 错误处理:任务失败时自动停止或重试(可配置)。
4. 部署应用
应用部署涉及分发代码、设置依赖和启动服务。Ansible 适合部署 Web 应用、微服务或数据库。以下是部署一个简单 Python Flask 应用的示例:
- 步骤 1: 准备应用代码
将应用代码(如 app.py)和依赖文件(如 requirements.txt)放在控制节点上。 - 步骤 2: 创建部署 playbook
编写 deploy_app.yml,包含代码传输、依赖安装和启动服务。—
– name: 部署 Flask 应用到 Web 服务器
hosts: web_servers
become: yes
vars:
app_dir: /opt/myapp # 定义应用部署目录
tasks:
– name: 创建应用目录
file:
path: "{{ app_dir }}"
state: directory
owner: "{{ ansible_user }}"
group: "{{ ansible_user }}"
– name: 复制应用代码
copy:
src: ./app.py # 本地文件路径
dest: "{{ app_dir }}/app.py"
– name: 复制依赖文件
copy:
src: ./requirements.txt
dest: "{{ app_dir }}/requirements.txt"
– name: 安装 Python 依赖
pip:
requirements: "{{ app_dir }}/requirements.txt"
executable: pip3
– name: 启动 Flask 应用(使用 systemd)
systemd:
name: myflaskapp
state: started
enabled: yes
daemon_reload: yes
scope: system
unit: |
[Unit]
Description=My Flask App
After=network.target[Service]
User={{ ansible_user }}
WorkingDirectory={{ app_dir }}
ExecStart=/usr/bin/python3 {{ app_dir }}/app.py[Install]
WantedBy=multi-user.target - 步骤 3: 执行部署
运行 ansible-playbook deploy_app.yml。Ansible 会处理文件传输、依赖安装和服务管理。 - 高级技巧:
- 变量管理:使用 vars 或外部文件(如 group_vars)避免硬编码。
- 滚动更新:通过 serial 参数分批部署,减少停机时间。
- 集成版本控制:结合 Git 模块自动拉取最新代码。
5. 最佳实践与注意事项
- 版本控制:将 playbook 和 inventory 存入 Git,便于协作和回滚。
- 安全性:使用 Ansible Vault 加密敏感数据(如密码)。
- 性能优化:
- 启用 SSH 管道(ansible.cfg 中设置 pipelining=True)加速执行。
- 使用 async 和 poll 处理长时间任务。
- 错误排查:运行 ansible-playbook 时添加 -vvv 参数获取详细日志。
- 扩展性:结合角色(Roles)组织复杂 playbook,实现模块化重用。
总结
Ansible 通过声明式的 YAML playbook,高效实现服务器批量配置和应用部署,显著提升运维效率。入门简单:从安装基础软件到部署完整应用,只需定义任务并执行。建议从简单 playbook 开始实践,逐步探索高级功能(如动态 inventory 或自定义模块)。如需更多示例,可参考官方文档或社区资源。动手尝试吧——一个 playbook 就能管理数百台服务器!



