如何让Ansible的wait_for模块在首次错误时终止循环?
问题描述
我有如下Ansible任务:
- name: 测试服务器TCP连接 wait_for: host: "{{ item }}" port: 3306 timeout: 5 msg: 无法连接到 "{{ item }}",终止执行 with_items: - server1 - server2 - 其他服务器...
我希望任务在首次连接失败(比如server1连接失败)时就退出,但目前Ansible会测试所有服务器:
TASK [测试服务器TCP连接] ************************************************************************************************************************** failed: [localhost] (item=server1) => {"ansible_loop_var": "item", "changed": false, "elapsed": 3, "item": "server1", "msg": "无法连接到 \"server1\",终止执行"} failed: [localhost] (item=server2) => {"ansible_loop_var": "item", "changed": false, "elapsed": 4, "item": "server2", "msg": "无法连接到 \"server2\",终止执行"}
如何让任务在首次连接失败时立即退出?
解决方案
要实现循环中首次失败即终止任务,你可以在循环控制中添加fail_on_first_error: yes参数,该参数从Ansible 2.10版本开始支持。修改后的任务如下:
- name: 测试服务器TCP连接 wait_for: host: "{{ item }}" port: 3306 timeout: 5 msg: 无法连接到 "{{ item }}",终止执行 loop: - server1 - server2 - 其他服务器... loop_control: fail_on_first_error: yes
- 说明:这里将
with_items替换为Ansible推荐的现代循环语法loop,同时通过loop_control启用首次失败即停止的功能。当第一个服务器连接失败时,任务会立即终止,不再测试后续服务器。 - 兼容旧版本:如果你的Ansible版本低于2.10,建议升级到新版本使用上述方案;若无法升级,可将每个服务器的连接测试拆分为独立任务,并设置
any_errors_fatal: true让任意任务失败时立即终止整个play,但这种方式代码冗余度更高。
内容的提问来源于stack exchange,提问作者troubadour
相关产品推荐
相关产品推荐

