Ansible自动化部署ECS与Nginx全流程
为了实现 “云 ECS 创建 + Linux 初始化 + 应用部署” 全流程自动化,我们可以借助 Ansible 的云服务模块、系统管理模块和应用部署模块构建完整链路。以下是基于阿里云的全流程实现方案,包含详细步骤与 Playbook 示例。
Ansible 实现云 ECS 创建 + Linux 初始化 + 应用部署全流程自动化
在云原生时代,“云服务器创建→系统初始化→应用部署” 的全流程自动化是提升运维效率的核心需求。传统手动操作不仅耗时(单节点部署需 30 + 分钟),还易因配置不一致导致线上问题。本文基于 Ansible 构建全流程自动化方案,以阿里云 ECS 为例,通过模块组合实现 “一键创建 ECS→标准化初始化 Linux→自动部署应用”,将部署时间压缩至 5 分钟内,且支持批量扩展。
全流程架构与核心模块
整个流程分为 3 个阶段,每个阶段通过 Ansible 模块实现自动化,最终形成闭环:
阶段 | 核心目标 | 依赖模块 | 输出结果 |
云 ECS 创建 | 自动创建指定配置的 ECS 实例,获取登录信息 | aliyun_ecs(阿里云 SDK)、add_host | 可用的 ECS 实例(公网 IP、登录凭证) |
Linux 系统初始化 | 标准化配置 ECS(时区、安全组、基础依赖等) | yum/apt、user、file、firewalld | 符合规范的 Linux 环境 |
应用部署 | 在初始化后的 ECS 上部署目标应用(以 Nginx 为例) | copy、template、service、docker_container | 可访问的应用服务 |
环境准备:
- 控制节点:安装 Ansible 2.14+、阿里云 SDK(pip install aliyun-python-sdk-core aliyun-python-sdk-ecs)
- 阿里云账号:需具备 ECS 创建权限,获取 AccessKey(AK/SK)并配置到控制节点
第一阶段:云 ECS 自动创建(基于阿里云)
通过aliyun_ecs模块创建 ECS 实例,支持自定义规格、镜像、网络等参数,创建后自动将实例添加到 Ansible Inventory,供后续步骤使用。
核心 Playbook:create_ecs.yml
- name: 自动创建阿里云ECS实例hosts: localhostgather_facts: novars:# 阿里云配置(建议通过Ansible Vault加密存储)aliyun_ak: "your_access_key"aliyun_sk: "your_secret_key"region: "cn-hangzhou" # 地域# ECS配置instance_name: "web-server-{{ ansible_date_time.date }}" # 实例名含日期instance_type: "ecs.t5-lc2m2.small" # 2核2G(入门级)image_id: "centos_7_9_64_20G_alibase_20240520.vhd" # CentOS 7.9镜像security_group_id: "sg-123456" # 开放80/22端口的安全组vswitch_id: "vsw-654321" # 私有网络交换机instance_password: "Ansible@123" # 登录密码(生产环境建议随机生成)# 实例数量(支持批量创建)instance_count: 1tasks:- name: 创建ECS实例aliyun_ecs:aliyun_access_key: "{{ aliyun_ak }}"aliyun_secret_key: "{{ aliyun_sk }}"region: "{{ region }}"instance_name: "{{ instance_name }}"instance_type: "{{ instance_type }}"image_id: "{{ image_id }}"security_group_id: "{{ security_group_id }}"vswitch_id: "{{ vswitch_id }}"instance_charge_type: "PostPaid" # 按量付费password: "{{ instance_password }}"instance_count: "{{ instance_count }}"state: presentregister: ecs_result # 保存ECS创建结果- name: 打印ECS实例信息debug:msg:- "实例ID: {{ ecs_result.instance_ids | first }}"- "公网IP: {{ ecs_result.instance_public_ips | first }}"- "登录用户: root"- "登录密码: {{ instance_password }}"- name: 将新创建的ECS添加到临时Inventory(组名:new_ecs)add_host:name: "{{ ecs_result.instance_public_ips | first }}" # 公网IP作为主机名groups: new_ecs # 加入组,供后续Playbook调用ansible_user: root # 登录用户ansible_password: "{{ instance_password }}" # 登录密码ansible_ssh_common_args: "-o StrictHostKeyChecking=no" # 跳过SSH密钥检查执行与验证
# 执行Playbookansible-playbook create_ecs.yml# 验证ECS是否添加到Inventoryansible new_ecs -m ping # 若返回pong,说明连接成功第二阶段:Linux 系统标准化初始化
对新创建的 ECS 进行初始化,包括时区配置、安全加固、基础依赖安装等,确保所有节点环境一致。
核心 Playbook:init_linux.yml
- name: Linux系统标准化初始化hosts: new_ecs # 目标为第一阶段创建的ECS组become: yes # 切换为root权限vars:# 自定义参数timezone: "Asia/Shanghai" # 时区app_user: "appuser" # 应用运行用户ssh_port: 22 # SSH端口(生产环境建议修改为非22)tasks:# 1. 配置时区- name: 设置系统时区为{{ timezone }}timezone:name: "{{ timezone }}"# 2. 关闭SELinux(避免权限问题)- name: 关闭SELinuxselinux:state: disabled# 3. 安装基础依赖(Python、Docker等)- name: 安装基础软件包yum:name:- python3- docker- firewalld- chrony # 时间同步state: present# 4. 启动并启用防火墙,开放必要端口- name: 配置防火墙firewalld:service: "{{ item }}"permanent: yesimmediate: yesstate: enabledloop:- ssh # SSH服务- http # 80端口(应用用)- https # 443端口(可选)# 5. 创建应用运行用户(非root,提升安全性)- name: 创建{{ app_user }}用户user:name: "{{ app_user }}"groups: docker # 加入docker组,可管理容器shell: /bin/bashcreatehome: yes# 6. 配置时间同步(避免节点时间不一致)- name: 启动chronyd服务service:name: chronydstate: startedenabled: yes# 7. 启动Docker服务- name: 启动Docker并设置开机自启systemd:name: dockerstate: startedenabled: yes执行与验证
# 执行初始化Playbookansible-playbook init_linux.yml# 验证初始化结果(示例:检查Docker是否启动)ansible new_ecs -a "systemctl status docker" --become第三阶段:应用自动化部署(以 Nginx 为例)
基于初始化后的 Linux 环境,通过 Docker 部署 Nginx,并配置自定义页面,实现应用快速上线。
核心 Playbook:deploy_nginx.yml
- name: 部署Nginx应用hosts: new_ecsbecome: yesvars:app_user: "appuser"nginx_port: 80 # 暴露端口# 应用目录app_dir: "/home/{{ app_user }}/nginx"tasks:# 1. 创建应用目录- name: 创建Nginx数据目录file:path: "{{ app_dir }}/html"state: directoryowner: "{{ app_user }}"group: "{{ app_user }}"mode: 0755# 2. 生成自定义首页(通过template模块)- name: 生成Nginx首页template:src: ./templates/index.html.j2 # 本地模板文件dest: "{{ app_dir }}/html/index.html"owner: "{{ app_user }}"mode: 0644# 3. 通过Docker部署Nginx- name: 启动Nginx容器docker_container:name: nginx-appimage: nginx:1.23 # 镜像版本固定,避免兼容性问题ports:- "{{ nginx_port }}:80" # 宿主机端口:容器端口volumes:- "{{ app_dir }}/html:/usr/share/nginx/html" # 挂载自定义页面restart_policy: always # 容器退出自动重启state: started# 4. 验证Nginx是否可访问- name: 检查Nginx首页响应uri:url: "http://localhost:{{ nginx_port }}"return_content: yesregister: nginx_response- name: 打印首页内容(验证部署成功)debug:msg: "Nginx首页内容: {{ nginx_response.content | truncate(50) }}"模板文件与执行
- 创建首页模板 templates/index.html.j2:
<!DOCTYPE html><html><head><title>Ansible Deployed Nginx</title></head><body><h1>Hello from {{ inventory_hostname }}!</h1> <!-- 引用ECS主机名 --><p>Deployed at: {{ ansible_date_time.iso8601 }}</p> <!-- 部署时间 --></body></html>- 执行部署并验证:
# 执行部署Playbookansible-playbook deploy_nginx.yml# 访问应用(替换为实际公网IP)curl http://<ecs_public_ip>:80全流程串联与批量扩展
通过 Ansible 的import_playbook功能,可将 3 个阶段的 Playbook 串联为一个总入口,实现 “一键全流程”:
总 Playbook:full_deploy.yml
- import_playbook: create_ecs.yml- import_playbook: init_linux.yml- import_playbook: deploy_nginx.yml执行总 Playbook 即可完成从 ECS 创建到应用部署的全自动化:
ansible-playbook full_deploy.yml批量扩展:修改create_ecs.yml中的instance_count参数(如instance_count: 3),即可同时创建 3 台 ECS 并完成批量部署,适合集群场景。
优化与生产环境适配
- 安全加固:
- 用ansible-vault加密 AK/SK、密码等敏感信息(ansible-vault encrypt vars.yml);
- 生产环境建议禁用密码登录,通过authorized_key模块配置 SSH 密钥认证。
- 错误处理:
- 各阶段添加failed_when条件判断(如 ECS 创建失败时终止流程);
- 关键步骤添加retries重试机制(如网络波动导致的包安装失败)。
- 多云适配:
- 替换aliyun_ecs为其他云厂商模块(如 AWS 的amazon.aws.ec2_instance),即可适配 AWS、腾讯云等环境。
总结
本方案通过 Ansible 模块的组合,将 “云资源创建→系统初始化→应用部署” 的手动流程转化为可复用、可版本控制的自动化代码,实现了以下价值:
- 效率提升:单节点部署时间从 30 分钟缩短至 5 分钟,批量部署效率线性提升;
- 一致性保障:所有节点配置完全标准化,避免 “机器个性” 导致的线上问题;
- 可扩展性:通过修改参数即可支持不同规格的 ECS 和应用,适配多环境需求。
后续可结合 CI/CD 工具(如 Jenkins)触发全流程 Playbook,实现 “代码提交→自动部署” 的完整 DevOps 链路。
