作为运维人,你是否还在重复 SSH 登录多台服务器、手动敲命令执行部署?其实不用这么麻烦 ------Ansible 能帮你把零散操作变成自动化流程,无需复杂配置,靠 SSH 就能批量管控所有节点。这篇实操文从核心概念到真实案例,带你快速上手这个 "运维效率神器",零基础也能轻松写出可复用的自动化脚本~
控制节点192.168.163.80
被控节点192.168.163.81,82
一、Ansible简述
先不要把 Ansible 想复杂。
Ansible = 用一台机器(80),通过 SSH,去远程执行命令(81、82)
它本质做的事情只有三步:
- 控制节点(80)
- 通过 SSH 连到被控节点(81 / 82)
- 在对方机器上执行命令
Ansible 不是魔法 ,只是把平时敲的 Linux 命令批量化、自动化了。
二、必须先懂的 4 个核心概念
1、 Inventory(主机清单)
它是干嘛的?
告诉 Ansible:"我到底要管哪几台机器?"
最简单的 inventory
# hosts
[web]
192.168.163.81
192.168.163.82
意思是:
我定义了一个组,叫 web
里面有两台机器:81 和 82
测试它有没有生效
ansible web -m ping
你要理解的是:
web:主机组-m ping:不是网络 ping,是 Ansible 自己的连通测试- 成功说明:SSH 通;inventory 没问题
2、 Ad-hoc 命令(临时命令)
这是最重要的入门点。
可以把它理解为:"我懒得写脚本,就想远程敲一条命令"
示例 1:远程执行命令
ansible web -m shell -a "hostname"
拆开理解:
ansible web:对 web 组操作(81、82)-m shell:用 shell 模块(= 远程执行命令)-a:参数"hostname":真正执行的 Linux 命令
等价于你手动做:
ssh 81 hostname
ssh 82 hostname
示例 2:安装软件
ansible web -m apt -a "name=nginx state=present"
只要理解一句话:"在 81 和 82 上,确保 nginx 已安装"
3、 Playbook(自动化脚本)
当你发现:
- 命令越来越多
- 顺序很重要
你就需要 Playbook
Playbook 是什么?
用 YAML 写的"自动执行步骤说明书"
你现在只看这个最简单的 playbook
- hosts: web
tasks:
- name: show hostname
shell: hostname
我们一行一行拆:
第 1 行
- hosts: web
意思是:
这个任务,在哪些机器上执行?
web 组(81、82)
第 2 行
tasks:
意思是:接下来我要开始写 具体干什么
第 3 行
- name: show hostname
name:给人看的说明- 不影响执行
第 4 行
shell: hostname
意思是:在远程机器上执行:hostname
执行它
ansible-playbook test.yml
你现在要记住一句话:playbook = 把 ad-hoc 命令写成文件
4、 Module模块
模块 = Ansible 帮你封装好的"功能"
|---------|--------|
| 模块 | 你可以理解为 |
| shell | 执行命令 |
| apt | 安装软件 |
| copy | 拷贝文件 |
| service | 管理服务 |
举个简单的例子
- hosts: web
become: yes
# become: yes 作用是在被控节点上切换到特权用户(通常是 root)执行任务,
#相当于我们平时在命令行里用 sudo 或 su 提升权限
tasks:
- name: install nginx
apt:
name: nginx
state: present
直接翻译成人话:在 web 组的机器上;用 root 权限;确保 nginx 已安装
简单的练习案例
1、查看被控节点系统信息
- hosts: web
tasks:
- name: show hostname
shell: hostname
- name: show ip address
shell: ip a | grep inet
执行ansible-playbook sysinfo.yml
相当于手动执行:
ssh 192.168.163.81 "ip a | grep inet"
ssh 192.168.163.82 "ip a | grep inet"

2、创建目录,写入文件
目标:在被控节点上创建 目录 /opt/ansible_test,在里面写入文件 info.txt
- hosts: web
tasks:
- name: create test directory
shell: mkdir -p /opt/ansible_test
- name: write info file
shell: echo "Hello from Ansible" > /opt/ansible_test/info.txt
- name: show file content
shell: cat /opt/ansible_test/info.txt
运行成功

3、典型案例:安装 nginx
用 shell 模块
- hosts: web
tasks:
- name: install nginx by shell
shell: apt install -y nginx
表面看起来: 能跑; 能装
但问题是:
- 不知道装没装过
- 每次都会执行
- 出错不好看懂
用 apt 模块
- hosts: web
become: yes
tasks:
- name: install nginx by apt
apt:
name: nginx
state: present
update_cache: yes
update_cache: yes 这个参数的作用是,在执行 apt 安装操作前,先更新被控节点上的 apt 软件包缓存 ,也就是我们平时手动执行的 apt update 命令 。
- 先在被控节点上运行
apt update刷新缓存。 - 再运行
apt install nginx安装软件。
解释区别
shell 版本在说什么?
"不管现在什么状态 ,给我直接执行:apt install -y nginx"
apt 版本在说什么?
"我不管你现在怎么样;我只关心最终结果 :nginx 必须存在"
这就是 幂等性 (面试高频词)!是指一个操作 无论执行多少次,最终结果都是一致的,不会造成重复的副作用。

4、典型案例:拷贝文件
用 shell 模块
- hosts: web
tasks:
- name: copy file by shell
shell: cp /tmp/test.txt /opt/test.txt
容易出现问题:
- 源文件不存在就炸
- 不知道文件有没有变化
- 不知道是否需要重新执行
用 copy 模块-推荐
- hosts: web
tasks:
- name: copy file by copy module
copy:
src: test.txt
dest: /opt/test.txt
mode: 0644
解释 shell 和 copy 差别
shell:"执行 cp 命令,成功算你运气好"
copy:
如果目标文件不存在 → 创建
如果内容不同 → 覆盖
如果一样 → 什么都不做
5、体现自动化运维的案例
观察这个 yaml 文件
- hosts: web
become: yes
tasks:
- name: ensure nginx installed
apt:
name: nginx
state: present
- name: deploy index.html
copy:
content: "Hello from {{ inventory_hostname }}"
dest: /var/www/html/index.html
这个 Playbook 做了两件事:
- 在
web主机组的节点上,确保nginx已经安装。 - 生成一个包含当前节点主机名的
index.html文件,并部署到 Nginx 的默认网页目录/var/www/html/
deploy index.html
- 使用
copy模块,将content中的内容写入目标文件/var/www/html/index.html。 - 变量替换 :
{``{ inventory_hostname }}是 Ansible 的内置变量,会自动替换为当前节点的主机名(如192.168.163.81)。 - 幂等性体现 :如果文件内容没有变化,这个任务不会重复写入;只有当内容不同时,才会更新文件,状态显示为
changed
为什么说这是自动化运维的核心?
- 幂等性:重跑 10 次,结果都一样。它只会在 "需要改变" 时才执行操作,不会做无意义的重复工作,这是自动化运维的关键。
- 一致性 :无论执行多少次,最终所有节点上的 Nginx 状态和
index.html内容都是一致的,确保了集群的统一。 - 可维护性 :用 Ansible 原生模块(
apt、copy)替代了shell命令,逻辑更清晰,也更稳定
进阶理解 Ansible
Ansible = 声明式配置管理 + 批量远程执行 + 幂等保证
它和 shell 脚本的根本区别只有一句话:
你描述"最终状态",Ansible 负责"怎么达到"
1、 幂等性(Idempotent)------Ansible 的灵魂
什么叫幂等?同一个 playbook,跑 1 次和跑 100 次,结果一样
apt:
name: nginx
state: present
含义不是"安装 nginx",而是:确保 nginx 存在
- 已存在 → 什么都不做
- 不存在 → 安装
面试标准说法:"Ansible 通过模块内置的状态判断机制,实现任务的幂等执行。"
2、 become:权限控制
为什么一定要有?你做的事:
- 安装软件
- 写 /etc
- 管理服务
👉普通用户没权限
become: yes 是什么?
- hosts: web
become: yes
等价于你手动:
sudo apt install nginx
进阶一点的说法
- Ansible 默认使用 SSH 用户
- become****用于权限提升
- 默认方式是 sudo
3、 handlers:智能"只在需要时"执行
这是 Ansible 非常工程化的设计。
- hosts: web
become: yes
tasks:
- name: copy nginx config
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
handlers 的人话解释:只有配置文件发生变化,才重启 nginx
服务会在 当前 Playbook 里所有 tasks****执行完毕后 ,统一触发并执行 restart nginxhandler
- 文件没变 → 不重启
- 文件变了 → playbook 结束后统一重启
面试官为什么爱问这个?因为这代表你理解:
- 服务稳定性
- 自动化的"最小影响原则"
4、 Variables(变量):让 playbook 能复用
为什么不能写死?
- 不同环境
- 不同端口
- 不同路径
最简单变量示例
- hosts: web
vars:
app_port: 8080
tasks:
- name: show port
shell: echo {{ app_port }}
变量常见来源
- playbook 内
- inventory
- vars_files
- extra-vars(命令行)
5、 facts:Ansible 自动收集的系统信息
示例
when: ansible_distribution == "Ubuntu"
Ansible 在执行前会自动:
- 获取系统版本
- CPU / 内存
- 网卡信息
面试说法
"Ansible 通过 facts 机制自动采集主机信息,用于条件判断和动态配置。"
Ansible 执行流程(非常重要)
在脑子里形成这个顺序:
- 读取 inventory
- SSH 连接主机
- 收集 facts
- 按顺序执行 tasks
- 最后执行 handlers
完整示例
- hosts: web
become: yes
vars:
web_root: /var/www/html
tasks:
- name: install nginx
apt:
name: nginx
state: present
- name: deploy index.html
copy:
content: "Hello from {{ inventory_hostname }}"
dest: "{{ web_root }}/index.html"
notify: restart nginx
handlers:
- name: restart nginx
service:
name: nginx
state: restarted
确保 nginx 存在;部署页面;只在页面变化时重启服务