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
你提供的解析没有生效,还是一样的结果(输出还是数组格式)
谢谢大家
正在尝试 运行 一个简单的 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
你提供的解析没有生效,还是一样的结果(输出还是数组格式)
谢谢大家