Operations 11 min read

Build an Enterprise‑Grade Automated Deployment Pipeline with Ansible from Scratch

Learn how to create a complete, enterprise‑level automated deployment pipeline using Ansible, covering architecture design, inventory setup, role implementation, rolling and blue‑green deployments, rollback mechanisms, performance optimizations, monitoring integration, and best‑practice recommendations, all illustrated with real‑world code examples.

MaGe Linux Operations
MaGe Linux Operations
MaGe Linux Operations
Build an Enterprise‑Grade Automated Deployment Pipeline with Ansible from Scratch

🚀 From Zero to One: Building an Enterprise‑Level Automated Deployment Pipeline with Ansible

In the DevOps wave, automated deployment has become a must‑have skill for every operations engineer. Today I share a full‑stack Ansible code‑deployment project that can boost your deployment efficiency tenfold!

💡 Why Choose Ansible?

Ansible stands out among automation tools thanks to its agentless architecture , easy learning curve , and powerful capabilities :

No client installation : manage all servers via SSH only.

YAML syntax : human‑readable configuration files that enhance team collaboration.

Idempotency : repeated runs produce consistent results, avoiding duplicate‑operation issues.

Rich modules : over 2000 built‑in modules covering 99% of operations scenarios.

🏗️ Project Architecture Design

We will build a complete web‑application deployment pipeline:

项目结构
├── inventories/          # 环境清单
│   ├── dev/
│   ├── staging/
│   └── production/
├── group_vars/           # 组变量
├── roles/                # 角色目录
│   ├── common/           # 基础环境
│   ├── nginx/            # Web服务器
│   ├── app/              # 应用部署
│   └── monitoring/       # 监控配置
├── playbooks/            # 剧本文件
└── deploy.yml            # 主部署文件

🔧 Core Component Implementation

1. Environment Inventory Configuration

inventories/production/hosts.yml

all:
  children:
    webservers:
      hosts:
        web-01:
          ansible_host: 10.0.1.10
        web-02:
          ansible_host: 10.0.1.11
    databases:
      hosts:
        db-01:
          ansible_host: 10.0.2.10
    loadbalancers:
      hosts:
        lb-01:
          ansible_host: 10.0.3.10

2. Application Deployment Role

roles/app/tasks/main.yml

---
- name: "创建应用目录"
  file:
    path: "{{ app_path }}"
    state: directory
    owner: "{{ app_user }}"
    group: "{{ app_group }}"
    mode: '0755'

- name: "从Git仓库拉取代码"
  git:
    repo: "{{ git_repo }}"
    dest: "{{ app_path }}/releases/{{ deployment_id }}"
    version: "{{ git_branch | default('main') }}"
    force: yes
  register: git_result

- name: "安装依赖包"
  pip:
    requirements: "{{ app_path }}/releases/{{ deployment_id }}/requirements.txt"
    virtualenv: "{{ app_path }}/venv"
    virtualenv_python: python3
  when: git_result.changed

- name: "配置应用参数"
  template:
    src: config.j2
    dest: "{{ app_path }}/releases/{{ deployment_id }}/config.py"
    backup: yes
  notify: restart application

- name: "创建软链接"
  file:
    src: "{{ app_path }}/releases/{{ deployment_id }}"
    dest: "{{ app_path }}/current"
    state: link
    force: yes
  notify: restart application

3. Rolling Deployment Strategy

playbooks/rolling_deploy.yml

---
- name: "滚动部署应用"
  hosts: webservers
  serial: 1  # 一台一台部署
  max_fail_percentage: 0

  pre_tasks:
    - name: "从负载均衡器移除节点"
      uri:
        url: "http://{{ lb_host }}/remove/{{ inventory_hostname }}"
        method: POST
      delegate_to: localhost

    - name: "等待连接断开"
      wait_for:
        port: 80
        state: stopped
        timeout: 60

  tasks:
    - name: "部署应用"
      include_role:
        name: app

    - name: "健康检查"
      uri:
        url: "http://{{ inventory_hostname }}/health"
        method: GET
        status_code: 200
        retries: 10
        delay: 5

  post_tasks:
    - name: "添加节点到负载均衡器"
      uri:
        url: "http://{{ lb_host }}/add/{{ inventory_hostname }}"
        method: POST
      delegate_to: localhost

4. Rollback Mechanism

roles/app/tasks/rollback.yml

---
- name: "获取历史版本列表"
  find:
    paths: "{{ app_path }}/releases"
    file_type: directory
  register: releases

- name: "排序版本并获取上一版本"
  set_fact:
    previous_release: "{{ (releases.files | sort(attribute='mtime', reverse=true))[1].path | basename }}"
  when: releases.files | length > 1

- name: "回滚到上一版本"
  file:
    src: "{{ app_path }}/releases/{{ previous_release }}"
    dest: "{{ app_path }}/current"
    state: link
    force: yes
  when: previous_release is defined
  notify: restart application

🎯 Advanced Feature Implementation

1. Blue‑Green Deployment

- name: "蓝绿部署切换"
  block:
    - name: "部署到绿色环境"
      include_role:
        name: app
      vars:
        app_env: green

    - name: "验证绿色环境"
      uri:
        url: "http://{{ inventory_hostname }}:{{ green_port }}/health"
        status_code: 200

    - name: "切换流量到绿色环境"
      replace:
        path: /etc/nginx/sites-enabled/app.conf
        regexp: 'proxy_pass http://blue'
        replace: 'proxy_pass http://green'
      notify: reload nginx

  rescue:
    - name: "部署失败,保持蓝色环境"
      debug:
        msg: "部署失败,自动保持当前蓝色环境运行"

2. Configuration Management & Vault

group_vars/all/vault.yml (encrypted with ansible‑vault)

$ANSIBLE_VAULT;1.1;AES256
66386439653765386464626463653765346464...

Decrypt with:

ansible-playbook deploy.yml --ask-vault-pass

3. Monitoring Integration

roles/monitoring/tasks/main.yml

- name: "部署Prometheus监控配置"
  template:
    src: prometheus.yml.j2
    dest: /etc/prometheus/targets/{{ inventory_hostname }}.yml
  delegate_to: "{{ monitoring_server }}"
  notify: reload prometheus

- name: "发送部署通知到Slack"
  uri:
    url: "{{ slack_webhook_url }}"
    method: POST
    body_format: json
    body:
      text: "🚀 {{ inventory_hostname }} 部署完成 - 版本: {{ git_branch }}"
  delegate_to: localhost

📊 Performance Optimization Tips

1. Parallel Execution Optimization

- name: "并行安装软件包"
  package:
    name: "{{ item }}"
    state: present
  loop: "{{ packages }}"
  async: 300  # 5分钟超时
  poll: 0
  register: package_install

- name: "等待所有包安装完成"
  async_status:
    jid: "{{ item.ansible_job_id }}"
  loop: "{{ package_install.results }}"
  register: job_result
  until: job_result.finished
  retries: 30

2. Conditional Execution to Reduce Unnecessary Operations

- name: "检查应用是否需要更新"
  stat:
    path: "{{ app_path }}/current"
  register: current_version

- name: "部署新版本"
  include_tasks: deploy.yml
  when: not current_version.stat.exists or git_result.after != current_version.stat.lnk_target | basename

🔍 Fault Diagnosis & Debugging

1. Enable Debug Mode

# Detailed output
ansible-playbook deploy.yml -vvv

# Check mode (no actual execution)
ansible-playbook deploy.yml --check --diff

# Step‑by‑step execution
ansible-playbook deploy.yml --step

2. Log Recording Configuration

- name: "记录部署日志"
  lineinfile:
    path: /var/log/deployment.log
    line: "{{ ansible_date_time.iso8601 }} - {{ inventory_hostname }} - {{ deploy_action }}"
    create: yes

🚀 One‑Click Deployment Script

deploy.sh

#!/bin/bash
set -e

ENVIRONMENT=${1:-staging}
BRANCH=${2:-main}
DEPLOYMENT_ID=$(date +%Y%m%d_%H%M%S)

echo "🚀 开始部署到 $ENVIRONMENT 环境"
echo "📦 分支: $BRANCH"
echo "🆔 部署ID: $DEPLOYMENT_ID"

# Pre‑check
ansible-playbook -i inventories/$ENVIRONMENT playbooks/precheck.yml

# Execute deployment
ansible-playbook -i inventories/$ENVIRONMENT deploy.yml \
  -e "git_branch=$BRANCH" \
  -e "deployment_id=$DEPLOYMENT_ID" \
  --vault-password-file .vault_pass

# Post‑deployment verification
ansible-playbook -i inventories/$ENVIRONMENT playbooks/verify.yml

echo "✅ 部署完成!"

📈 Best‑Practice Summary

Version Management : keep all Ansible code under Git.

Environment Isolation : use separate configuration files for each environment.

Key Management : encrypt sensitive data with ansible‑vault.

Idempotency : ensure repeated runs produce the same result.

Error Handling : add rescue blocks for critical tasks.

Monitoring & Alerts : integrate monitoring systems to detect issues early.

Documentation : maintain detailed operational documentation.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

ci/cdInfrastructure as CodeAnsible
MaGe Linux Operations
Written by

MaGe Linux Operations

Founded in 2009, MaGe Education is a top Chinese high‑end IT training brand. Its graduates earn 12K+ RMB salaries, and the school has trained tens of thousands of students. It offers high‑pay courses in Linux cloud operations, Python full‑stack, automation, data analysis, AI, and Go high‑concurrency architecture. Thanks to quality courses and a solid reputation, it has talent partnerships with numerous internet firms.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.