如何在Ansible列表中按名称精准获取指定项的值?
问题描述
我有如下Ansible变量列表:
awx_credentials: - name: "user1" password: "123" - name: "user2" password: "123" - name: "user3" password: "123" - name: "user4" password: "123"
原本我通过索引awx_credentials[1].name的方式获取user2的name值,任务代码如下:
- name: "My test" awx.awx.execution_environment: name: "My EE" image: "quay.io/ansible" credential: "{{ awx_credentials[1].name }}"
但如果调整列表顺序,这种索引方式就会失效。请问怎么通过搜索user2这个具体值来获取对应的name字段?
解决方案
你可以用Ansible的selectattr过滤器做精准匹配,不管列表顺序怎么变都能找到目标,修改后的任务代码如下:
- name: "My test" awx.awx.execution_environment: name: "My EE" image: "quay.io/ansible" credential: "{{ awx_credentials | selectattr('name', 'equalto', 'user2') | map(attribute='name') | first }}"
过滤器说明:
selectattr('name', 'equalto', 'user2'):从列表里筛选出name字段等于user2的条目map(attribute='name'):把筛选出来的条目里的name值单独提取出来first:取第一个匹配结果(因为你的列表里每个name都是唯一的,所以只会有一个匹配项)
另外,如果你的awx_credentials里每个name都是唯一的,还可以先把列表转成字典,后续调用更简洁:
# 先把列表转换成字典(可以放在playbook的vars部分或者单独的变量文件里) awx_credentials_dict: "{{ awx_credentials | items2dict(key_name='name', value_name='name') }}" # 任务中直接通过字典键调用 - name: "My test" awx.awx.execution_environment: name: "My EE" image: "quay.io/ansible" credential: "{{ awx_credentials_dict['user2'] }}"
这种方式适合需要多次调用不同用户name的场景,代码可读性更高。
内容的提问来源于stack exchange,提问作者Costales
相关产品推荐
相关产品推荐

