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

