凌晨3点,又一台服务器宕机了——这次,我们用Ansible彻底告别手工部署的噩梦
你是否也经历过这样的绝望时刻:刚刚熬夜部署完50台服务器的Nginx配置,第二天老板突然要求全部重新调整负载均衡策略?当你盯着密密麻麻的服务器列表,手指悬在键盘上却不知从何下手时,内心是不是在咆哮:“为什么我要重复这该死的工作一千遍!” 如果你曾在深夜对着Linux终端痛哭流涕,那么恭喜你——今天这篇文章将彻底改变你的运维人生。
记得我的前技术总监曾经说过一句话:“真正的高手,从来不做重复的事情第二遍。” 当时年轻气盛的我还不以为然,直到某个项目需要在72小时内部署200台Nginx反向代理服务器时,我才真正理解了这句话的分量。那是一个让人永生难忘的周末——团队5个人轮班作战,每个人负责40台服务器的手工配置,期间各种配置不一致、版本冲突、人为错误层出不穷…
从地狱到天堂:Ansible拯救运维生涯的神奇之旅
什么是Ansible?为什么它能成为运维界的"救世主"
简单来说,Ansible就像是给你配了一个超级智能的助手,你只需要告诉它"我要在这100台服务器上部署Nginx,配置反向代理到后端服务器群",然后喝杯咖啡的时间,所有工作就自动完成了。
Ansible的核心优势可以用一个词概括:幂等性。这意味着无论你执行多少次相同的操作,结果都是一致的。就像你告诉朋友"把灯打开",不管说几遍,灯都只会是开着的状态——不会因为重复执行而出现异常。
环境准备:让我们从零开始搭建Ansible控制中心
首先,我们需要准备一台控制机器(Control Node)和若干台目标服务器(Managed Nodes)。控制机器就像是指挥部,负责向各个服务器下达指令。
控制机器环境配置:
# CentOS/RHEL系统
sudo yum install epel-release -y
sudo yum install ansible -y
# Ubuntu/Debian系统
sudo apt update
sudo apt install ansible -y
# 验证安装
ansible --version
安装完成后,你会看到类似这样的输出:
ansible [core 2.12.1]
config file = /etc/ansible/ansible.cfg
configured module search path = ['/home/user/.ansible/plugins/modules']
ansible python module location = /usr/lib/python3/dist-packages/ansible
配置SSH免密登录:
这是一个关键步骤,很多新手在这里栽跟头。我们需要让控制机器能够无密码登录到所有目标服务器。
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096 -C "ansible@control"
# 将公钥复制到目标服务器
ssh-copy-id root@192.168.1.10
ssh-copy-id root@192.168.1.11
ssh-copy-id root@192.168.1.12
# 测试连接
ssh root@192.168.1.10 "echo 'SSH连接成功'"
编写你的第一个Inventory文件:服务器军团的花名册
Inventory文件就像是一本通讯录,告诉Ansible哪些服务器需要管理。创建/etc/ansible/hosts
文件:
[webservers]
web01 ansible_host=192.168.1.10 ansible_user=root
web02 ansible_host=192.168.1.11 ansible_user=root
web03 ansible_host=192.168.1.12 ansible_user=root
[loadbalancers]
lb01 ansible_host=192.168.1.20 ansible_user=root
lb02 ansible_host=192.168.1.21 ansible_user=root
[nginx:children]
webservers
loadbalancers
[all:vars]
ansible_ssh_private_key_file=/root/.ssh/id_rsa
测试连通性:
# 测试所有服务器连接
ansible all -m ping
# 预期输出类似:
# web01 | SUCCESS => {
# "changed": false,
# "ping": "pong"
# }
核心战斗:编写Nginx部署Playbook
Playbook基础结构:自动化的"剧本"
Playbook就像是一个详细的操作手册,告诉Ansible需要执行哪些任务,按什么顺序执行。让我们创建一个名为nginx-deploy.yml
的文件:
---
- name: 部署和配置Nginx反向代理服务器
hosts: nginx
become: yes
vars:
nginx_version: "1.20.1"
backend_servers:
- {
name: "app1", ip: "192.168.1.100", port: "8080" }
- {
name: "app2", ip: "192.168.1.101", port: "8080" }
- {
name: "app3", ip: "192.168.1.102", port: "8080" }
tasks:
- name: 更新系统包缓存
yum: