Ansible使用failed_when处理HTTP 400状态码多或条件逻辑配置问题
Ansible URI模块400状态码多允许条件逻辑处理方案
问题原因
你的逻辑判断方向错误:需求是400状态码下,只要响应包含任意一个指定合法字符串就判定为执行通过,只有两个字符串都不匹配时才判定失败。你当前写的(不匹配A 或 不匹配B)逻辑完全相反——只要任意一个字符串匹配不到就会触发失败,哪怕命中了其中一个合法字符串,也会因为不匹配另一个触发失败条件。
正确实现方式
写法1:多条件显式判断
将原逻辑中的or改为and,只有两个合法字符串都匹配不到时才触发失败:
- name: create repo uri: url: "你的接口地址" method: POST body_format: json # 其余uri参数省略 status_code: - 201 - 400 register: value changed_when: value.status == 201 failed_when: > value.status == 400 and value.content|default("") is not search("found 1st duplicate value") and value.content|default("") is not search("found 2nd duplicate value")
写法2:正则或简化写法
search方法原生支持正则语法,可以直接用|拼接多个匹配字符串,代码更简洁:
- name: create repo uri: url: "你的接口地址" method: POST body_format: json # 其余uri参数省略 status_code: - 201 - 400 register: value changed_when: value.status == 201 failed_when: > value.status == 400 and value.content|default("") is not search("found 1st duplicate value|found 2nd duplicate value")
注意事项
- 注意YAML缩进层级:
register、changed_when、failed_when是任务级参数,和uri模块同级,不要缩进进uri的参数块中。 - 给
default补充空字符串默认值default(""),可以避免响应无content字段时的语法报错。
内容的提问来源于stack exchange,提问作者Siva Subramanian
相关产品推荐
相关产品推荐

