Ansible -- failed_when 未按预期工作

Ansible -- failed_when not working as expected

正在尝试 运行 一个简单的 failed_when 检查::

  - name: JunOS Commands
    junos_command:
     commands:
     - show version
     provider:
      username: zgould
    register: results
    failed_when: '"[12.3R12.4]" in results.stdout'

! ! 调试输出::

"stdout": [
    "fpc0:\n--------------------------------------------------------------------------\nHostname: KC2-SWI-SalesCloset\nModel: ex2200-48p-4g\nJUNOS Base OS boot [12.3R12.4]\nJUNOS Base OS Software Suite [12.3R12.4]\nJUNOS Kernel Software Suite [12.3R12.4]\nJUNOS Crypto Software Suite [12.3R12.4]\nJUNOS Online Documentation [12.3R12.4]\nJUNOS Enterprise Software Suite [12.3R12.4]\nJUNOS Packet Forwarding Engine Enterprise Software Suite [12.3R12.4]\nJUNOS Routing Software Suite [12.3R12.4]\nJUNOS Web Management [12.3R12.4]\nJUNOS FIPS mode utilities [12.3R12.4]"
],
"stdout_lines": [
    [
        "fpc0:",
        "--------------------------------------------------------------------------",
        "Hostname: KC2-SWI-SalesCloset",
        "Model: ex2200-48p-4g",
        "JUNOS Base OS boot [12.3R12.4]",
        "JUNOS Base OS Software Suite [12.3R12.4]",
        "JUNOS Kernel Software Suite [12.3R12.4]",
        "JUNOS Crypto Software Suite [12.3R12.4]",
        "JUNOS Online Documentation [12.3R12.4]",
        "JUNOS Enterprise Software Suite [12.3R12.4]",
        "JUNOS Packet Forwarding Engine Enterprise Software Suite [12.3R12.4]",
        "JUNOS Routing Software Suite [12.3R12.4]",
        "JUNOS Web Management [12.3R12.4]",
        "JUNOS FIPS mode utilities [12.3R12.4]"
    ]
]

}

我认为这很简单,如果 Version 出现在 std.out 中,那么它应该会失败。

这就是现在的工作方式吗?

我什至尝试使用字符串 "Peanuts",它仍然通过了...

根据你的调试输出,stdout实际上是一个数组。

您可以将语句更改为:

failed_when: '"[12.3R12.4]" in results.stdout[0]'

我的猜测是,由于 junos_command 接受多个命令,它会将每个命令的输出放在一个标准输出数组中,因此如果您指定两个命令,第二个输出将可以作为 results.stdout[1]

正确识别了错误的原因,但根本原因是您向 commands 参数提供了单元素列表:

commands:
 - show version

对于您的用例,您只需将其替换为:

commands: show version

无需更改 failed_when 中的条件即可解决问题。

@维克多杰林

就是这样。本来没注意stdout其实是一个数组。

@techraf

你提供的解析没有生效,还是一样的结果(输出还是数组格式)

谢谢大家