Ansible技术问题:如何将selectattr输出转为字典而非列表
问题:如何将Ansible中selectattr的输出转为单个字典?
场景描述
我定义了如下容器列表:
containers: - name: test1 ... - name: test2 ...
创建test1容器时,原本用lookup的方式能拿到单个字典,可直接传给docker_container模块:
- docker_container: "{{ containers[lookup('index_of', containers, 'eq', 'test1', 'name')] }}"
尝试用selectattr简化写法,但得到的是包含字典的列表而非单个字典,无法直接使用:
- docker_container: "{{ containers | selectattr('name', 'eq', 'test1') }}"
通过debug模块验证,前者输出是单个字典,后者是字典列表。尝试添加| dict和| flatten后缀均触发错误,请问怎么把selectattr的输出转为单个字典?
解决方案
直接在selectattr后追加| first过滤器,即可取出匹配到的第一个字典元素:
- docker_container: "{{ containers | selectattr('name', 'eq', 'test1') | first }}"
原理说明
selectattr的返回值是迭代器对象,会包含所有符合匹配条件的元素(在你的场景中name是唯一标识,所以仅会匹配到一个元素),本质是可迭代集合,并非单个字典。first过滤器会从迭代器中提取第一个元素,刚好得到你需要的单个字典,完全符合docker_container模块的参数要求。
补充提示
如果场景中存在多个匹配项的可能,可以先通过| list转为列表,再做长度校验或其他处理,但在你的容器列表中name作为唯一标识,直接使用first就足够满足需求。
内容的提问来源于stack exchange,提问作者Subbeh
相关产品推荐
相关产品推荐

