为了实现 "云 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: localhost
gather_facts: no
vars:
# 阿里云配置(建议通过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: 1
tasks:
- 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: present
register: 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密钥检查
执行与验证
# 执行Playbook
ansible-playbook create_ecs.yml
# 验证ECS是否添加到Inventory
ansible 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: 关闭SELinux
selinux:
state: disabled
# 3. 安装基础依赖(Python、Docker等)
- name: 安装基础软件包
yum:
name:
- python3
- docker
- firewalld
- chrony # 时间同步
state: present
# 4. 启动并启用防火墙,开放必要端口
- name: 配置防火墙
firewalld:
service: "{{ item }}"
permanent: yes
immediate: yes
state: enabled
loop:
- ssh # SSH服务
- http # 80端口(应用用)
- https # 443端口(可选)
# 5. 创建应用运行用户(非root,提升安全性)
- name: 创建{{ app_user }}用户
user:
name: "{{ app_user }}"
groups: docker # 加入docker组,可管理容器
shell: /bin/bash
createhome: yes
# 6. 配置时间同步(避免节点时间不一致)
- name: 启动chronyd服务
service:
name: chronyd
state: started
enabled: yes
# 7. 启动Docker服务
- name: 启动Docker并设置开机自启
systemd:
name: docker
state: started
enabled: yes
执行与验证
# 执行初始化Playbook
ansible-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_ecs
become: yes
vars:
app_user: "appuser"
nginx_port: 80 # 暴露端口
# 应用目录
app_dir: "/home/{{ app_user }}/nginx"
tasks:
# 1. 创建应用目录
- name: 创建Nginx数据目录
file:
path: "{{ app_dir }}/html"
state: directory
owner: "{{ 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-app
image: 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: yes
register: 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>
- 执行部署并验证:
# 执行部署Playbook
ansible-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 链路。