Ansible 快速上手
RHEL 9 搭 Ansible:control 与节点、ansible.cfg、inventory 主机清单,以及 ad-hoc 的 ansible ping 连通性测试。
本页目录
从这一篇起进入 RHCE / EX294 的主战场:用 Ansible 在一台机器上,批量管很多台机器。先把「架构、配置文件、主机清单、能不能 ping 通」跑通,后面的 Playbook 才有意义。
系列:从 RHCSA 到 RHCE · 第 14 / 17 篇 上一篇:Podman 容器 下一篇:Playbook 与模块 总目录:系列索引
环境说明
- 系统:RHEL 9
- 节点角色:
| 角色 | 干什么 | 示例主机名 |
|---|---|---|
| 控制端 control | 装 Ansible、写配置、发指令 | control |
| 被控端 node | 接受任务执行 | node1 node2… |
- 身份:考试常用普通用户(如
alice)并 sudo 提权;自学也可 root - 网络:control 能 SSH 到各 node
- 前置:SSH、sudo、基础命令
1. Ansible 是什么
一句话:不用一台台 SSH 手敲,用一份清单 + 一条命令/一个剧本,让多台机器自动完成同样的事。
| 特点 | 好处 |
|---|---|
| 无客户端 agent | 被控端只需 SSH + Python |
| 模块化 | 装包、建用户、改配置都有现成模块 |
| 可重复 | 同样的 playbook 可反复跑 |
| 考试核心 | EX294 基本就是写 Ansible |
和手敲 SSH 的对比:
手敲:ssh node1 'useradd tom' → ssh node2 'useradd tom' → ...
Ansible:ansible all -m user -a 'name=tom'
2. 搭实验环境(练习机常见做法)
课堂/模拟环境常用工具一键重置节点(仅练习环境):
rht-vmctl reset control
rht-vmctl reset node1
rht-vmctl reset node2
然后从管理机 SSH 过去(IP/用户以题面为准):
ssh alice@control
练习环境:
rht-vmctl、预置用户alice、免密 sudo 等是课堂机自带;公网自建环境请自己配 SSH 与 sudo。
自学最小拓扑
- 1 台 control
- 2 台 node(1 台也能做,多台更像考试)
- 全部互通,control 能
ssh 用户@nodeIP
3. 安装 Ansible
在 control 上:
sudo dnf -y install ansible-core
ansible --version
能看到版本号即可。被控端 node 一般不用装 Ansible。
4. 配置文件:ansible.cfg
它在哪
Ansible 按这个顺序找配置(找到就用):
0. 环境变量 ANSIBLE_CONFIG(最高优先,考试较少用)
1. 当前目录 ./ansible.cfg
2. 用户家目录 ~/.ansible.cfg
3. 全局 /etc/ansible/ansible.cfg
考试常要求写:
/home/alice/ansible/ansible.cfg
并且之后都 cd 到 /home/alice/ansible 再执行命令——这样才会用到你写的 cfg。
考试常用最小配置
mkdir -p ~/ansible
cd ~/ansible
vim ansible.cfg
[defaults]
inventory = /home/alice/ansible/inventory
roles_path = /home/alice/ansible/roles
collections_paths = /home/alice/ansible/collections
remote_user = alice
[privilege_escalation]
become = True
become_ask_pass = False
become_method = sudo
become_user = root
| 配置项 | 含义 |
|---|---|
| inventory | 主机清单文件在哪 |
| roles_path | 角色目录(后面 role 篇用) |
| collections_paths | 集合目录 |
| remote_user | 用哪个用户 SSH 到节点 |
| become = True | 是否提权 |
| become_ask_pass = False | sudo 是否还要输密码(练习常预设免密) |
| become_method = sudo | 提权方式 |
| become_user = root | 提权成谁 |
易错:cfg 在
/home/alice/ansible/,人却在/home执行ansible,会去读别的配置或空清单。
5. 主机清单:inventory
它是什么
一个文本文件,写清楚「有哪些机器、怎么分组」。
cd ~/ansible
vim inventory
示例:
[test01]
node1
[test02]
node2
[web]
node3
node4
[test05]
node5
[webtest:children]
web
| 写法 | 含义 |
|---|---|
| [组名] | 分组,组名自定义 |
| 组下面一行一个主机 | 主机名或 IP |
| [组:children] | 嵌套组,包含其它组 |
系统还有一个隐含组 all:清单里所有主机。
考点:inventory 路径要与 cfg 里
inventory=一致;分组名与题面完全一致。
6. 第一次连通:ansible ping
必须在有 ansible.cfg 的目录执行:
cd /home/alice/ansible
ansible all -m ping
成功示例:
node1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
解释:
| 关键字 | 含义 |
|---|---|
| SUCCESS | 连上并执行成功 |
| ping: pong | 模块正常(不是 ICMP ping,是 Ansible 探活) |
| changed: false | 没有「改变」系统状态 |
按组、按主机:
ansible node1 -m ping
ansible web -m ping
ansible test01 -m ping
错误示范:清单是空的
cd
ansible all -m ping
[WARNING]: provided hosts list is empty, only localhost is available. ...
意思:当前目录找不到你的 inventory。回到正确目录:
cd /home/alice/ansible
ls
ansible all -m ping
新手第一坑:不在
~/ansible下执行命令。养成cd ~/ansible再干活的习惯。
7. ad-hoc 模式(下一阶段的入口)
ansible 主机组 -m 模块名 -a "参数"
刚才的 ping:
ansible all -m ping
后面会大量使用 -m user、-m yum、-m copy 等。本篇先把 目录 + cfg + inventory + ping 稳住即可。
查看有哪些模块:
ansible-doc -l
ansible-doc ping
# 帮助里按空格翻页,q 退出
8. 推荐实验(约 25 分钟)
在 control 上,用户 alice(换成你的用户名):
# 1) 安装
sudo dnf -y install ansible-core
ansible --version
# 2) 目录与配置
mkdir -p /home/alice/ansible
cd /home/alice/ansible
vim ansible.cfg
# 粘贴上文最小配置(路径改成你的家目录)
# 3) 清单
vim inventory
# 至少写入 node1、node2(名称与题面/真实主机一致)
# 4) 连通性
ansible all -m ping
ansible node1 -m ping
# 5) 故意跑错目录
cd /tmp
ansible all -m ping
cd /home/alice/ansible
ansible all -m ping
期望
cd ~/ansible && ansible all -m ping有SUCCESS/pong- 在
/tmp下执行出现 hosts list is empty(或连错主机) - 回到正确目录又恢复正常
9. 速查表
| 目标 | 做法 |
|---|---|
| 装 Ansible | sudo dnf -y install ansible-core |
| 配置查找顺序 | ./ansible.cfg → ~/.ansible.cfg → /etc/ansible/ansible.cfg |
| 考试工作目录 | /home/用户/ansible(与 cfg、inventory 同级) |
| 主机清单 | cfg 的 inventory= 指向的文件 |
| 分组 | [组名];嵌套 [组:children] |
| 全部主机 | all |
| 连通测试 | ansible all -m ping |
| 查看模块 | ansible-doc -l |
考点与易错
考点:按题面写出
ansible.cfg+inventory,并ansible all -m ping全绿。 易错:工作目录不对,没用到自己的 cfg/inventory。 易错:inventory 路径写错;主机名与真实机器不一致。 易错:become=True但 sudo 未预配免密,卡在密码。 易错:把ansible ping当成网络 ICMP ping——它是模块探活。 练习环境:课堂若预装 Ansible 与 alice,只需写 cfg/inventory 并 ping。
小结
- 一台 control 管多台 node;被控端只要 SSH + Python。
- 三件套:工作目录、ansible.cfg、inventory。
- 在
~/ansible下执行;ansible all -m ping出现pong即通。 - ad-hoc 格式:
ansible 主机组 -m 模块 -a "参数"——下一篇用它和 Playbook 干活。
下一篇写 Playbook 与常用模块(user/file/yum/service/copy…)。
系列导航:总目录 · 上一篇:Podman 容器 · 下一篇:Playbook 与模块