Ansible使用when实现IF ELSE逻辑时判断结果恒为false如何解决
问题根因
- 变量命名冲突:你在
check priv任务中,先用set_fact生成了名为priv的字符串变量,又通过register: priv将整个任务的执行结果注册为同名变量。Ansible中任务注册结果的优先级更高,后续when语句里引用的priv实际是包含任务执行信息的字典对象,和字符串"privilege"比对永远返回false。 - 循环逻辑问题:你三次遍历
output12列表,且set_fact处于循环中时,变量最终只会保留最后一次循环的赋值结果,如果你需要判断所有条目的权限,现有逻辑无法覆盖全部数据。
修复方案
简化版(全局判断是否存在权限条目)
如果只需要判断整个output12列表中是否存在权限为privilege的条目,直接单任务实现即可:
- name: 计算权限标记 set_fact: is_privilege: "{{ 'privilege' in (output12 | map('split', ' ') | map('nth', 2) | list) }}" cacheable: yes
逐条目处理版
如果需要为output12的每一条都生成对应的用户信息和权限标记,用如下写法:
- name: 处理用户数据 set_fact: user_list: "{{ user_list | default([]) + [ { 'username': item.split(' ')[1], 'priv': item.split(' ')[2], 'is_privilege': item.split(' ')[2] == 'privilege' } ] }}" with_items: "{{ output12 }}" cacheable: yes
原有逻辑最小修改
如果要保留你原本的写法,只需要删除check priv任务中的register: priv配置即可,注意修改后priv变量只会存储output12最后一条拆分出的权限值。
内容的提问来源于stack exchange,提问作者Hary Aprianto Ginting
相关产品推荐
相关产品推荐

