首页/系统与基础设施/自动化运维速查/Jinja2 模板表达式的基础用法
Ansible 核心70 条

Jinja2 模板表达式的基础用法

Ansible 里的表达式由控制端的 Jinja2 求值,结果可通过变量引用、默认值、条件与迭代组合出来;写模板时要注意类型保留、引号规则,以及远端 shell 变量不会被提前展开。

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​‌​‌​​‌‌​​​​‌​​‌‌​​‌​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

表达式在哪儿求值

Ansible 里成对花括号包起来的内容都是 Jinja2 表达式,它会出现在任务参数、模板文件与变量定义中,求值结果可以是字符串、数字、布尔、列表或字典。基础构件只有几样:引用变量与嵌套键、条件表达式、管道过滤器、迭代与条件语句。最需要注意的是求值发生在控制端:表达式先被渲染成文本,再传给目标机执行,远端 shell 的变量不会被提前展开。

基本信息

三种分隔符双花括号取值、花括号加百分号写语句、花括号加井号写注释
常用写法变量引用、字典按键取值、默认值过滤器、条件表达式
求值位置控制端,渲染结果再下发给目标机
类型保留表达式结果保留原类型,除非显式转换

典型使用场景

  • 模板文件生成配置:变量引用配合条件块,按环境产出不同内容
  • 任务参数拼接路径与值:用表达式而不是字符串拼接,避免引号问题
  • 变量定义里按环境取不同值:用条件表达式一次写清分支
  • 遍历主机或列表生成多行内容:用迭代语句产出成组配置
  • 需要把内容整段原样下发:注意转义与求值层次,别让远端符号被提前替换

基础写法

基础写法
# templates/app.conf.j2
listen {{ app_port | default(8080) }};  # 变量缺失时用默认值
{% for host in groups['web'] %}        # 迭代分组内主机
server {{ host }}:{{ hostvars[host].app_port }};  # 跨主机取值
{% endfor %}
{% if enable_tls %}                    # 条件块决定是否输出
ssl on;
{% endif %}

写法与注意

写法含义注意
双花括号取值计算表达式并输出结果保留类型,不会强制转字符串
默认值过滤器变量未定义时用替代值会掩盖变量名拼写错误
迭代语句按列表重复输出文本注意空白与换行控制
条件语句按布尔值决定是否输出判断前先确认类型
结果本身是字符串时,表达式外面加引号会把引号一起写进结果;只有需要输出字面字符串(含空格或特殊字符)时才在表达式外补引号。
表达式在控制端完成求值,不会被目标机再解释一次。想让远端脚本自己展开某个符号,必须做好转义或改成运行时再取值,两层混淆会把远端变量提前替换成控制端的值。

调试的基本功

模板出问题先看渲染结果而不是猜语法:把表达式单独放进调试任务打印出来,确认取值与类型;再看上下文里有没有同名变量把它覆盖掉。表达式越长越容易出错,拆成中间变量再引用,既能复用也便于逐步定位。

易错点

  • 把远端 shell 变量写进表达式,被控制端提前求值,远端拿到空值
  • 用默认值过滤器掩盖变量名拼写错误,配置静默用了兜底值而无人发现
  • 忽略表达式结果类型:需要字符串时得到字典,模板输出成难读的内容
  • 迭代时在循环体内修改列表,渲染顺序与预期不一致或直接失败
  • 在任务参数里手工拼引号,嵌套引号不匹配导致 YAML 解析失败

数据来源与参考

  • Ansible 官方文档 Templating(Jinja2)
  • Jinja2 官方文档 Template Designer Documentation
  • Ansible 官方文档 Using variables

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/automation/jinja2-template-expression-basics.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌​​​​‌​‌‌‌​‌​‌​‌‌‌​‌​​​‌‌​‌‌‌‌​‌‌​‌‌​‌​‌‌​​​​‌​‌‌‌​‌​​​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌‌‌​‌‌​‌​‌​​‌‌​‌​​‌​‌‌​‌‌‌​​‌‌​‌​‌​​‌‌​​​​‌​​‌‌​​‌​​​‌​‌‌​‌​‌‌‌​‌​​​‌‌​​‌​‌​‌‌​‌‌​‌​‌‌‌​​​​​‌‌​‌‌​​​‌‌​​​​‌​‌‌‌​‌​​​‌‌​​‌​‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌‌‌​​​​‌‌‌​​​​​‌‌‌​​‌​​‌‌​​‌​‌​‌‌‌​​‌‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​‌‌‌‌​‌‌​‌‌‌​​​‌​‌‌​‌​‌‌​​​‌​​‌‌​​​​‌​‌‌‌​​‌‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​