目录

第三部分:事实(Facts)管理

3.1 什么是事实?

3.2 新旧格式兼容对照表

3.3 事实收集的两种控制方式

方式一:关闭事实收集

方式二:子集收集(按需采集)

3.4 自定义事实(扩展系统信息)

第一步:在受管主机创建事实文件

第二步:编写事实内容(JSON 或 INI 格式)

第三步:在 Playbook 中使用

3.5 魔法变量(Magic Variables)



第三部分:事实(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:获取清单中定义的主机名

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐