Ansible教程:Facts 事实变量 作者:马育民 • 2026-09-27 09:51 • 阅读:10003 # 介绍 **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 ``` 内容: ```yaml --- - 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: ``` 4. 区分 **Facts** 和 **Magic Variables(魔术变量)**: - Facts:**被控主机系统信息**(ansible_facts) - Magic变量:ansible运行时/清单变量,如 `inventory_hostname`、`hostvars`、`groups`,不属于facts 原文出处:/show_1GW47heLmwH0.html