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: 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) }}"

模板文件与执行

  1. 创建首页模板 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>
  1. 执行部署并验证:
复制代码
复制代码
# 执行部署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 并完成批量部署,适合集群场景。

优化与生产环境适配

  1. 安全加固
    • 用ansible-vault加密 AK/SK、密码等敏感信息(ansible-vault encrypt vars.yml);
    • 生产环境建议禁用密码登录,通过authorized_key模块配置 SSH 密钥认证。
  1. 错误处理
    • 各阶段添加failed_when条件判断(如 ECS 创建失败时终止流程);
    • 关键步骤添加retries重试机制(如网络波动导致的包安装失败)。
  1. 多云适配
    • 替换aliyun_ecs为其他云厂商模块(如 AWS 的amazon.aws.ec2_instance),即可适配 AWS、腾讯云等环境。

总结

本方案通过 Ansible 模块的组合,将 "云资源创建→系统初始化→应用部署" 的手动流程转化为可复用、可版本控制的自动化代码,实现了以下价值:

  • 效率提升:单节点部署时间从 30 分钟缩短至 5 分钟,批量部署效率线性提升;
  • 一致性保障:所有节点配置完全标准化,避免 "机器个性" 导致的线上问题;
  • 可扩展性:通过修改参数即可支持不同规格的 ECS 和应用,适配多环境需求。

后续可结合 CI/CD 工具(如 Jenkins)触发全流程 Playbook,实现 "代码提交→自动部署" 的完整 DevOps 链路。

相关推荐
zz-zjx4 小时前
生产级 Ansible 部署全流程-nginx示例
ansible
初学者_xuan8 小时前
零基础新手小白快速了解掌握服务集群与自动化运维(十六)集群部署模块——Keepalived双机热备
运维·自动化·github
半梦半醒*9 小时前
k8s——资源管理
linux·运维·docker·容器·kubernetes·自动化
小白学大数据10 小时前
Python爬虫定时任务:自动化抓取豆瓣每日最新短评
爬虫·python·自动化
首发运维11 小时前
certbot+shell+阿里云api+k8s实现自动化更新SSL证书
阿里云·kubernetes·自动化
运维李哥不背锅14 小时前
Ansible 的变量与模板:实现更灵活的自动化配置
java·自动化·ansible
运维李哥不背锅14 小时前
Ansible 的条件语句与循环详解
数据库·ansible
宁&沉沦15 小时前
Nginx清除浏览器缓存的三个缓存响应头的关系详解
运维·nginx·缓存
yzhSWJ19 小时前
直接使用docker中的nginx
nginx·docker·eureka