Ansible 的 fact_path 机制通过读取目标机 /etc/ansible/facts.d/ 下的 JSON/YAML 静态文件,将自定义属性(如 project、env)注入 ansible_facts,实现免代理、可扩展的策略路由与精准自动化。

Ansible 的 fact_path 机制是实现目标机本地自定义属性采集与策略路由的关键桥梁。它不依赖远程执行脚本或外部服务,而是通过约定路径读取本地静态文件(如 JSON/YAML),让每台主机“主动声明”自身业务身份,从而支撑精准、可扩展的自动化决策。
配置 fact_path 指向本地自定义 facts 目录
默认情况下,Ansible 从 /etc/ansible/facts.d/ 加载以 .fact 或 .json 结尾的文件。你只需确保目标主机上存在该目录及合规文件:
- 在目标机创建目录:
sudo mkdir -p /etc/ansible/facts.d/ - 写入业务标识文件,例如
/etc/ansible/facts.d/app.fact:{ "project": "payment", "tier": "backend", "env": "prod", "region": "shanghai" } - 设置正确权限:
sudo chmod 644 /etc/ansible/facts.d/app.fact
无需重启服务或重装 Agent —— 下次运行 setup 或任意 playbook 时,这些字段将自动注入 ansible_facts 命名空间,如 ansible_facts['project']。
在 Playbook 中基于自定义 Facts 实现策略路由
利用采集到的字段做条件判断,可自然分流任务逻辑,避免硬编码主机分组:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 按项目选择配置模板:
- name: Deploy config template<br> template:<br> src: "{{ 'payment.conf.j2' if ansible_facts.project == 'payment' else 'user.conf.j2' }}"<br> dest: /etc/app/config.conf - 按环境控制敏感操作:
- name: Disable debug logging in prod<br> lineinfile:<br> path: /etc/app/app.conf<br> line: "log_level = ERROR"<br> when: ansible_facts.env == 'prod' - 组合多维标签做精细化匹配:
when: >-<br> ansible_facts.project == 'payment' and<br> ansible_facts.tier == 'backend' and<br> ansible_facts.region in ['shanghai', 'beijing']
统一管理与动态注入自定义 Facts
为避免人工逐台部署 facts.d 文件,可用 Ansible 自身完成初始化:
- 用
copy模块批量下发:- copy:<br> src: files/facts/{{ inventory_hostname }}.json<br> dest: /etc/ansible/facts.d/app.fact<br> owner: root<br> mode: '0644' - 或结合 CMDB 输出生成 facts 文件,再用
template动态渲染:- template:<br> src: templates/app.fact.j2<br> dest: /etc/ansible/facts.d/app.fact
其中app.fact.j2可引用hostvars[inventory_hostname]或外部变量。
验证与调试技巧
快速确认自定义 Facts 是否生效:
- 单机查看:
ansible target_host -m setup -a "gather_subset=!all filter=project,tier,env" - 批量导出所有自定义字段:
ansible all -m setup -a "fact_path=/etc/ansible/facts.d gather_subset=!all" --tree /tmp/facts_output - 在 task 中临时调试:
- debug:<br> var: ansible_facts.project<br> verbosity: 1
注意:若目标机无 Python 或路径不存在,对应 facts 将为空;建议在 play 开头加 assert 校验关键字段。


















