ansible 依赖 jinja2 引擎解析嵌套数据结构,通过 for 循环遍历列表字典、items() 迭代字典键值对,配合点号访问、loop.index、default 和 is defined 等语法安全展开多层变量,并支持 combine(recursive=true) 实现深合并。

Ansible 本身不直接解析嵌套数据结构,而是依靠 Jinja2 模板引擎在 template 模块或 vars 渲染阶段完成遍历与提取。关键在于正确组织 YAML 数据、选用匹配的循环/判断语法,并配合 Ansible 的变量展开机制。
用 for 循环遍历列表中的字典
当变量是形如 users: [{name: alice, uid: 1001}, {name: bob, uid: 1002}] 的列表时,在模板中可直接用 {% for user in users %} 展开:
- 每个
user是一个字典,支持点号访问(user.name)或方括号访问(user['uid']) - 若需索引,可用
loop.index0(从 0 开始)或loop.index(从 1 开始) - 避免在
with_items等旧式迭代中处理深层嵌套——它已弃用,推荐统一用loop或ansible.builtin.loop
用 if + for 处理字典嵌套结构
例如变量定义为:services: {web: {port: 80, enabled: true}, db: {port: 5432, enabled: false}}。在模板中可这样生成配置段:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 先用
{% for svc_name, svc_conf in services.items() %}迭代键值对 - 内部嵌套判断:
{% if svc_conf.enabled %}listen {{ svc_conf.port }}{% endif %} - 注意:Jinja2 的
.items()对应 Python 字典行为,Ansible 会自动将其转为可迭代对象
在任务中安全展开多层嵌套变量
YAML 中定义嵌套变量要缩进对齐,比如:
app_config:
database:
host: db.example.com
credentials:
username: admin
password: "{{ vault_db_pass }}"
在 task 中引用时,用点号逐级展开即可:
-
{{ app_config.database.host }}→ 正常取值 -
{{ app_config.database.credentials.username | default('guest') }}→ 加default过滤器防 KeyError - 若某层可能为空(如
app_config.logging未定义),务必加is defined判断,否则 Playbook 会报错中断
用 set_fact 和 combine 处理运行时嵌套合并
动态构造嵌套结构常用 set_fact 配合 combine 过滤器:
- 例如已有
base_conf和env_override两个字典,想深合并:{{ base_conf | combine(env_override, recursive=true) }} - 递归合并能保留嵌套层级,避免顶层键被简单覆盖
- 结合
json_query过滤器(需安装 jmespath)可做更灵活的路径提取,比如users | json_query('[?status==`active`].{name: name, id: id}')










