Ansible Jinja2模板中可直接引用事实变量(如{{ ansible_hostname }}),无需ansible_facts前缀或方括号语法;嵌套结构用点号访问,template模块触发渲染,调试可用debug或setup模块验证。

在 Ansible 的 Jinja2 模板(如 .j2 文件)中,可以直接引用主机事实变量(Facts),无需额外声明或前缀 ansible_facts —— Ansible 会自动将收集到的事实注入模板上下文。
直接使用事实变量名
Ansible 会把 setup 模块采集的变量以扁平化方式暴露给 Jinja2 模板。例如:
-
{{ ansible_hostname }}→ 主机名 -
{{ ansible_memtotal_mb }}→ 总内存(MB) -
{{ ansible_distribution }}→ 操作系统发行版(如 CentOS、Ubuntu) -
{{ ansible_ens160.ipv4.address }}→ 网卡 ens160 的 IPv4 地址 -
{{ ansible_default_ipv4.gateway }}→ 默认网关
注意嵌套结构的写法
部分 Facts 是嵌套字典(如网络接口、磁盘设备),需用点号(.)逐层访问。不能用方括号语法(如 ansible_facts['ens160']['ipv4']['address'])—— Jinja2 模板中不支持这种写法,也不需要加 ansible_facts. 前缀。
错误示例:{{ ansible_facts.ens160.ipv4.address }}(多余前缀,会报错或为空){{ ansible_ens160['ipv4']['address'] }}(Jinja2 不支持嵌套方括号访问)
在 template 模块中正确调用
确保 Playbook 中使用 template 模块(而非 copy),才能触发变量渲染:
- 模板文件建议后缀为
.j2(如nginx.conf.j2),但非强制 - Playbook 示例:
template:
src: nginx.conf.j2
dest: /etc/nginx/conf.d/site.conf
调试技巧:先确认变量是否存在
若模板渲染失败或值为空,可在 Playbook 中加 debug 任务验证:
- debug: var=ansible_hostname- debug: msg="IP is {{ ansible_default_ipv4.address }}"- 再执行
ansible node -m setup -a "filter=ansible_default_ipv4"查看原始 Facts 结构


















