我正在尝试运行以下任务,这些任务将检查 SMB 版本 1 是否已启用,如果发现已启用则将其禁用。第一个任务运行 powershell 命令并将输出注册到 smbcheck。如果发现 SMB 版本 1 已启用,第二个任务将禁用它:
- 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
smbcheck 的输出将包括以下内容:
“输出”:[ { “启用SMB1协议”: false } ]
因此,如果 EnableSMB1Protocol 为 false,我希望条件能够跳过主机。但是,当我在 AAP 中运行 playbook 时,出现以下错误:
条件检查“smbcheck.output.EnableSMB1Protocol”失败。错误是:评估条件时出错(smbcheck.output.EnableSMB1Protocol):“列表对象”没有属性“EnableSMB1Protocol”
有什么想法如何成功设置条件,以便任务仅在 smbcheck 输出的 EnableSMB1Protocol 为 True 时运行?
我尝试以不同的方式引用EnableSMB1Protocol,但到目前为止没有任何效果。
这是预料之中的。
如果您的
smbcheck
变量具有 "output": [ { "EnableSMB1Protocol": false } ]
键,则意味着 output
是一个列表,其中包含一个由一个键/值对组成的对象。
因此,将其称为
smbcheck.output[0].EnableSMB1Protocol
应该会有所帮助。
此外,有一种做法有助于避免检查值时可能出现的误解:首先检查值是否存在,然后检查值本身。鉴于
when
接受多个条件并在列出时使用逻辑 AND 将它们连接起来,以下结构提供了一种检查任何类型值的安全方法:
when:
- smbcheck.output[0].EnableSMB1Protocol is defined
- smbcheck.output[0].EnableSMB1Protocol
或者,用 Pythonic 的方式:
when: smbcheck.output[0].EnableSMB1Protocol is defined
and smbcheck.output[0].EnableSMB1Protocol