Ansible筛选指定用户后校验visibility值的语法错误排查
Ansible任务修正:检查指定用户的visibility值
问题背景
API返回结果如下:
ok: [myserver] => { "result": { // ... "json": [ { "active": true, "created": "2023-07-22T15:25:34+04:00", "description": "", "id": 1, "language": "en-US", "username": "mike", "visibility": "private", // ... }, { // ... }, // ... ], // ... } }
为检查username为mike的元素的visibility值是否为private,编写了如下Ansible任务:
- debug: msg="{{result.json | selectattr('username', 'equalto', 'mike') | map(attribute='visibility') == 'private'}}"
执行后返回结果:
TASK [myplaybook : debug] **************************************************** ok: [myserver] => { "msg": false }
预期返回true但实际为false,需修正语法错误。
问题原因与修正方案
错误核心在于:selectattr+map的组合返回的是列表类型,直接将列表与字符串'private'做相等判断,结果必然为false。
以下是几种可行的修正方式:
方式1:提取列表首个元素后判断
若确定username为mike的元素仅存在一个,可直接提取列表第一个元素进行比较:
- debug: msg="{{ (result.json | selectattr('username', 'equalto', 'mike') | map(attribute='visibility') | first) == 'private' }}"
方式2:判断列表是否包含目标值
若不确定匹配元素的数量,仅需确认列表中存在'private'值:
- debug: msg="'private' in (result.json | selectattr('username', 'equalto', 'mike') | map(attribute='visibility'))"
方式3:用json_query简化查询(推荐)
使用json_query可以更简洁地完成过滤与判断:
- debug: msg="{{ result.json | json_query('[?username==`mike`].visibility') | first == 'private' }}"
内容的提问来源于stack exchange,提问作者lonix
相关产品推荐
相关产品推荐

