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

Ansible中引用注册变量设置when条件报错,如何正确判断SMBv1状态?

解决Ansible检查并禁用SMBv1时的条件判断错误

问题场景

你编写了以下Ansible Playbook,用于检查SMBv1是否启用并在启用时禁用,但在AAP中运行时触发条件判断错误:

- name: Check if SMB v1 is enabled
  ansible.windows.win_powershell:
    script: |
      Get-SmbServerConfiguration | Select EnableSMB1Protocol
  register: smbcheck

- name: Disable SMBv1 only on servers where it is enabled.
  ansible.windows.win_powershell:
    script: |
      Set-SmbServerConfiguration -EnableSMB1Protocol $false
  when: smbcheck.output.EnableSMB1Protocol

报错信息:

"The conditional check 'smbcheck.output.EnableSMB1Protocol' failed. The error was: error while evaluating conditional (smbcheck.output.EnableSMB1Protocol): 'list object' has no attribute 'EnableSMB1Protocol'"

从smbcheck的输出可以看到,output是一个包含字典的列表:

"output": [
  {
    "EnableSMB1Protocol": false
  }
]

解决方案

问题出在条件判断的取值方式上:win_powershell模块返回的output是列表类型,而非直接的字典,必须通过索引定位到列表内的字典元素后,再访问对应的键值。

修改后的Playbook如下:

- name: Check if SMB v1 is enabled
  ansible.windows.win_powershell:
    script: |
      Get-SmbServerConfiguration | Select EnableSMB1Protocol
  register: smbcheck

- name: Disable SMBv1 only on servers where it is enabled.
  ansible.windows.win_powershell:
    script: |
      Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
  when: smbcheck.output[0].EnableSMB1Protocol

关键说明

  1. 条件判断改为smbcheck.output[0].EnableSMB1Protocol,通过[0]获取列表中的第一个(也是唯一一个)字典元素,再访问EnableSMB1Protocol字段。
  2. 在Set-SmbServerConfiguration命令后添加-Force参数,避免命令执行时需要交互确认,确保自动化流程顺畅。

内容的提问来源于stack exchange,提问作者OrionUK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:00:15