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
关键说明
- 条件判断改为
smbcheck.output[0].EnableSMB1Protocol,通过[0]获取列表中的第一个(也是唯一一个)字典元素,再访问EnableSMB1Protocol字段。 - 在
Set-SmbServerConfiguration命令后添加-Force参数,避免命令执行时需要交互确认,确保自动化流程顺畅。
内容的提问来源于stack exchange,提问作者OrionUK
相关产品推荐
相关产品推荐

