Ansible教程:Facts 事实变量

介绍

Facts(事实):Ansible 通过 setup 模块,自动采集被管理节点的系统信息,存放在变量 ansible_facts 中,供 playbook 使用。

默认情况下,Ansible 执行 playbook 的第一个动作就是收集 facts,基于SSH在远端执行采集脚本,不需要在被控端安装agent。

作用

根据主机真实系统信息做条件判断、动态配置

例如:

  • CentOS用yum,Ubuntu用apt
  • 不同系统生成不同配置文件

两个写法

完全等价:

  • 推荐新标准:ansible_facts['distribution']
  • 旧版兼容:ansible_distribution(由 INJECT_FACTS_AS_VARS 控制是否注入顶层变量)

实战:facts条件判断(最常用)

创建playbook文件

nano playbook_facts_实战.yml

内容:

---
- name: 根据系统安装web服务
  hosts: all
  gather_facts: yes
  tasks:
    - name: RHEL系安装httpd
      yum:
        name: httpd
        state: present
      when: ansible_facts['os_family'] == "RedHat"    # 如果 redRedHathat 家族的系统,就执行 yum 安装

    - name: Debian系安装apache2
      apt:
        name: apache2
        state: present
      when: ansible_facts['os_family'] == "Debian"   # 如果 Debian 家族的系统,就执行 apt 安装

模拟执行

ansible-playbook playbook_facts_实战.yml --check -i ansible_client.ini

Facts 优缺点与生产注意事项

优点

  1. 动态感知主机环境,实现一套playbook多系统兼容
  2. 无agent,依托setup模块远程采集
  3. 支持自定义facts,扩展业务信息

缺点

  1. 收集facts会消耗时间,几百台以上主机批量执行,建议关闭或使用gather_subset子集
  2. 采集需要Python(被控端必须有python2/python3;Windows需要powershell)
  3. facts只在本次play收集一次,任务执行过程中系统变更不会自动刷新;如需重新采集,手动调用setup模块
    ```yaml
  • name: 重新收集facts
    ansible.builtin.setup:
    ```
  1. 区分 Facts 和 Magic Variables(魔术变量):
    • Facts:被控主机系统信息(ansible_facts)
    • Magic变量:ansible运行时/清单变量,如 inventory_hostname、hostvars、groups,不属于facts

原文出处:/show_1GW47heLmwH0.html