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

Ansible中如何从字典列表提取name字段值至新列表?

问题:无法从字典列表中提取name值生成新列表

我有如下字典列表:

"dict": [ 
  {   "name": "a",   "surname": "b" }, 
  {   "name": "c",   "surname": "d" }, 
  {   "name": "e",   "surname": "f" } 
]

我想要提取其中的name值生成如下格式的新列表:

names_list: ["a","c","e"]

但尝试以下两种写法后,结果要么是none,要么提示ansible undefined:

写法1:

- set_fact: 
    names_list: "{{ dict | json_query('[*].name') }}"

写法2:

- set_fact: 
    names_list: "{{ dict | map(attribute='name') | list }}"

请问我忽略了什么?


解决办法

1. 避免变量名冲突

dict是Python内置类型的名称,用它作为Ansible变量名会导致解析异常,无法正确识别你定义的字典列表。

将变量名改为非内置名称(比如my_dict),并同步修改任务中的引用:

# 先在作用域内定义变量
vars:
  my_dict: [ 
    { "name": "a", "surname": "b" }, 
    { "name": "c", "surname": "d" }, 
    { "name": "e", "surname": "f" } 
  ]

# 写法1(需确保控制节点安装jmespath)
- set_fact: 
    names_list: "{{ my_dict | json_query('[*].name') }}"

# 写法2
- set_fact: 
    names_list: "{{ my_dict | map(attribute='name') | list }}"

2. 确认变量已正确定义

如果dict变量没有在vars、host_vars、group_vars或其他有效作用域中定义,就会触发undefined错误。

检查变量定义位置,确保它在当前任务的作用域内可访问,比如在playbook的vars块中明确声明,或通过register等方式正确赋值。

3. 安装json_query依赖

使用json_query过滤器需要依赖jmespath库,未安装会导致过滤器失效返回none。

在控制节点执行以下命令安装:

pip install jmespath

完成上述调整后,两种写法都能生成预期的names_list: ["a","c","e"]。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:12:18