如何在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
相关产品推荐
相关产品推荐

