如何通过引用寄存器变量中的值来设置“何时”条件

问题描述 投票:0回答:1

我正在尝试运行以下任务,这些任务将检查 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,但到目前为止没有任何效果。

ansible
1个回答
0
投票

这是预料之中的。

如果您的

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
© www.soinside.com 2019 - 2024. All rights reserved.