从零开始Ansible入门:一个"遥控器"搞定100台服务器(小白也能看懂)
前言
想象一下这个场景:你是一家公司的运维,手上有100台服务器,老板让你在每台机器上都装上Nginx。传统做法是什么?一台一台登录上去,敲命令、等安装、再敲下一台……运气好一天能搞完,运气不好中间出点错,可能得加班到半夜。
但如果有一个"遥控器",你按一下按钮,100台机器同时开始装Nginx,你会怎么选?
Ansible就是那个遥控器。
今天这篇文章,我就带大家从零开始,把Ansible这个"遥控器"彻底搞明白。全文都是大白话,不需要你有运维基础,跟着做就行。
一、Ansible到底是什么?
Ansible是一个开源的自动化运维工具,专门用来做配置管理、应用部署和任务自动化。
你只需要在一台电脑(叫"控制节点")上安装Ansible,然后通过SSH就能指挥所有其他服务器(叫"受控节点")干活。
Ansible最大的王牌优点:受控节点上不需要安装任何额外软件。只要能SSH连上,就能管。这就意味着你不用去每台机器上装Agent(代理程序),省去了大量前期准备工作。
一句话总结:Ansible = 一个通过SSH遥控多台服务器的自动化工具。
二、Ansible到底能干什么?——解决运维的5大"手酸"场景
很多小白以为Ansible只能装软件,那就大材小用了。在日常工作中,它主要帮你干掉下面这5类让人"手酸"的重复劳动:
场景1:系统环境标准化(再也不用"我这跑得好好的啊")
开发、测试、生产环境总是不一致?用Ansible写一个"系统初始化剧本",一键让所有机器的时区、DNS、内核参数、防火墙规则、Java环境统统变成一模一样的。彻底杜绝"环境不一致"导致的奇葩Bug。
场景2:应用一键部署(告别手动上传压缩包)
无论是Java的jar包、Python的Flask应用,还是前端静态资源,Ansible都能做到:从Git拉取代码 → 编译打包 → 分发到所有服务器 → 平滑重启服务。把发版时间从半小时缩短到1分钟。
场景3:批量系统维护(老板再也不用担心我加班)
紧急漏洞爆发?一条命令给100台机器打补丁。
日志把磁盘写满了?一条命令批量清理3天前的日志。
需要新开账号?一条命令给所有机器创建deploy用户并配置SSH密钥。
场景4:配置漂移修复(服务器的"后悔药")
如果有人在线上机器胡乱改了什么配置,Ansible可以设定"定期执行剧本"。它会自动检查当前配置是否和剧本定义的一致,如果不一致,自动改回来。保证服务器永远处于"理想状态"。
场景5:云主机动态扩容
结合AWS、阿里云、腾讯云的API,当流量暴增时,Ansible可以自动创建云主机→ 自动加入负载均衡 → 自动部署好应用,全程无需人工介入。ansible架构图如图:
三、安装Ansible——3种方式任选
Ansible的安装非常简单,根据你的操作系统选择对应的命令即可。
🐧 方式一:CentOS / RHEL 系统
CentOS 7默认仓库没有Ansible,需要先添加EPEL源:
bash
# CentOS 7 sudo yum install epel-release -y sudo yum install ansible -y
CentOS 9及以上推荐使用dnf:
bash
# CentOS 9+ sudo dnf install epel-release -y sudo dnf install ansible -y
🐧 方式二:Ubuntu / Debian 系统
bash
sudo apt update sudo apt install ansible -y
🐍 方式三:使用pip安装(通用,推荐Python开发者)
bash
pip install ansible
✅ 验证安装是否成功
安装完成后,运行以下命令查看版本信息:
bash
ansible --version
如果能看到版本号输出(比如ansible 2.9.27),说明安装成功了!
四、核心概念——先记住这4个词
在开始使用之前,先理解Ansible的4个核心概念,后面实战就靠它们:
| 概念 | 大白话解释 |
|---|---|
| 控制节点 | 安装Ansible的那台电脑,你是"指挥官" |
| 受控节点 | 被管理的服务器,啥都不用装,能SSH就行 |
| Inventory(清单) | 记录所有受控节点IP和分组的"花名册" |
| 模块(Module) | Ansible的"工具箱",每个工具干一件具体的事 |
| Playbook(剧本) | 把多个任务写成一个YAML文件,一键执行 |
五、Ansible项目的"全家桶"——各个文件到底是干嘛的?(⭐重点)
很多新手刚接触Ansible时,看到一堆文件和文件夹就懵了。别慌,这里帮你把最核心、最常见的8个文件/目录一次性搞清楚。
我们先看一个标准的Ansible项目目录结构长什么样:
text
my-ansible-project/ # 你的项目文件夹 ├── ansible.cfg # ① 主配置文件(Ansible的"系统设置") ├── inventory.ini # ② 主机清单文件(你的"服务器通讯录") ├── deploy-nginx.yml # ③ Playbook剧本(核心"执行脚本") ├── nginx.conf # ④ 普通静态配置文件 ├── templates/ # ⑤ 模板文件夹(动态配置) │ └── nginx.conf.j2 └── roles/ # ⑥ 角色文件夹("乐高积木块",高级玩法) └── nginx/ ├── tasks/ │ └── main.yml # ⑦ 任务列表(具体要干的事) ├── handlers/ │ └── main.yml # ⑧ 触发器(发生变化时重启/重载服务) └── vars/ └── main.yml # ⑨ 变量文件(可变的参数)
下面逐一解读(小白请重点看前4个,后面4个先了解即可):
| 文件/文件夹 | 大白话解释 | 核心作用 |
|---|---|---|
①ansible.cfg | Ansible软件的"个性化设置" | 定义SSH超时时间、是否记录日志、是否开启主机密钥检查等。一般放项目根目录,不配置就使用系统默认的/etc/ansible/ansible.cfg。 |
②inventory.ini | 你的"服务器花名册" | 明确告诉Ansible:去管哪些IP?哪些是Web组?哪些是DB组?是否需要用普通用户sudo提权? |
③xxx.yml(Playbook) | 最重要的"总导演剧本" | 这是你写的YAML文件(比如deploy-nginx.yml)。它定义了"在哪台机器上(hosts)"、"以什么身份(become)"、"依次执行哪几个任务(tasks)"。你平时写得最多的就是这个。 |
④ 普通配置文件(如nginx.conf) | 直接"复制粘贴"的固定内容 | 这些文件不需要修改,Ansible直接原封不动地拷贝到远程服务器的指定目录。适用于所有机器都一样的配置。 |
⑤templates/文件夹 | 带"填空"功能的配置文件 | 里面的文件后缀一般是.j2(Jinja2模板)。它和普通文件不同的是,它包含变量(比如CPU核心数={{ ansible_processor_cores }})。8G内存的机器拿到模板自动填8G,16G的机器填16G。一份模板,适配不同硬件。 |
⑥roles/文件夹 | 专业的"乐高积木块" | 当你的Playbook越来越长(超过200行),就把不同功能拆分成"角色"。比如roles/nginx/专门管Nginx,roles/mysql/专门管MySQL。这是大项目、团队协作的标准写法。 |
⑦tasks/main.yml | 角色里的"干活清单" | 写在角色里具体要执行的任务序列(安装、启动等)。 |
⑧handlers/main.yml | 角色里的"警报器/触发器" | 只有当任务真的改变了系统状态(比如修改了配置文件),才会触发这里。最常见的用途:配置文件变了,自动重启Nginx。避免每次执行剧本都无故重启服务。 |
⑨vars/main.yml | 角色里的"参数配置页" | 把端口号、路径、用户名这些变化的东西抽离出来放在这里,将来修改时就不用去翻冗长的tasks文件了。 |
小白速记口诀:
ansible.cfg管设置,inventory管机器,Playbook(.yml)管流程,templates做动态配置,roles是大积木,handlers出事后重启。
六、第一步实战:配置Inventory清单文件
Inventory文件就是你的"服务器通讯录",告诉Ansible要去管哪些机器。
默认情况下,Inventory文件位于/etc/ansible/hosts。但我们更推荐在项目目录下自己创建一个inventory.ini,方便管理。
基础写法
ini
[webservers] 192.168.1.10 192.168.1.11 192.168.1.12 [databases] 192.168.1.20 192.168.1.21
上面定义了两个组:webservers(3台Web服务器)和databases(2台数据库服务器)。
进阶写法(带连接参数)
ini
[webservers] web01 ansible_host=192.168.1.10 ansible_user=root web02 ansible_host=192.168.1.11 ansible_user=root [databases] db01 ansible_host=192.168.1.20 ansible_user=mysql ansible_become=yes
这样可以为不同机器指定不同的SSH用户、端口、密钥等参数。
小贴士:执行命令时用
-i参数指定你的清单文件,比如ansible -i inventory.ini all -m ping。
七、常用模块——先学会这7个
Ansible有几千个模块,但新手先掌握下面7个就够用了。
1. ping模块——测试连通性
最简单的模块,用来测试能否连接到远程主机:
bash
ansible all -m ping
返回"pong"就说明连接成功。
2. command / shell模块——执行命令
在远程主机上执行命令:
bash
# command(不支持管道、重定向等shell特性) ansible webservers -m command -a "ls -l /tmp" # shell(支持管道、重定向) ansible webservers -m shell -a "echo 'Hello' > /tmp/test.txt"
3. copy模块——复制文件
把文件从控制节点复制到远程主机:
bash
ansible webservers -m copy -a "src=/local/nginx.conf dest=/etc/nginx/nginx.conf mode=0644"
4. file模块——管理文件和目录
创建目录、修改权限、删除文件等:
bash
# 创建目录 ansible webservers -m file -a "path=/opt/myapp state=directory mode=0755" # 删除文件 ansible webservers -m file -a "path=/tmp/old.log state=absent"
5. yum / apt模块——安装软件包
安装、卸载、更新软件包:
bash
# CentOS用yum ansible webservers -m yum -a "name=nginx state=present" # Ubuntu用apt ansible webservers -m apt -a "name=nginx state=present"
6. service模块——管理服务
启动、停止、重启服务,设置开机自启:
bash
ansible webservers -m service -a "name=nginx state=started enabled=yes"
7. user模块——管理用户
创建、删除、修改用户:
bash
ansible webservers -m user -a "name=deploy state=present shell=/bin/bash"
八、Playbook——把任务写成"剧本"
如果每次只执行一条命令,那Ansible的优势还没完全发挥出来。Playbook才是Ansible的精髓。
Playbook是一个YAML格式的文件,可以把多个任务按顺序写在一起,一键执行。
第一个Playbook:Hello World
创建一个文件hello.yaml:
yaml
--- - name: 我的第一个Playbook hosts: all tasks: - name: 打印Hello信息 debug: msg: "Hello, Ansible!"
执行:
bash
ansible-playbook hello.yaml
实战Playbook:在Web服务器上部署Nginx
yaml
--- - name: 部署Nginx到Web服务器 hosts: webservers become: yes tasks: - name: 安装Nginx yum: name: nginx state: present - name: 复制配置文件 copy: src: ./nginx.conf dest: /etc/nginx/nginx.conf mode: '0644' backup: yes - name: 启动Nginx并设置开机自启 service: name: nginx state: started enabled: yes
执行后,所有在webservers组里的机器会依次完成:安装Nginx → 复制配置 → 启动服务。
九、更多实战场景——看看还能做什么
以下是一些真实的业务场景,感受一下Ansible的威力:
场景1:批量创建用户
yaml
- hosts: all become: yes tasks: - name: 创建deploy用户 user: name: deploy state: present shell: /bin/bash
几秒钟,所有机器都有了deploy用户。
场景2:批量修改主机名
yaml
- hosts: webservers become: yes tasks: - name: 设置主机名 hostname: name: "web-{{ inventory_hostname }}"不用再一台台去敲hostnamectl了。
场景3:批量安装Git
yaml
- hosts: all become: yes tasks: - name: 安装Git yum: name: git state: present
场景4:批量检查磁盘使用情况
yaml
- hosts: all tasks: - name: 检查磁盘使用情况 shell: df -h register: disk_info - debug: var: disk_info.stdout_lines
所有机器的磁盘信息一次性刷出来。
场景5:统一设置时区
yaml
- hosts: all become: yes tasks: - name: 设置时区为上海 timezone: name: Asia/Shanghai
十、小白学习路线图
给完全零基础的同学一份可执行的时间表:
| 阶段 | 内容 | 预计时间 |
|---|---|---|
| 第1天 | 安装Ansible + 学会ping模块 | 1小时 |
| 第2-3天 | 掌握Inventory配置 + 5个常用模块 | 2-3小时 |
| 第4-5天 | 写第一个Playbook + 理解YAML语法 | 2小时 |
| 第1周 | 模仿实战场景写3-5个Playbook | 3-4小时 |
| 第2周 | 学习变量、条件、循环等进阶内容 | 持续学习 |
十一、总结
Ansible并没有想象中那么复杂。现在回过头来,我们把整个知识串一遍:
ansible.cfg调整了SSH连接等基础设置;inventory.ini定义了要管理的服务器IP和分组;Playbook里写好了部署Nginx的详细步骤;
静态配置文件(如
nginx.conf)被原封不动复制过去;templates负责根据不同机器硬件动态生成配置;
handlers则确保了配置更新后Nginx能被优雅重启。
文件虽多,但各司其职,分工明确。
记住这几句话就够了:
Ansible是遥控器,能同时指挥多台服务器
被控机器啥都不用装,只要能SSH
Inventory是花名册,告诉Ansible要管哪些机器
模块是工具箱,每个模块干一件事
Playbook是剧本,把任务写成YAML一键执行
从今天开始,试着在你的测试环境里装一个Ansible,跑一个ansible all -m ping,你就已经迈出了自动化运维的第一步。
参考资源:
Ansible官方文档:https://docs.ansible.com
安装遇到问题?检查SSH是否能连通目标机器,这是99%的问题根源。
如果这篇文章帮到了你,欢迎点赞、收藏、转发,让更多小白少走弯路!😊