【RH294知识点汇总】第 3 章 《 管理变量和事实 》3
摘要:本文介绍Ansible事实管理,包括系统自动采集的事实信息(如主机名、IP、内存等)及其用途(自动配置、条件判断等)。对比新旧事实格式,推荐使用新格式确保兼容性。提供两种事实收集控制方式:完全关闭或按需采集子集以提升性能。详细说明如何创建和使用自定义事实文件(JSON/INI格式)扩展系统信息。最后介绍四个无需定义的魔法变量(hostvars、group_names等),用于获取主机和组信息
·
目录

第三部分:事实(Facts)管理
3.1 什么是事实?
# Ansible 自动采集的系统信息示例
ansible_facts:
hostname: web01
fqdn: web01.example.com
default_ipv4:
address: 192.168.1.10
kernel: Linux 5.10.0
memtotal_mb: 8192
processor_vcpus: 4
distribution: CentOS
distribution_version: 7.9
事实的用途:
- 📊 自动检测主机配置(无需手动输入)
- 🎯 根据系统信息动态调整配置
- 🔍 用于条件判断和日志记录
3.2 新旧格式兼容对照表
| 新格式(推荐) | 旧格式(已过时) | 含义 |
|---|---|---|
ansible_facts.hostname |
ansible_hostname |
主机名 |
ansible_facts.fqdn |
ansible_fqdn |
完全域名 |
ansible_facts.default_ipv4.address |
ansible_default_ipv4.address |
IP地址 |
ansible_facts.kernel |
ansible_kernel |
内核版本 |
ansible_facts.memtotal_mb |
ansible_memtotal_mb |
总内存 |
最佳实践: 优先使用新格式,确保未来兼容性
3.3 事实收集的两种控制方式
方式一:关闭事实收集
---
- name: 快速执行(跳过事实采集)
hosts: all
gather_facts: no # ⚡ 加速执行
tasks:
- name: 执行任务
debug: msg="跳过了事实采集"
# 手动采集
- name: 手动采集事实
setup:
filter: "ansible_os_family" # 只采集特定事实
方式二:子集收集(按需采集)
---
- name: 按需采集事实
hosts: all
gather_subset:
- hardware # 采集硬件信息
- network # 采集网络信息
- "!facter" # 排除 facter 信息
tasks:
- name: 显示 CPU 数量
debug: msg="CPU: {{ ansible_facts.processor_vcpus }}"
性能对比:
完整采集: 3-5 秒 ⏱️
子集采集: 1-2 秒 ⏱️⏱️
无采集: 0.5 秒 ⏱️⏱️⏱️
3.4 自定义事实(扩展系统信息)
第一步:在受管主机创建事实文件
# 在受管主机执行
sudo mkdir -p /etc/ansible/facts.d
# 创建自定义事实文件(必须 .fact 后缀)
sudo vi /etc/ansible/facts.d/custom.fact
第二步:编写事实内容(JSON 或 INI 格式)
{
"app_name": "myapp",
"app_version": "2.0.1",
"environment": "production",
"deploy_date": "2024-01-15"
}
或 INI 格式:
[app]
name=myapp
version=2.0.1
environment=production
deploy_date=2024-01-15
第三步:在 Playbook 中使用
---
- name: 使用自定义事实
hosts: all
gather_facts: yes
tasks:
- name: 显示自定义事实
debug:
msg: "应用版本: {{ ansible_facts.ansible_local.custom.app.version }}"
- name: 条件判断
debug:
msg: "这是生产环境"
when: ansible_facts.ansible_local.custom.app.environment == "production"
关键点:
-
✅ 文件必须在
/etc/ansible/facts.d/目录 -
✅ 文件后缀必须是
.fact -
✅ 格式仅支持 JSON 或 INI(不支持 YAML)
-
✅ 调用格式:
ansible_facts.ansible_local.分类.键
3.5 魔法变量(Magic Variables)
这四个变量在任何 Playbook 中都可用,无需定义:
1️⃣hostvars:获取受管主机的非事实变量
1️⃣group_names:查看当前主机所属的所有组
1️⃣groups:获取清单中所有主机组和主机
1️⃣inventory_hostname:获取清单中定义的主机名
更多推荐
所有评论(0)