You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:45:02