你还在为重复的服务器配置焦头烂额?还在手动部署应用到多台机器?本文将带你通过ansible-for-devops项目的实战案例,快速掌握Ansible自动化运维的核心技能,让你10分钟内写出第一个自动化剧本,30分钟完成多服务器部署。
读完本文你将学到:
- 用3行代码实现服务器时间同步自动化
- 5步完成LAMP架构一键部署
- 掌握零停机滚动更新的核心技巧
- 学会用Docker容器化应用的编排方法
Ansible自动化基础:从Hello World开始
Ansible是一款简单易用的自动化运维工具,通过SSH协议实现无代理节点管理。与其他工具相比,它具有学习曲线平缓、配置即代码、模块化设计三大优势。
你的第一个Ansible剧本
first-ansible-playbook/playbook.yml展示了最基础的自动化逻辑:安装并启动时间同步服务。这个仅22行的文件包含了Ansible的核心概念:
---
- hosts: all
become: yes
tasks:
- name: Ensure chrony (for time synchronization) is installed.
dnf:
name: chrony
state: present
- name: Ensure chrony is running.
service:
name: chronyd
state: started
enabled: yes
上述代码实现了两个关键操作:
- 使用
dnf模块安装chrony软件包 - 使用
service模块确保服务启动并设置开机自启
项目结构解析
ansible-for-devops项目采用场景化组织方式,每个目录对应特定应用场景:
ansible-for-devops/
├── first-ansible-playbook/ # 入门示例
├── lamp-infrastructure/ # LAMP架构部署
├── docker-flask/ # Docker容器应用
├── kubernetes/ # 容器编排
└── deployments-rolling/ # 零停机部署
完整的章节与示例对应关系可查看README.md,其中包含从基础到高级的16个实战场景。
实战场景一:LAMP架构自动化部署
LAMP(Linux+Apache+MySQL+PHP)是经典的Web应用架构。drupal/目录提供了完整的自动化部署方案,而includes/目录则展示了如何通过模块化设计优化复杂剧本。
核心实现逻辑
- 基础环境配置:更新系统、安装依赖包
- Apache配置:安装服务、配置虚拟主机
- 数据库配置:安全初始化、创建数据库
- PHP配置:安装模块、调整参数
- 应用部署:下载代码、配置站点
关键代码片段(来自includes/tasks/apache.yml):
- name: Install Apache.
yum:
name: httpd
state: present
- name: Copy application Apache configuration.
template:
src: app.test.conf.j2
dest: /etc/httpd/conf.d/app.test.conf
mode: 0644
notify: restart apache
- name: Ensure Apache is running and enabled.
service:
name: httpd
state: started
enabled: yes
执行流程
实战场景二:Docker容器化应用编排
随着容器技术普及,docker-flask/目录展示了如何用Ansible编排Docker容器,实现应用的隔离部署。该场景包含三个容器:
- Web容器:运行Flask应用
- DB容器:MySQL数据库
- Data容器:持久化存储
容器编排代码
docker-flask/provisioning/docker.yml实现了容器的创建与关联:
- name: Ensure Docker Compose services are running.
docker_compose:
project_src: /opt/flask-app
state: present
pull: yes
register: docker_output
- name: Show Docker Compose output.
debug:
var: docker_output
多容器关系图
实战场景三:零停机滚动更新
在生产环境中,服务可用性至关重要。deployments-rolling/目录展示了如何实现零停机部署,核心思路是分批更新与流量控制。
实现原理
- 从负载均衡器移除部分节点
- 更新这些节点上的应用版本
- 验证更新后重新加入集群
- 对剩余节点重复上述过程
关键配置(来自deployments-rolling/playbooks/deploy.yml):
- name: Deploy application to web servers.
hosts: webservers
serial: 1 # 每次更新1个节点
become: yes
tasks:
- name: Remove node from load balancer
command: haproxyctl node disable {{ inventory_hostname }}
delegate_to: loadbalancer
- name: Update application code
git:
repo: https://git.example.com/app.git
dest: /var/www/app
version: "{{ app_version }}"
- name: Restart application service
service:
name: app
state: restarted
- name: Add node back to load balancer
command: haproxyctl node enable {{ inventory_hostname }}
delegate_to: loadbalancer
滚动更新时序图
进阶技巧:角色与Galaxy生态
Ansible Galaxy是社区贡献的角色仓库,galaxy-role-servers/目录展示了如何利用社区角色快速构建基础设施。例如,使用geerlingguy.java和geerlingguy.jenkins角色,仅需几行代码即可部署Jenkins CI服务器:
- hosts: jenkins
become: yes
roles:
- geerlingguy.java
- geerlingguy.jenkins
常用Galaxy角色推荐
| 角色名 | 功能 | 应用场景 |
|---|---|---|
| geerlingguy.docker | Docker安装配置 | 容器环境 |
| geerlingguy.mysql | MySQL数据库管理 | 数据库部署 |
| geerlingguy.nodejs | Node.js环境配置 | JavaScript应用 |
| geerlingguy.security | 系统安全加固 | 生产环境 |
企业级实践:动态 inventory 与多云管理
在复杂环境中,dynamic-inventory/目录提供了云环境动态 inventory 解决方案。通过脚本从云平台API获取主机信息,实现弹性环境的自动化管理。
云服务动态inventory示例
dynamic-inventory/cloud/cloud.py脚本可自动发现云主机:
#!/usr/bin/env python
import os
import sys
import json
from cloud_sdk.manager import CloudManager
# 读取API凭证
api_token = os.environ.get('CLOUD_API_TOKEN')
manager = CloudManager(None, api_token, api_version=2)
# 获取所有云实例
instances = manager.all_active_instances()
# 构建inventory结构
inventory = {
'all': {
'hosts': [i['name'] for i in instances]
},
'cloud_instances': {
'hosts': [i['name'] for i in instances]
}
}
# 输出inventory
print(json.dumps(inventory))
多云管理架构
持续集成与测试
tests/目录包含完整的测试脚本,结合.github/workflows/molecule-ci.yml实现自动化测试。molecule/目录展示了如何用Molecule工具进行剧本测试,确保代码质量。
测试流程:
- 语法检查:验证YAML格式和Ansible语法
- 单元测试:测试单个任务和角色
- 集成测试:在隔离环境中部署完整架构
- 验证测试:检查服务可用性和功能正确性
学习资源与进阶路径
官方文档与示例
进阶学习路径
- 基础阶段:完成first-ansible-playbook/和nodejs/示例
- 中级阶段:掌握docker-flask/和lamp-infrastructure/
- 高级阶段:研究kubernetes/和dynamic-inventory/
常见问题解决
- 连接问题:检查SSH配置和防火墙规则
- 权限问题:确保become参数正确设置
- 依赖问题:使用requirements.yml管理角色依赖
- 调试技巧:使用
-v参数增加输出详细度,利用debug模块打印变量
总结与展望
Ansible通过简单易用的剧本语法和丰富的模块生态,降低了自动化运维的门槛。ansible-for-devops项目提供的16个实战场景,覆盖了从基础配置到容器编排、从单节点部署到多云管理的全流程。
随着云原生技术发展,Ansible与容器编排工具的结合将成为新趋势。kubernetes/目录中的示例展示了如何用Ansible管理K8s资源,为未来自动化运维指明了方向。
立即克隆项目开始实践:
git clone https://link.gitcode.com/i/c62df3e1f8f6835c13bb68f99871ca2a
cd ansible-for-devops/first-ansible-playbook
vagrant up
ansible-playbook playbook.yml
通过持续实践这些示例,你将逐步掌握自动化运维的核心技能,从重复劳动中解放出来,专注于更有价值的架构设计和优化工作。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



