介绍
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 优缺点与生产注意事项
优点
- 动态感知主机环境,实现一套playbook多系统兼容
- 无agent,依托setup模块远程采集
- 支持自定义facts,扩展业务信息
缺点
- 收集facts会消耗时间,几百台以上主机批量执行,建议关闭或使用gather_subset子集
- 采集需要Python(被控端必须有python2/python3;Windows需要powershell)
- facts只在本次play收集一次,任务执行过程中系统变更不会自动刷新;如需重新采集,手动调用
setup模块
```yaml
- name: 重新收集facts
ansible.builtin.setup:
```
- 区分 Facts 和 Magic Variables(魔术变量):
- Facts:被控主机系统信息(ansible_facts)
- Magic变量:ansible运行时/清单变量,如
inventory_hostname、hostvars、groups,不属于facts