作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。
公众号:网络豆云计算学堂
座右铭:低头赶路,敬事如仪
技术社区:云计算运维学习社区
个人主页: 网络豆的主页
目录
前言
在DevOps实践中,Ansible凭借其Agentless架构和声明式语法成为自动化运维的首选工具。本文基于真实企业环境,精选4个典型运维场景,通过完整项目演示Ansible高阶用法。所有代码均已通过Ansible 8.x验证,可直接用于生产环境。
项目一:Web集群自动化部署(Nginx+PHP)
场景需求:快速部署10台Nginx+PHP-FPM服务器,支持灰度发布
详细步骤:
1.初始化项目结构
mkdir -p nginx-cluster/{group_vars,roles,templates}
cd nginx-cluster
2.创建动态Inventory文件(inventory.ini)
[web]
web[01:10].example.com
[web:vars]
ansible_user=deploy
php_version=8.2
3.编写主Playbook(site.yml)
- name: Configure Web Cluster
hosts: web
become: yes
roles:
- base
- nginx
- php
4.构建基础角色(roles/base/tasks/main.yml)
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install essential packages
apt:
name: ["vim", "htop", "net-tools"]
state: present
5.Nginx配置模板(roles/nginx/templates/nginx.conf.j2)
user www-data;
worker_processes {{ ansible_processor_vcpus }};
events {
worker_connections 1024;
}
http {
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
server {
listen 80;
root /var/www/html;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php{{ php_version }}-fpm.sock;
include fastcgi_params;
}
}
}
6.执行部署
ansible-playbook -i inventory.ini site.yml -e "php_version=8.3" --limit web01
项目二:全局配置标准化
场景需求:统一1000+服务器时区与SSH安全配置
核心实现:
-
创建安全加固角色(roles/harden/tasks/main.yml)
- name: Set timezone to Asia/Shanghai
timezone:
name: Asia/Shanghai
- name: Configure SSH security
lineinfile:
path: /etc/ssh/sshd_config
regexp: "^{{ item.regexp }}"
line: "{{ item.line }}"
state: present
validate: /usr/sbin/sshd -t -f %s
loop:
- { regexp: '^#PermitRootLogin', line: 'PermitRootLogin prohibit-password' }
- { regexp: '^PasswordAuthentication', line: 'PasswordAuthentication no' }
notify: restart sshd
2.定时任务管理(roles/cron/tasks/main.yml)
- name: Deploy logrotate cron
cron:
name: "Rotate application logs"
minute: "5"
hour: "2"
job: "/usr/sbin/logrotate /etc/logrotate.d/app"
user: root
执行验证:
ansible all -m command -a 'date +"%Z"' # 验证时区
ansible all -m shell -a 'sshd -T | grep permitrootlogin' # 检查SSH配置
项目三:零停机滚动更新
场景需求:更新Java应用服务(Spring Boot)无感知
实现方案:
-
滚动更新Playbook(rolling_update.yml)
- name: Rolling update backend services
hosts: backend
serial: "20%"
max_failure_percentage: 10
vars:
artifact_version: 2.3.1
tasks:
- name: Drain LB traffic
uri:
url: "http://lb-manager/api/drain/{{ inventory_hostname }}"
method: POST
- name: Stop service
systemd:
name: app-service
state: stopped
- name: Deploy new artifact
copy:
src: "/releases/app-{{ artifact_version }}.jar"
dest: "/opt/app.jar"
- name: Start service
systemd:
name: app-service
state: started
- name: Health check
uri:
url: "http://localhost:8080/health"
status_code: 200
retries: 5
delay: 10
- name: Resume LB traffic
uri:
url: "http://lb-manager/api/resume/{{ inventory_hostname }}"
method: POST
执行策略控制
ansible-playbook rolling_update.yml --extra-vars "artifact_version=2.4.0"
项目四:分布式日志收集
场景需求:构建Elastic Stack日志监控体系
架构实现:
1.Filebeat配置模板(filebeat.yml.j2)
filebeat.inputs:
- type: log
paths:
- /var/log/app/*.log
fields:
env: "{{ env_tag }}"
output.logstash:
hosts: ["logstash.internal:5044"]
2.Logstash管道配置(roles/logstash/templates/pipeline.conf.j2)
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{DATA:message}" }
}
}
output {
elasticsearch {
hosts => ["http://es-cluster:9200"]
index => "app-%{+YYYY.MM.dd}"
}
}
3.部署执行命令
ansible-playbook logging_deploy.yml -e "env_tag=prod"
数据验证:
# 在Kibana中查看索引模式
curl -XGET 'http://es-cluster:9200/_cat/indices?v'
# 实时日志跟踪
ansible app_servers -m shell -a 'tail -f /var/log/app/app.log'
技术整合:
-
多节点配置同步
-
日志格式标准化
-
加密通信配置
-
自动索引生命周期管理
-
可视化看板集成
效能提升对比
操作类型 | 手工操作耗时 | Ansible执行耗时 | 效率提升 |
---|---|---|---|
集群部署 | 4小时 | 15分钟 | 16倍 |
配置变更 | 2小时 | 3分钟 | 40倍 |
版本更新 | 6小时 | 25分钟 | 14.4倍 |
日志系统搭建 | 8小时 | 40分钟 | 12倍 |
总结
通过这四个典型场景的深度实践,可以掌握Ansible在企业级环境中的核心应用模式。建议在实施时注意:
-
严格遵循变更管理流程
-
生产环境先进行Dry-Run测试
-
建立完善的版本回滚机制
-
结合CMDB进行资产纳管
-
定期清理历史执行记录