You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible中为字典列表生成FullName属性并追加回原列表?

解决方法

你之前的方法没达到预期,是因为set_fact用来设置Ansible全局事实变量,每次循环都会覆盖FullName的值;而且循环中的item只是原列表元素的副本,无法直接修改原字典的属性。

要给列表中的每个字典追加FullName属性,有两种常用方案:

方案1:使用过滤器一次性处理(简洁高效)

利用Ansible的map和combine过滤器,一次性遍历列表并为每个字典添加新字段:

- name: Add FullName using filters
  hosts: localhost
  vars:
    data:
      - ClassType: "Part Time"
        FirstName: "Monice"
        LastName: "Lee"
      - ClassType: "Full Time"
        FirstName: "Henry Daley"
        LastName: "Brown"
  tasks:
    - set_fact:
        updated_data: "{{ data | map(lambda x: x | combine({'FullName': x.FirstName ~ ' ' ~ x.LastName})) | list }}"
    - debug:
        var: updated_data

这里lambda x代表列表中的每个字典元素,combine用来将新的FullName字段合并到原字典中,最后用list将处理后的迭代器转为列表。

方案2:循环构建新列表(直观易懂)

通过循环逐个处理每个字典,将添加FullName后的字典收集到新列表中:

- name: Add FullName via loop
  hosts: localhost
  vars:
    data:
      - ClassType: "Part Time"
        FirstName: "Monice"
        LastName: "Lee"
      - ClassType: "Full Time"
        FirstName: "Henry Daley"
        LastName: "Brown"
  tasks:
    - set_fact:
        updated_data: "{{ updated_data | default([]) + [item | combine({'FullName': item.FirstName ~ ' ' ~ item.LastName})] }}"
      loop: "{{ data }}"
    - debug:
        var: updated_data

每次循环中,item | combine(...)会生成包含新字段的新字典,然后通过+操作符将其追加到updated_data列表中(default([])确保初始状态为空列表)。

两种方案最终都会生成符合你预期的结果,你可以选择覆盖原data变量,或者使用新的变量名存储处理后的列表。

内容的提问来源于stack exchange,提问作者Blitzden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:14:55